实验四真实感图形的生成一、实验内容创建一个简单场景场景中有一个复杂的三维几何体通过一系列处理使得场景和几何体具有真实感可以通过变换视点观察场景二、程序结构创建Win32ConsoleApplication,使用OpenGL的控制台应用程序框架。其中:init()函数进行场景初始化工作;reshape(GLsizeiwidth,GLsizeiheight)函数设置窗口的视口大小,同时设置透视深度和透视角度等参数;display()函数构建坐标系并通过调用具体的绘制图形函数来绘制具体场景和几何图形;LoadBMP()函数导入纹理位图文件;LoadTexture()函数加载纹理到内存空间中;generateShadow(GLfloatshadow[4][4],constGLfloatground[4],constGLfloatlight[4])函数来计算空间中物体上任意一点的平面阴影投射矩阵keyboard(unsignedcharkey,intx,inty)函数处理键盘按键消息;mouseButton(intbutton,intstate,intx,inty)函数处理鼠标按键消息;最后由主函数main(intargc,char**argv)中调用OpenGL函数来显示窗口,并进行绘图和处理事件消息函数。三、代码说明1.加载位图纹理首先,编写LoadBMP()函数导入位图文件,代码截图如下:然后,编写LoadEarthTexture()函数加载导入的位图并设置相关参数,代码截图如下:2.绘制房间场景在drawScene()函数中调用OpenGL基本几何元素绘制过程glBegin(GL_QUADS)绘制4个平面,并为每个平面绑定相应的纹理图片,主要代码截图如下:3.绘制地球仪模型编写drawEarth()函数绘制地球仪模型,并为地球仪模型绑定对应的纹理贴图,同时增加光照和材质的处理,代码截图如下:4.绘制模拟点光源编写drawBulb()函数绘制模拟点光源及灯罩,首先调用glBegin(GL_TRIANGLE_STRIP)绘制4个三角形面构成棱锥形灯罩的4个侧面,然后调用gluSphere()函数绘制球形灯泡并增加光照和材质处理效果,代码截图如下:5.生成阴影根据点光源、物体上的任意一点、物体在平面上的投影点“三点共线”的几何原理,以及投影点在平面上的位置关系,通过平面方程求得其法向量,然后利用点光源和物体上一点的坐标进行计算,得出物体上该点的平面阴影投射矩阵。因此编写generateShadow(GLfloatshadow[4][4],constGLfloatground[4],constGLfloatlight[4])来实现该矩阵的计算,代码截图如下:然后在display()函数中调用上面的函数计算出地球仪模型的阴影投射矩阵,然后与模型矩阵进行相乘,进而绘制模型的阴影,代码截图如下:6.场景初始化参数设置,重绘窗口及视点设置在init()函数中首先清除屏幕颜色和深度缓存,然后设置明暗处理和启用光照等参数,进行整个场景的初始化设置,代码截图如下:在reshape(GLsizeiwidth,GLsizeiheight)函数中设置视点的初始位置,以及透视投影的深度和角度,代码截图如下:7.键盘按键、鼠标按键消息处理编写keyboard()函数处理键盘按键消息,对相关参数变量修改其步长,最后调用glutPostRedisplay()函数进行重绘窗口,部分代码截图如下:编写mouseButton()函数处理鼠标按键消息,通过鼠标左键可控制地球仪是否自动绕地轴旋转,在此之前编写myIdle()函数实现地球仪旋转角度的步长增加,代码截图如下:8.执行main()函数,代码截图如下:四、结果