计算机图形学课程设计(2)

2020-02-20 20:59

计算机图形学课程设计报告

2.其中,设置雾气起始位置与结束位置可以使雾气浓度随运动模型变化。 3.效果对比

(未使用雾化) (使用雾化)

4.实验存在不足之处,由于本实验的场景绘制不是特别接近真实感,所以雾化模型的效果不是很好。

6.运动模型建立过程

1.本次实验的运动模型主要由键盘按键响应发生。 2. 设定键盘按键响应函数

voidspecialKeyBoard(intkey,intx,int y)

在主函数入口设定设置当前窗口的特定键的回调函数 glutSpecialFunc(specialKeyBoard);

计算机图形学课程设计报告

glTranslatef(0,0,0.1+delta_v);//表示将当前图形向x轴平移0,向y轴平移0,向z轴平移0.1+delta ,表示物体在这个坐标的时候开始绘制。

glutPostRedisplay();在图像绘制的所有操作之后,

要加入glutPostRedisplay()函数来重绘图像。实现物体的移动

glRotatef(1,0,1,0); //,旋转角度函数,表示小车往(0,1,0)向量方向逆时针旋转1°

以上都是控制小车运动的函数,通过键盘响应来触发。

(向前运动)(旋转)

7.纹理贴图过程

①载入位图图像:

AUX_RGBImageRec *LoadBMP(CHAR *Filename) //载入位图图象 { }

FILE *File=NULL; //文件句柄

if (!Filename) //确保文件名已提供 { }

File=fopen(Filename,\); //尝试打开文件 if (File) //判断文件是否存在? { }

returnNULL; //如果载入失败,返回 NULL

fclose(File); //关闭句柄

returnauxDIBImageLoadA(Filename); //载入位图并返回指针 returnNULL; //如果没提供,返回 NULL

②位图转化成纹理:

intLoadGLTextures() //载入位图(调用上面的代码)并转换成纹理 {

int Status= FALSE; //状态指示器

计算机图形学课程设计报告

AUX_RGBImageRec *TextureImage[2]; //创建纹理的存储空间 memset(TextureImage,0,sizeof(void *)*1);//将指针设为 NULL

//载入位图,检查有无错误,如果位图没找到则退出 if

((TextureImage[0]=LoadBMP(\))&&(TextureImage[1]=LoadBMP(\\))) {

Status= TRUE; //将Status设为TRUE glGenTextures(2, &texture[0]); //创建纹理

for(int loop=0;loop<2;loop++) {

glBindTexture(GL_TEXTURE_2D,texture[loop]);//绑定纹理

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//设置滤波 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX,

TextureImage[loop]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);//生成纹理 } }

for (int loop=0; loop<2; loop++) { }

return Status;//返回 Status

if (TextureImage[loop]!=NULL) //判断纹理是否存在 { }

if (TextureImage[loop]->data!=NULL) //纹理图像是否存在 { }

free(TextureImage[loop]); //释放图像结构

free(TextureImage[loop]->data); //释放纹理图像占用内存

}

③调用纹理

glBindTexture(GL_TEXTURE_2D, texture[0]); //选择纹理 glBegin(GL_QUADS);//开始绘制四边形

glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.0f, 1.5f, 0.0f); // 纹理和四边形的右下 glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.0f, 2.5f, 0.0f); // 纹理和四边形的右上 glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f, 2.5f, 1.0f); // 纹理和四边形的左上 glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.0f, 1.5f, 1.0f); // 纹理和四边形的左下 glEnd();

模型解读

(1)创建纹理图像:OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这

计算机图形学课程设计报告

个条件,这个纹理图片才是有效的。一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生成一个纹理贴图:

①glGenTextures(2, &texture[0]):创建纹理对象

②glBindTexture(GL_TEXTURE_2D,texture[loop]):绑定纹理对象

③glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY,

0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data):将Pixels数组中的像素值传给当

前绑定的纹理对象,于是便创建了纹理。glTexImage函数的参数分别是纹理的类型,纹理的等级,每个像素的字节数,纹理图像的宽度和高度,边框大小,像素数据的格式,像素值的数据类型,像素数据。

(2)纹理滤镜:在纹理映射的过程中,如果图元的大小不等于纹理的大小,OpenGL便会对纹理进行缩放以适应图元的尺寸。我们可以通过设置纹理滤镜来决定OpenGL对某个纹理采用的放大、缩小的算法。调用glTexParameter来设置纹理滤镜。如:

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//设置放大滤镜 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//设置缩小滤镜

(3)纹理坐标:要使用当前的纹理绘制图元,我们必须在绘制每个顶点之前为该顶点指定纹理坐标。只需调用glTexCoord2d(s:Double;t:Double);函数即可。其中,s、t是对于2D纹理而言的s、t坐标。对于任何纹理,无论纹理的真正大小如何,其顶端(左上角)的纹理坐标恒为(0,0),右下角的纹理坐标恒为(1,1)。也就是说,纹理坐标应是一个介于0到1之间的一个小数。

纹理贴图前后对比效果见图5。

纹理贴图前纹理贴图后

五、 成果展示

本次实验将两个模型进行改造,实现了一辆简单的小车以及一艘简单的帆船。

计算机图形学课程设计报告

(小车模型)

(帆船模型)

六、 心得体会


计算机图形学课程设计(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:全新版大学英语(第二版)综合教程2课文及翻译

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: