C/C++编程日记:C++ 实现太阳系行星项目系统

项目简介:使用 C++实现 OpenGL GLUT 实现一个简单的太阳系行星系统,将涉及一些三维图形技术的数学基础、OpenGL 里的三维坐标系、OpenGL 里的光照模型、GLUT 的键盘事件处理。

OpenGL 包含了很多渲染函数,但是他们的设计目的是独立于任何窗口系统或操作系统的。因此,它自身并没有包含创建打开窗口或者从键盘或鼠标读取时间的函数,甚至连最基本的显示窗口的功能都没有,所以单纯只使用 OpenGL 是完全不可能创建一个完整的图形程序的。并且绝大多数程序都需要与用户进行交互(响应键盘鼠标等操作)。GLUT 则提供了这一便利。

 

C/C++编程日记:C++ 实现太阳系行星项目系统_第1张图片

GLUT 其实是 OpenGL Utility Toolkit 的缩写,它是一个处理 OpenGL 程序的工具库,主要负责处理与底层操作系统的调用及 I/O操作。使用 GLUT 可以屏蔽掉底层操作系统 GUI 实现上的一些细节,仅使用 GLUT 的 API 即可跨平台的创建应用程序窗口、处理鼠标键盘事件等等。

整个天体系统中,他们都是一颗星球(Star),区别行星和恒星只需要通过它们是否具有父节点即可;其次,对于不同的星球而言,它们通常具有自身的材质,并且不同的材质会表现出自身是否发光,由此我们有了初步的对象模型。故我们将星球分为:普通能够自转并绕某个点公转的星球(Star), 具有特殊材质的星球(Planet), 能够发光的星球(LightPlanet)。

 

C/C++编程日记:C++ 实现太阳系行星项目系统_第2张图片

一、编程模型假设:

星球的运行轨道为圆形;

自转速度保持相同;

每次刷新绘制的时候假设时间经过了一天。

二、整体思路:

初始化星球对象;

初始化 OpenGL 引擎, 实现 onDraw 和 onUpdate;

星球应该自己负责处理自己的属性、绕行关系、变换相关绘制,因此在设计星球的类时应该提供一个绘制 draw() 方法;

星球也应该自己处理自己自转公转等更新显示的绘制,因此在设计星球类时候也应该提供一个更新方法 update();

在 onDraw() 中应调 用星球的 draw() 方法;

如果你在学习C/C++的过程中遇到了问题,可以来加入小编的企鹅圈问小编哦~小编很热情的(●’◡’●)更有免费资料和直播课程等你,满满的干货哦!

在 onUpdate() 中调用星球的 update() 方法;

在 onKeyboard() 键盘调整整个太阳系的显示.

三、 每个星球而言,都具有如下的属性:

颜色 color

公转半径 radius

自转速度 selfSpeed

公转速度 speed

距离太阳中心的距离 distance

绕行的星球 parentStar

当前的自转的角度 alphaSelf

当前的公转角度 alpha

因此有如下的类:

 

C/C++编程日记:C++ 实现太阳系行星项目系统_第3张图片

在太阳系中,太阳系显然是由各个行星组成的;并且,对于太阳系而言,太阳系中行星运动后的视图刷新应该由太阳系来完成。据此太阳系成员变量应为包含行星的变量,成员函数应作为处理太阳系内的视图刷新及键盘响应等事件,所以,我们可以设计  SolarSystem  类:

 

C/C++编程日记:C++ 实现太阳系行星项目系统_第4张图片

程序的基本框架:main.cpp

C/C++编程日记:C++ 实现太阳系行星项目系统_第5张图片

运行的效果如下图所示:

C/C++编程日记:C++ 实现太阳系行星项目系统_第6张图片

提示

单缓冲,是将所有的绘图指令在窗口上执行,就是直接在窗口上绘图,这样的绘图效率是比较慢的,如果使用单缓冲,而电脑处理性能不够,屏幕会出现闪烁状。

双缓冲,会将绘图指令是在一个缓冲区完成,这里的绘图非常的快,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,进而避免出现绘图的不完整,效率很高。

双缓冲则主要分为前台缓冲和后台缓冲,前台缓冲即我们说看到的屏幕,后台缓冲则维护内存中,对用户不可见。使用双缓冲时所有绘图操作都会在后台进行,当完成绘制后,才会将结果复制到屏幕上。

这么做的好处是,如果我们让绘制操作实时与显卡进行操作,当绘制任务复杂时,IO 操作同样会变得复杂,造成性能较低;而双缓冲只会在交换缓冲区时将绘制完成后的结果直接发送给显卡进行渲染,IO 显著降低。

 

你可能感兴趣的:(C++,c++,太阳系行星项目,知识分享,项目开发,原理讲解)