一、要求
二、思路
0、效果图
1、实现基本的太阳系
采用局部变换的思路完成,实现太阳、地球、月亮及轨道的绘制
2、宇宙中加入一盏泛光(方向光)
加入思路:
1)设置好物体的法向
在这里可以不进行设置,因为在OpenGL是一个状态机中,如果不进行设置,则使用默认值
2)打开光照
3)设置光照参数
注意其实光照参数可以设置在打开光照之前,因为OpenGL是一个状态机,另外对于方向光需要注意,其位置向量w设置应设为0.0
4)材质参数
设置光照下物体的颜色
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT);
3、设置自发光
glMaterialfv(GL_FRONT,GL_EMISSION, vEmission);//太阳自发光
glutSolidSphere(sunR, 100, 100); //画太阳
glMaterialfv(GL_FRONT,GL_EMISSION, vEmission2);//改变材质参数,使之后的物体不自发光
注意在画太阳之前,设置vEmission为自己想要其发光的颜色值,设置完后,再将vEmission2设置回默认值,则后面物体就不回自发光
4、加入一艘飞碟,飞碟沿椭圆轨道绕地球运行
此处用球体代表飞碟,要使飞碟绕椭圆轨道飞行,则要设定一个椭圆方程,使得飞碟始终可以绕以地球为坐标中心的点,在xoz平面上进行旋转,参考椭圆方程中x,y的求解极坐标方法,可假设以下变量:
GLfloata = 1.0f;//椭圆长半轴
GLfloatb = 0.35f;//椭圆短半轴
GLfloatt = 0.0f;//卫星旋转角度
GLfloatsateX = a *cos(t * pi); //卫星x
GLfloatsateZ = b *sin(t * pi); //卫星z
要改变卫星的x,z,则在定时器回调函数中,不断的增加卫星旋转角度t
5、使飞碟上有一个spot light(点光源)始终照耀地球
要达到这个效果,就是把点光源的坐标设置为卫星的坐标,而光源的方向,即从卫星射向地球。此处有一个难点是点光源的坐标和光源方向设置语句在何处执行,我在刚开始实现的时候,一直以为在display()函数开始部分中的光源参数设置那块放此语句即可,但是没有效果,开始我一度以为我自己写的代码没有设置出点光源,于是我参考他人点光源的demo,发现自己并没错,于是我更改点光源的位置为固定值,检测是否我设定出了点光源,经过测试,我发现设置语句并没有错,但是为什么我没有设置出点光源呢?我思考点光源的位置可能不对,虽然我设置的坐标值为卫星的x,卫星的z,但实际上由于我的语句写在开头,其x,z所在坐标系,还是没有发生很多几何变换的坐标系,因此我的x,z值设置不正确,于是我将其放入在生成卫星代码模块,功能才得以实现,不得不说,OpenGL中的坑,实在是太多了。
三、遇到的问题与思考
1、光照计算各种参数的设置的问题
在设置光照计算的各函数的参数时,刚开始感觉难度很大,因为有些函数的参数,采用的是指针(以PPT上给出的),并不是枚举类型,故对值设置为几个,数值的含义摸不清,因此刚开始就经常baidu查它们参数如何设置,这是一个难点。
2、设置自发光遇到的问题
开始设置自发光问题时,会发现明明只想设置太阳的自发光,但是其他物体也会发生自发光,这如何解决呢?对于这个问题,我想既然OpenGL是状态机,如果不设置则用其默认值,因此我在设置完太阳的自发光后,将其设回默认值就好了。。
3、轨道会受光照的影响
显然,轨道不应该受光照的影响,但它却被光照所影响,因此如何才能使光照不作用于不需要的物体呢?在不需要受光照的物体前加入
glDisable(GL_LIGHTING);在绘制完该物体之后,加入glEnable(GL_LIGHTING);打开光照即可
4、点光源的设置
如功能5所述,在此强调的是对于初次接触光源的小白来说,这块的设置一定要考虑到几何变换后的坐标系。
四、参考资料
1、已知椭圆方程,怎么求取对应的X,Y坐标
/question/331764546446076605.html
2、OpenGL中创建聚光灯的效果/Haohan_Meng/article/details/42245799?utm_source=blogxgwz2
3、OpenGL聚光灯光照没有出现的问题
/topics/38089
五、源代码
CSDN下载链接