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

更新时间:2024-03-22 07:52:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验四 真实感图形的生成

一、 实验内容

? ? ? ?

创建一个简单场景

场景中有一个复杂的三维几何体

通过一系列处理使得场景和几何体具有真实感 可以通过变换视点观察场景

二、 程序结构

创建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()函数实现地球仪旋转角度的步长增加,代码截图如下:

本文来源:https://www.bwwdw.com/article/38a8.html

Top