C++ 语言基础 C++ 语言基础 C++ 语言基础 C++ 语言基础
OpenGL 包含了很多渲染函数,但是他们的设计目的是独立于任何窗口系统或操作系统的。因此,它自身并没有包含创建打开窗口或者从键盘或鼠标读取时间的函数,甚至连最基本的显示窗口的功能都没有,所以单纯只使用 OpenGL 是完全不可能创建一个完整的图形程序的。并且绝大多数程序都需要与用户进行交互(响应键盘鼠标等操作)。GLUT 则提供了这一便利。GLUT 其实是 OpenGL Utility Toolkit 的缩写,它是一个处理 OpenGL 程序的工具库,主要负责处理与底层操作系统的调用及 I/O操作。使用 GLUT 可以屏蔽掉底层操作系统 GUI 实现上的一些细节,仅使用 GLUT 的 API 即可跨平台的创建应用程序窗口、处理鼠标键盘事件等等。
先安装GLUT sudo apt-get update && sudo apt-get install freeglut3 freeglut3-dev
OOP 编程中首先要梳理清楚我们要处理的对象是什么。显然整个天体系统中,他们都是一颗星球(Star),区别行星和恒星只需要通过它们是否具有父节点即可;其次,对于不同的星球而言,它们通常具有自身的材质,并且不同的材质会表现出自身是否发光,由此我们有了初步的对象模型。故我们将星球分为:普通能够自转并绕某个点公转的星球(Star), 具有特殊材质的星球(Planet), 能够发光的星球(LightPlanet)
此外,为了编程实现上的方便,我们要对现实世界的实际编程模型做一些前提假设:
星球的运行轨道为圆形; 自转速度保持相同; 每次刷新绘制的时候假设时间经过了一天。 首先,我们可以考虑按下面的思路整个实现逻辑:
初始化星球对象; 初始化 OpenGL 引擎, 实现 onDraw 和 onUpdate; 星球应该自己负责处理自己的属性、绕行关系、变换相关绘制,因此在设计星球的类时应该提供一个绘制 draw() 方法; 星球也应该自己处理自己自转公转等更新显示的绘制,因此在设计星球类时候也应该提供一个更新方法 update(); 在 onDraw() 中应调 用星球的 draw() 方法; 在 onUpdate() 中调用星球的 update() 方法; 在 onKeyboard() 键盘调整整个太阳系的显示. 进一步,对于每个星球而言,都具有如下的属性:
颜色 color 公转半径 radius 自转速度 selfSpeed 公转速度 speed 距离太阳中心的距离 distance 绕行的星球 parentStar 当前的自转的角度 alphaSelf 当前的公转角度 alpha
参考:D Shreiner. OpenGL 编程指南 实验楼实现C++ 实现太阳系行星系统