计算机图形学实验——真实感图形场景的生成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四真实感图形的生成
一、实验内容
⏹创建一个简单场景
⏹场景中有一个复杂的三维几何体
⏹通过一系列处理使得场景和几何体具有真实感
⏹可以通过变换视点观察场景
二、程序结构
创建Win32 Console Application,使用OpenGL的控制台应用程序框架。其中:
•init()函数进行场景初始化工作;
•reshape(GLsizei width, GLsizei height)函数设置窗口的视口大小,同时设置透视深度和透视角度等参数;
•display()函数构建坐标系并通过调用具体的绘制图形函数来绘制具体场景和几何图形;
•LoadBMP()函数导入纹理位图文件;
•LoadTexture()函数加载纹理到内存空间中;
•generateShadow(GLfloat shadow[4][4], const GLfloat ground[4], const GLfloat light[4])函数来计算空间中物体上任意一点的平面阴影
投射矩阵
•keyboard(unsigned char key, int x, int y)函数处理键盘按键消息;
•mouseButton(int button, int state, int x, int y)函数处理鼠标按键消息;
最后由主函数main(int argc, 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(GLfloat shadow[4][4], const GLfloat ground[4], const GLfloat light[4])来实现该矩阵的计算,代码截图如下:
然后在display()函数中调用上面的函数计算出地球仪模型的阴影投射矩阵,然后与模型矩阵进行相乘,进而绘制模型的阴影,代码截图如下:
6.场景初始化参数设置,重绘窗口及视点设置
在init()函数中首先清除屏幕颜色和深度缓存,然后设置明暗处理和启用光照等参数,进行整个场景的初始化设置,代码截图如下:
在reshape(GLsizei width, GLsizei height)函数中设置视点的初始位置,以及透视投影的深度和角度,代码截图如下:
7.键盘按键、鼠标按键消息处理
编写keyboard()函数处理键盘按键消息,对相关参数变量修改其步长,最后调用glutPostRedisplay()函数进行重绘窗口,部分代码截图如下:
编写mouseButton()函数处理鼠标按键消息,通过鼠标左键可控制地球仪是否自动绕地轴旋转,在此之前编写myIdle()函数实现地球仪旋转角度的步长增加,代码截图如下:
8.执行main()函数,代码截图如下:
四、结果