当前位置:文档之家› 计算机图形学实验——真实感图形场景的生成

计算机图形学实验——真实感图形场景的生成

实验四 真实感图形的生成
一、 实验内容
 创建一个简单场景
 场景中有一个复杂的三维几何体
 通过一系列处理使得场景和几何体具有真实感
 可以通过变换视点观察场景

二、 程序结构
创建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()函数,代码截图如下:
四、 结果

相关主题