计算机图形学课程设计
更新时间:2024-03-05 08:28:01 阅读量: 综合文库 文档下载
计算机图形学课程设计报告
《计算机图形学》实验报告
题目:3D真实感场景绘制 姓名: 郭继杰 学号: 2014214168 班级: 地信141 学院: 理学院
指导老师: 解山娟 日期: 2017年1月1日
计算机图形学课程设计报告
一、 实验目的
结合一学期所学计算机图形学知识,基于专业背景,使用OpenGL绘制简单的3D真实感图形场景。 二、 实验要求
应用光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中,其中真实感场景绘制包括颜色模型、纹理模型、雾化模型、运动模型以及环境光、漫反射、镜面反射等光照模型设置。 三、 实验小组及任务分工
小组成员 金城 郭继杰 沈黎达 任务分工 纹理贴图,颜色模型,雾化模型 运动模型,光照模型 材料收集,代码整合 四、 实验内容 1.实验前期工作
前期工作经过小组成员充分讨论,资料收集,最终确定小组实验模板为以下两幅场景。目标是实现一艘简单3D帆船模型以及一辆3D小车模型
2.程序编译环境:Visual Studio 2012
计算机图形学课程设计报告
3.光照模型建立过程
光照模型建立流程图:
3.1设置光照模型相应指数
3.2打开光源
光照模型设计过程有两点注意的是:
1、glShadeModel函数用于控制opengl中绘制指定两点间其他点颜色的过渡模式,参数一般为GL_SMOOTH、GL_FLAT,如果两点的颜色相同,使用两个参数效果相同,如果两点颜色不同,GL_SMOOTH会出现过渡效果,GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点。
计算机图形学课程设计报告
glShadeModel(GL_FLAT)着色模式 glShadeModel(GL_SMOOTH)着色模式
(可以看出GL_SMOOTH模式下颜色更加光滑)
2、需要使用光照模型时必须启用,glEnable(GL_LIGHTING)(启用灯源)、glEnable(GL_LIGHT0)(启用光源),否则所有灯光效果都会无效。效果对比如下图所示。
(未启用灯光) (启用灯光)
(未启用灯光) (启用灯光)
计算机图形学课程设计报告
4.颜色模型建立过程
1.设定多边形图形:OpenGL利用glBegin()函数画图形样式,里面的参数表示图形样式,这里以glBegin(GL_QUADS)为例,GL_QUADS表示绘制由四个顶点组成的一组单独的四边形。
2.设定颜色:OpenGL利用glColor3f(a,b,c)函数设置图形颜色,里面的参数表示设定颜色的颜色。
3.坐标设定:OpenGL利用glVertex3f(a,b,c)函数设置图形坐标,里面的参数表示坐标的位置。 以跑道颜色模型为例:
(未使用颜色模型)
(使用颜色模型)
5.雾化模型建立过程
雾是生活中比较常见的现象,有了雾化模型,场景会比较逼真。
1.建立过程及参数设定如下:
计算机图形学课程设计报告
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。
纹理贴图前纹理贴图后
五、 成果展示
本次实验将两个模型进行改造,实现了一辆简单的小车以及一艘简单的帆船。
计算机图形学课程设计报告
(小车模型)
(帆船模型)
六、 心得体会
计算机图形学课程设计报告
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); //打开环境光 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); //打开漫反射光 glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); //镜面反射光
glShadeModel(GL_SMOOTH); //明使用哪种着色技术,可以取值GL_FLAT和GL_SMOOTH。默认取值是GL_SMOOTH。
glEnable(GL_LIGHTING); //启用灯源
glEnable(GL_LIGHT0); //启用光源,必须启用,否则光照模型无效
glClearColor(1.0, 1.0,1.0,1.0); //glClear利用glClearColor函数设置好的当前清除颜色设置窗口颜色 glMatrixMode (GL_PROJECTION); glLoadIdentity ();
glOrtho(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0);
glMatrixMode (GL_MODELVIEW); glLoadIdentity ();
glMatrixMode (GL_MODELVIEW); glGetFloatv(GL_MODELVIEW_MATRIX, M); glMatrixMode (GL_MODELVIEW); }
int main(intargc, char** argv) {
intbody_menu,wheel_menu,main_menu;
//cout<<\操作规则:(上下左右键控制汽车运动方向,a/k控制加速减速)\ glutInit(&argc,argv); glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST); //启用深度测试。
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(500,500); glutInitWindowPosition(150,150); glutCreateWindow(\); init();
glColorMaterial(GL_FRONT,GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glutSpecialFunc(specialKeyBoard); glutReshapeFunc(myReshape); glutDisplayFunc(mydisplay);
body_menu=glutCreateMenu(color_car_body_menu); glutAddMenuEntry(\,1); glutAddMenuEntry(\,2); glutAddMenuEntry(\,3);
计算机图形学课程设计报告
glutAddMenuEntry(\,4); glutAddMenuEntry(\,5);
wheel_menu=glutCreateMenu(color_car_wheel_menu); glutAddMenuEntry(\,1); glutAddMenuEntry(\,2); glutAddMenuEntry(\,3); glutAddMenuEntry(\,4); glutAddMenuEntry(\,5);
main_menu=glutCreateMenu(menu);
glutAddSubMenu(\,body_menu); glutAddSubMenu(\,wheel_menu);
glutAttachMenu(GLUT_RIGHT_BUTTON); }
glutMainLoop();//程序运行函数,glutMainLoop()。 return 0;
glutAddMenuEntry(\,3);
2. 帆船模型
#include
#pragmacomment(lib, \) #pragmacomment(lib, \) #pragmacomment(lib, \)
staticint shoulder1 = 0; staticint shoulder2 = 0; staticint hand=0; staticint turn1=0; staticint tag=0;
staticint turn=0 ; //转弯 staticfloat forward=0;//前进
计算机图形学课程设计报告
staticfloat elbow = 0 ,z=0; int w; int h;
int font=(int)GLUT_BITMAP_8_BY_13; char s[30];
intframe,timeOwn,timebase=0;
staticGLfloatxRot = 0.0f; staticGLfloatyRot = 0.0f; //是否停止转动
boolIsStop = false; //光照使用光源
GLfloatlightPos[] = { 1.0f, 0.0f, -1.0f, 0.0f };
GLfloat specular[] = { 1.0f, 1.0f, 1.0f, -1.0f};//反射光 GLfloatspecref[] = { 1.0f, 1.0f, 1.0f, 1.0f };//
GLfloatambientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f};//环绕光 GLfloatspotDir[] = { 0.0f, 0.0f, -1.0f }; GLbooleanbEdgeFlag = true;
GLfloatfogcolor[]={0.5f,0.7f,0.5f,1.0f};
voidshowText(void);
voidresetPerspectiveProjection() ; voidsetOrthographicProjection() ; void Something();
voidrenderBitmapString(float x, float y, void *font,char *string); //设置背景
voidSetupRC(void) {
glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,ambientLight); glLightfv(GL_LIGHT0,GL_SPECULAR,specular); glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,30.0f); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,20.0f); glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glMaterialfv(GL_FRONT, GL_SPECULAR,specref); glMateriali(GL_FRONT, GL_SHININESS,8);
计算机图形学课程设计报告
glClearColor(1.0f, 1.0f, 1.0f, 1.0f ); }
GLuint texture[2]; // 存储一个纹理 AUX_RGBImageRec *LoadBMP(CHAR *Filename) // 载入位图图象 {
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供 {
returnNULL; // 如果没提供,返回 NULL }
File=fopen(Filename,\); // 尝试打开文件 if (File) // 文件存在么? {
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);//生成纹理
}
计算机图形学课程设计报告
} }
voidDrawCube(void) // 从这里开始进行所有的绘制 {
glLoadIdentity(); // 重置当前的模型观察矩阵 glRotatef(xRot,1.0f,0.0f,0.0f); // 绕X轴旋转 glRotatef(yRot,0.0f,1.0f,0.0f); // 绕Y轴旋转 glTranslatef(0.0f,0.0f,-10.0f); // 移入屏幕 5 个单位 glColor3f(1.0,1.0,0.0); glPushMatrix();
glTranslatef (forward,0.0,z);
glRotatef ((GLfloat) turn, 0.0, 1.0, 0.0);
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();
glBindTexture(GL_TEXTURE_2D, texture[1]); // 选择纹理 glBegin(GL_QUADS); // 左面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.0f, 1.5f, 0.0f); // 纹理和四边形的左下 glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.0f, 1.5f, 1.0f); // 纹理和四边形的右下 glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.0f, 2.5f, 1.0f); // 纹理和四边形的右上
for (int loop=0; loop<2; loop++) { }
if (TextureImage[loop]!=NULL) { }
if (TextureImage[loop]->data!=NULL) { }
free(TextureImage[loop]);
free(TextureImage[loop]->data);
return Status; // 返回 Status
正在阅读:
计算机图形学课程设计03-05
中药材种植合作协议2-2_8004-11
云南省麻栗坝大型灌区规划报告(新版)06-20
凝聚青春力量 助推转调创提09-19
学生评价论文写作,大班额条件下的中学英语差别教学参考范文解读03-08
全国百强校首发江苏省海安高级中学2017-2018学年高一1月月考物理03-19
最新 中考英语阅读理解本章综合与测试(解析版)经典105-02
中心静脉穿刺置管术256例临床应用体会07-26
中国名胜古迹楹联荟萃05-15
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 图形
- 课程
- 计算机
- 设计
- ICP - MS原理 - 图文
- 2015年国家公务员考试面试热点:地方政府非法删帖
- 第二章 机械零件的强度
- 小学英语词汇教学漫谈 刘瑞凤
- 2018年水利局个人工作总结(精选多篇)-范文word版(9页)
- 警钟5
- 管理会计基础知识
- 游戏在小学低年级美术课堂教学中应用
- 2006年线性代数A
- 年广西专业技术人员继续教育公需科目创新与创业能力建设试题和答
- 测绘中级工考试及答案
- 原子力显微实验报告
- 九年制面积
- 南航专接本《数据库系统原理》实验报告1
- 《公共基础知识》-建筑构造部分(二)
- 同学会活动倡议书
- 税收公平原则包括横向公平和纵向公平两个层面
- 股东分红及退出机制确定(三种标准版方案)
- 江理交换技术实验指导书
- 信息技术模拟试卷15套(2)