700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【OpenGL】光照太阳系

【OpenGL】光照太阳系

时间:2022-01-19 17:15:19

相关推荐

【OpenGL】光照太阳系

一、要求

二、思路

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下载链接

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。