




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./《计算机图形学》实验报告题目:3D真实感场景绘制:郭继杰学号:2014214168班级:地信141学院:理学院指导老师:解山娟日期:2017年1月1日实验目的结合一学期所学计算机图形学知识,基于专业背景,使用OpenGL绘制简单的3D真实感图形场景。实验要求应用光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中,其中真实感场景绘制包括颜色模型、纹理模型、雾化模型、运动模型以及环境光、漫反射、镜面反射等光照模型设置。实验小组及任务分工小组成员任务分工金城纹理贴图,颜色模型,雾化模型郭继杰运动模型,光照模型黎达材料收集,代码整合实验容1.实验前期工作前期工作经过小组成员充分讨论,资料收集,最终确定小组实验模板为以下两幅场景。目标是实现一艘简单3D帆船模型以及一辆3D小车模型2.程序编译环境:VisualStudio20123.光照模型建立过程光照模型建立流程图: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,inty>在主函数入口设定设置当前窗口的特定键的回调函数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>//确保文件名已提供 {returnNULL;//如果没提供,返回NULL } File=fopen<Filename,"r">;//尝试打开文件if<File>//判断文件是否存在? { fclose<File>;//关闭句柄returnauxDIBImageLoadA<Filename>;//载入位图并返回指针 }returnNULL;//如果载入失败,返回NULL}②位图转化成纹理:intLoadGLTextures<>//载入位图<调用上面的代码>并转换成纹理{intStatus=FALSE;//状态指示器AUX_RGBImageRec*TextureImage[2];//创建纹理的存储空间memset<TextureImage,0,sizeof<void*>*1>;//将指针设为NULL//载入位图,检查有无错误,如果位图没找到则退出if<<TextureImage[0]=LoadBMP<"Data/wenli.bmp">>&&<TextureImage[1]=LoadBMP<"Data/wenli2.bmp">>>{Status=TRUE;//将Status设为TRUEglGenTextures<2,&texture[0]>;//创建纹理for<intloop=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<intloop=0;loop<2;loop++> {if<TextureImage[loop]!=NULL>//判断纹理是否存在 {if<TextureImage[loop]->data!=NULL>//纹理图像是否存在 { free<TextureImage[loop]->data>;//释放纹理图像占用存 } free<TextureImage[loop]>;//释放图像结构 } }returnStatus;//返回Status}③调用纹理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。纹理贴图前纹理贴图后成果展示本次实验将两个模型进行改造,实现了一辆简单的小车以及一艘简单的帆船。〔小车模型〔帆船模型心得体会计算机图形学本身是一门理论与实践都比较复杂的学科,从最开始二维图形的实现,到最后三维真实感场景的实现,都不是一个简单的过程,好的真实感场景实现需要多个模型的相互融合,在实验设计过程中,难免遇到困难,下面是本次实验总结出来的感受。glEnable<>启动函数,无论是构造什么样的模型,都需要由这个函数来启动,如光照模型需要glEnable<GL_LIGHTING>,纹理贴图需要glEnable<GL_TEXTURE_2D>;没有启动函数的作用,效果都是不可能是实现的。2.glPushMatrix<>和glPopMatrix<>函数的使用,这两个函数在OpenGL中是模型视图矩阵堆栈,分别是压栈和出栈函数,防止坐标不稳定移动。确定每个模型都绘制在预期的位置。以本次实验中小车模型画车轮为例:这个函数中使用了堆栈的函数,为了使轮胎往预期的方向移动,否则,轮胎移动的效果会变成规则的向不同地方跳动,显的不切合实际。3.最后,个人感觉OpenGL场景的实现最重要的是函数的调用以及流程控制运用。函数的重要性不言而喻。如果可以充分吸收模型中各类函数的用法,实现一个场景就不会那么困难,流程控制就是应该想好模型设计的顺序问题,顺序问题一旦解决,运用到程序中,思路清晰就会便于成功。七、源代码实例1.小车模型:#include<stdio.h>#include<stdlib.h>#include<GL/glut.h>#include<math.h>#include<GL/GLAUX.H>#include<gl/gl.h>#include<math.h>#pragmacomment<lib,"opengl32.lib"> #pragmacomment<lib,"glu32.lib"> #pragmacomment<lib,"glaux.lib">floatdelta_v=0.0;floatr=1.0,g=1.0,b=0.0;floatr1=0.0,g1=0.0,b1=0.0;floatP[16];floatM[16];staticGLfloatxRot=0.0f;staticGLfloatyRot=0.0f;staticfloatelbow=0,z=0;//光线及材质的定义GLfloatglobal_ambient[]={0.1,0.1,0.1,0.1};//总体环境光设置GLfloatlight_ambient[]={0.0,0.0,0.0,1.0};//环境光,通常定义在光源中GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0};//漫反射光〔DiffuseLightGLfloatlight_specular[]={1.0,1.0,1.0,1.0};//和镜面反射光〔SpecularLight。GLfloatlight_position[]={20.0,20.0,20.0,0.0};//光源位置GLfloatmat_specular1[]={1.0,1.0,1.0,1.0};//镜面反射光材质材质GLfloatmat_diffuse1[]={1.0,1.0,1.0,1.0};//漫反射光材质GLfloatmat_ambient1[]={1.0,1.0,1.0,1.0};//环境光材质GLfloatmat_shininess1={10.0};//镜面反射指数GLfloatvertices[][3]={{-0.7,0,1},{0.7,0,1},{0.7,0,-1},{-0.7,0,-1},{-0.5,1,0.8},{0.5,1,0.8},{0.5,1,-0.8},{-0.5,1,-0.8}};GLfloatfogcolor[]={0.5f,0.7f,0.5f,1.0f};GLuinttexture[2];//存储2个纹理AUX_RGBImageRec*LoadBMP<CHAR*Filename>//载入位图图象{FILE*File=NULL;//文件句柄if<!Filename>//确保文件名已提供 {returnNULL;//如果没提供,返回NULL } File=fopen<Filename,"r">;//尝试打开文件if<File>//判断文件是否存在? { fclose<File>;//关闭句柄returnauxDIBImageLoadA<Filename>;//载入位图并返回指针 }returnNULL;//如果载入失败,返回NULL}intLoadGLTextures<>//载入位图<调用上面的代码>并转换成纹理{intStatus=FALSE;//状态指示器AUX_RGBImageRec*TextureImage[2];//创建纹理的存储空间memset<TextureImage,0,sizeof<void*>*1>;//将指针设为NULL//载入位图,检查有无错误,如果位图没找到则退出if<<TextureImage[0]=LoadBMP<"Data/wenli.bmp">>&&<TextureImage[1]=LoadBMP<"Data/wenli2.bmp">>>{Status=TRUE;//将Status设为TRUEglGenTextures<2,&texture[0]>;//创建纹理for<intloop=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<intloop=0;loop<2;loop++> {if<TextureImage[loop]!=NULL>//判断纹理是否存在 {if<TextureImage[loop]->data!=NULL>//纹理图像是否存在 { free<TextureImage[loop]->data>; //释放纹理图像占用存 } free<TextureImage[loop]>;//释放图像结构 } }returnStatus;//返回Status}voidmenu<intid>//设置一个右键菜单功能{switch<id> {case<1>: exit<0>;break; } glutPostRedisplay<>;}voidcolor_car_body_menu<intid>//车身颜色变化菜单{switch<id> {case<1>:r=1.0;g=0.0;b=0.0;break;case<2>: r=0.0;g=1.0;b=0.0;break;case<3>: r=0.0;g=0.0;b=1.0;break;case<4>: r=0.9;g=0.1;b=0.6;break;case<5>: r=0.7;g=0.5;b=0.1; break;case<6>: r=1.0;g=0.0;b=0.0;break;} glutPostRedisplay<>;}voidcolor_car_wheel_menu<intid>//车轮颜色变化菜单{switch<id> {case<1>:r1=0.0;g1=0.5;b1=1.0;break;case<2>: r1=0.7;g1=0.8;b1=0.4;break;case<3>: r1=0.7;g1=0.0;b1=0.0;break;case<4>:r1=0.9;g1=0.1;b1=0.6;break;case<5>: r1=0.7;g1=0.5;b1=0.1; break;case<6>: r1=0.7;g1=1.0;b1=0.6;break;} glutPostRedisplay<>;}//定义跑道voidrunway<>{ glBegin<GL_QUADS>;//GL_QUADS:绘制由四个顶点组成的一组单独的四边形。//顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形 glColor3f<0.0f,0.8f,0.0f>;//设定跑到颜色glVertex3f<-3.0f,-0.3f,100.0f>;//设定跑道坐标glColor3f<0.0f,0.8f,0.0f>;glVertex3f<-0.8f,-0.3f,100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<-0.8f,-0.3f,-100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<-3.0f,-0.3f,-100.0f>;glEnd<>;glBegin<GL_QUADS>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<0.8f,-0.3f,100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<3.0f,-0.3f,100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<3.0f,-0.3f,-100.0f>;glColor3f<0.0f,0.8f,0.0f>;glVertex3f<0.8f,-0.3f,-100.0f>;glEnd<>;glBegin<GL_QUADS>;//跑道样式glColor3f<0.9f,1.0f,0.9f>;//跑道颜色glVertex3f<-0.8f,-0.3f,100.0f>;//跑道坐标glColor3f<0.9f,1.0f,0.9f>;glVertex3f<0.8f,-0.3f,100.0f>;glColor3f<0.9f,1.0f,0.9f>;glVertex3f<0.8f,-0.3f,-100.0f>;glColor3f<0.9f,1.0f,0.9f>;glVertex3f<-0.8f,-0.3f,-100.0f>;glEnd<>;}//画车身voidquad<inta,intb,intc,intd>{ glBegin<GL_QUADS>;//GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形glVertex3fv<vertices[a]>;glVertex3fv<vertices[b]>;glVertex3fv<vertices[c]>;glVertex3fv<vertices[d]>; glEnd<>;}voidcar_body<>{ glColor3f<1.0,0.0,0.0>;//颜色模型函数 glColor3f<r,g,b>;//设定初始颜色 glNormal3f<0.0f,-1.0f,0.0f>;//buttom,设置当前法线数组,指定新的当前法线的x,y,z坐标。各个定点的法向量不同,所以在确定顶点之前确定法向量。 quad<0,1,2,3>; glNormal3f<1.0f,0.0f,0.0f>;//right quad<1,2,6,5>; glNormal3f<0.0f,0.0f,-1.0f>;//back quad<2,3,7,6>; glNormal3f<-1.0f,0.0f,0.0f>;//left quad<7,3,0,4>; glNormal3f<0.0f,0.0f,1.0f>;//front quad<0,1,5,4>; glNormal3f<0.0f,1.0f,0.0f>;//top quad<4,5,6,7>;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>;//纹理和四边形的右上glTexCoord2f<0.0f,1.0f>;glVertex3f<-0.0f,2.5f,0.0f>;//纹理和四边形的左上glEnd<>;glPopMatrix<>;glPushMatrix<>;glTranslatef<delta_v,0.0,z>;glRotatef<<GLfloat>delta_v,0.0,1.0,0.0>; glTranslatef<0.0,1.55,0.0>;glColor3f<0.5,0.8,0.2>;glPushMatrix<>;glScalef<0.05,1.9,0.05>;glutSolidCube<1.0>;glPopMatrix<>;glPopMatrix<>;}//画车轮voidcar_wheel<>{GLUquadricObj*quadratic; glColor3f<0.0,0.1,0.1>;glColor3f<r1,g1,b1>;glPushMatrix<>;//压栈//模型视图矩阵堆栈,OpenGL提供了相应的接口:glPushMatirx<>和glPopMatrix<>//压栈和堆栈,防止坐标不稳定移动。确定每个模型都绘制在预期的位置,quadratic=gluNewQuadric<>;//创建二次曲面对象。gluNewQuadricglTranslatef<0.2,0,0.7>;//表示将当前图形向x轴平移0.2,向y轴平移0,向z轴平移0.7,表示物体在这个坐标的时候开始绘制 glRotatef<90.0,0,1.0,0>;//沿着〔90,0,0方向向量逆时针旋转90° glTranslatef<-0.2,0,-0.7>;gluCylinder<quadratic,0.25f,0.25f,0.2f,32,32>;//画圆柱体〔轮胎这是绘制柱面的函数 glTranslatef<0.0,0,0.8>;gluCylinder<quadratic,0.25f,0.25f,0.2f,32,32>;glTranslatef<2.0,0,-0.8>;gluCylinder<quadratic,0.25f,0.25f,0.2f,32,32>; glTranslatef<0,0,0.8>;gluCylinder<quadratic,0.25f,0.25f,0.2f,32,32>;glPopMatrix<>;//出栈}voidcar<>{ car_body<>;car_wheel<>; LoadGLTextures<>;}voidmydisplay<>{ glClear<GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT>;//清除颜色缓存 glLightModelfv<GL_LIGHT_MODEL_AMBIENT,global_ambient>;//总体光源glMaterialfv<GL_FRONT,GL_SPECULAR,mat_specular1>;//指定镜面反射光的材质属性glMaterialfv<GL_FRONT,GL_AMBIENT,mat_ambient1>;//指定环境反射光的材质属性glMaterialfv<GL_FRONT,GL_DIFFUSE,mat_diffuse1>;//指定漫反射光的材质属性glMaterialf<GL_FRONT,GL_SHININESS,mat_shininess1>;//设置镜面反射指数//glPolygonMode<GL_FRONT_AND_BACK,GL_LINE>; glGetFloatv<GL_MODELVIEW_MATRIX,P>;//矩阵视图,得到模型移动之后的坐标。。不太确定glPushMatrix<>;glLoadMatrixf<M>;//把当前矩阵的16个值设置为m指定的值runway<>;glPopMatrix<>;glLoadMatrixf<P>;//把当前矩阵的16个值设置为m指定的值 car<>; glutSwapBuffers<>;//glutSwapBuffers函数是OpenGL中GLUT工具包中用于实现双缓冲技术的一个重要函数。该函数的功能是交换两个缓冲区指针。}voidspecialKeyBoard<intkey,intx,inty>{switch<key>{caseGLUT_KEY_DOWN://方向键下glTranslatef<0,0,0.1+delta_v>;//表示将当前图形向x轴平移0,向y轴平移0,向z轴平移0.1+delta,表示物体在这个坐标的时候开始绘制glutPostRedisplay<>;//在图像绘制的所有操作之后,要加入glutPostRedisplay<>来重绘图像break;caseGLUT_KEY_UP://方向键上glTranslatef<0,0,-0.1-delta_v>;glutPostRedisplay<>;break;caseGLUT_KEY_LEFT://方向键左glRotatef<1,0,1,0>;glutPostRedisplay<>;break;caseGLUT_KEY_RIGHT://方向键右 glRotatef<1,0,-1,0>;glutPostRedisplay<>;break;case'a':delta_v+=0.5;break;case's':delta_v-=0.5;break;}}voidmyReshape<GLsizeiw,GLsizeih>//当窗口大小变化时,//为了防止物体变形,这时要重设投影转换矩阵,设置视口转换矩阵,以及视图转换矩阵。这也是reshape要做的事。{ glViewport<0,0,w,h>;//X,Y————以像素为单位,指定了视口的左下角〔在第一象限,以〔0,0为原点的位置。//width,height————表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。glMatrixMode<GL_PROJECTION>;//将当前矩阵指定为投影矩阵glLoadIdentity<>;//该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。 gluPerspective<100.0,w/h,1.0,10.0>;//角度,视景体的宽高比,沿z轴方向的两裁面之间的距离的近处,沿z轴方向的两裁面之间的距离的远处 gluLookAt<0,0,3,0,0,0,0,3,0>;//该函数定义一个视图矩阵,并与当前矩阵相乘 glMatrixMode<GL_MODELVIEW>;}voidinit<>{//OpenGL中使用函数glLightfv<>来创建光源,这里是光源位置 glLightfv<GL_LIGHT0,GL_POSITION,light_position>;//来创建光源,这里是光源位置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>;//启用光源,必须启用,否则光照模型无效 glEnable<GL_TEXTURE_2D>; glEnable<GL_DEPTH_TEST>; //启用深度测试。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>;}intmain<intargc,char**argv>{intbody_menu,wheel_menu,main_menu;//cout<<"操作规则:〔上下左右键控制汽车运动方向,a/k控制加速减速"<<endl; glutInit<&argc,argv>;glutInitDisplayMode<GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH>;glutInitWindowSize<500,500>;glutInitWindowPosition<150,150>;glutCreateWindow<"car">;init<>; glColorMaterial<GL_FRONT,GL_DIFFUSE>;glEnable<GL_COLOR_MATERIAL>;glutSpecialFunc<specialKeyBoard>;glutReshapeFunc<myReshape>;glutDisplayFunc<mydisplay>; body_menu=glutCreateMenu<color_car_body_menu>;glutAddMenuEntry<"red",1>;glutAddMenuEntry<"green",2>;glutAddMenuEntry<"blue",3>;glutAddMenuEntry<"purple",4>;glutAddMenuEntry<"yellow",5>;wheel_menu=glutCreateMenu<color_car_wheel_menu>;glutAddMenuEntry<"blue",1>;glutAddMenuEntry<"green",2>;glutAddMenuEntry<"red",3>;glutAddMenuEntry<"purple",4>;glutAddMenuEntry<"yellow",5>;main_menu=glutCreateMenu<menu>;glutAddSubMenu<"car_body_color",body_menu>;glutAddSubMenu<"car_wheel_color",wheel_menu>; glutAddMenuEntry<"quit",3>;glutAttachMenu<GLUT_RIGHT_BUTTON>; glutMainLoop<>;//程序运行函数,glutMainLoop<>。return0;}帆船模型#include<gl/glut.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<GL/GLAUX.H>#pragmacomment<lib,"opengl32.lib"> #pragmacomment<lib,"glu32.lib"> #pragmacomment<lib,"glaux.lib">staticintshoulder1=0;staticintshoulder2=0;staticinthand=0;staticintturn1=0;staticinttag=0;staticintturn=0;//转弯staticfloatforward=0;//前进staticfloatelbow=0,z=0;intw;inth;intfont=<int>GLUT_BITMAP_8_BY_13;chars[30];intframe,timeOwn,timebase=0;staticGLfloatxRot=0.0f;staticGLfloatyRot=0.0f;//是否停止转动boolIsStop=false;//光照使用光源GLfloatlightPos[]={1.0f,0.0f,-1.0f,0.0f};GLfloatspecular[]={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<>;voidSomething<>;voidrenderBitmapString<floatx,floaty,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>;}GLuinttexture[2];//存储一个纹理AUX_RGBImageRec*LoadBMP<CHAR*Filename>//载入位图图象{FILE*File=NULL;//文件句柄if<!Filename>//确保文件名已提供{returnNULL;//如果没提供,返回NULL}File=fopen<Filename,"r">;//尝试打开文件if<File>//文件存在么?{fclose<File>;//关闭句柄returnauxDIBImageLoadA<Filename>;//载入位图并返回指针}returnNULL;//如果载入失败,返回NULL}intLoadGLTextures<>//载入位图<调用上面的代码>并转换成纹理{intStatus=FALSE;//状态指示器AUX_RGBImageRec*TextureImage[2];//创建纹理的存储空间memset<TextureImage,0,sizeof<void*>*1>;//将指针设为NULL//载入位图,检查有无错误,如果位图没找到则退出if<<TextureImage[0]=LoadBMP<"Data/wenli.bmp">>&&<TextureImage[1]=LoadBMP<"Data/wenli2.bmp">>>{Status=TRUE;//将Status设为TRUEglGenTextures<2,&texture[0]>;//创建纹理for<intloop=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<intloop=0;loop<2;loop++> {if<TextureImage[loop]!=NULL> {if<TextureImage[loop]->data!=NULL> { free<TextureImage[loop]->data>; } free<TextureImage[loop]>; } }returnStatus;//返回Status}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>;//纹理和四边形的右上glTexCoord2f<0.0f,1.0f>;glVertex3f<-0.0f,2.5f,0.0f>;//纹理和四边形的左上glEnd<>;glPopMatrix<>;glFlush<>;}voiddisplay<void>{glClear<GL_COLOR_BUFFER_BIT>;glShadeModel<GL_SMOOTH>;//glEnable<GL_FOG>;//启用雾化模型//glFogi<GL_FOG_MODE,GL_EXP>;//设置雾的类型//glFogf<GL_FOG_DENSITY,0.04f>;//设置雾的密度//glFogfv<GL_FOG_COLOR,fogcolor>;//设定雾的颜色//glHint<GL_FOG_HINT,GL_DONT_CARE>;//设置系统如何计算雾气//glFogf<GL_FOG_START,3.0f>;//设置雾气的开始位置//glFogf<GL_FOG_END,8.0f>;//设置雾气的结束位置if<IsStop==false>{turn=<turn-5>%360;if<forward<2>{turn1=turn;forward=forward-0.04*sin<<GLfloat>turn1/360*3.14*2>;z=z-0.05*cos<<GLfloat>turn1/360*3.14*2>;if<tag==0>{shoulder1=<shoulder1+1>;shoulder2=<shoulder2-1>;if<shoulder1>=0>{elbow=elbow-1.2;}else{elbow=elbow+1.2;}}else{shoulder1=<shoulder1-1>;shoulder2=<shoulder2+1>;if<shoulder1>=0>{elbow=elbow+1.25;}else{elbow=elbow-1.2;}}if<shoulder1>30>{tag=1;}if<shoulder1<-30>{tag=0;}}else{turn1=turn;forward=forward+0.04*sin<<GLfloat>turn1/360*3.14*2>;z=z+0.05*cos<<GLfloat>turn1/360*3.14*2>;if<tag==0>{shoulder1=<shoulder1-1>;shoulder2=<shoulder2+1>;}else{shoulder1=<shoulder1+1>;shoulder2=<shoulder2-1>;}if<shoulder1>30>{tag=0;}if<shoulder1<-30>{tag=1;}}}glBegin<GL_QUADS>;glColor3ub<140,210,240>;glVertex3f<8.0f,-3.0f,-4.0f>;glVertex3f<-8.0f,-3.0f,-4.0f>;glColor3ub<66,250,250>;glVertex3f<-8.0f,-3.0f,4.0f>;glVertex3f<8.0f,-3.0f,4.0f>;glEnd<>;glPushMatrix<>;glTranslatef<3.0,4.0,0.0>; glColor3f<1.0,0.0,0.2>; glutSolidSphere<0.3,100,100>; glPopMatrix<>;glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>; glTranslatef<0.0,0.5,0.0>;glColor3f<1.0,0.3,0.2>;glPushMatrix<>;glScalef<0.5,0.2,0.5>;glutSolidCube<1.0>;glPopMatrix<>;glPopMatrix<>; glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>; glTranslatef<0.0,0.3,0.0>;glColor3f<0.5,0.3,0.2>;glPushMatrix<>;glScalef<0.5,0.1,0.5>;glutSolidCube<2.0>;glPopMatrix<>;glPopMatrix<>; glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>; glTranslatef<0.0,0.1,0.0>;glColor3f<0.5,0.8,0.2>;glPushMatrix<>;glScalef<0.5,0.1,1>;glutSolidCube<2.0>;glPopMatrix<>;glPopMatrix<>; glPushMatrix<>;glTranslatef<forward,0.0,z>;glRotatef<<GLfloat>turn,0.0,1.0,0.0>; glTranslatef<0.0,1.55,0.0>;glColor3f<0.5,0.8,0.2>;glPushMatrix<>;glScalef<0.01,1.9,0.01>;glutSolidCube<1.0>;glPopMatrix<>;glPopMatrix<>; DrawCube<>;glutSwapBuffers<>;}voidrenderBitmapString<floatx,floaty,void*font,char*string>{char*c;glRasterPos2f<x,y>;for<c=string;*c!='\0';c++>{glutBitmapCharacter<font,*c>;}}voidreshape<intw1,inth1>{w=w1;h=h1;glViewport<0,0,<GLsizei>w1,<GLsizei>h1>;glMatrixMode<GL_PROJECTION>;glLoadIdentity<>;gluPerspective<65.0,<GLfloat>w1/<GLfloat>h1,1.0,20.0>;glMatrixMode<GL_MODELVIEW>;glLoadIdentity<>;glTranslatef<0.0,0.0,-8.0>;}voidkeyboard<unsignedcharkey,intx,inty>{switch<key>{case'w'://向后走turn1=turn;forward=forward-0.04*sin<<GLfloat>turn1/360*3.14*2>;z=z-0.05*cos<<GLfloat>turn1/360*3.14*2>;if<tag==0>{shoulder1=<shoulder1+1>;shoulder2=<shoulder2-1>;if<shoulder1>=0>{elbow=elbow-1.2;}else{elbow=elbow+1.2;}}else{shoulder1=<shoulder1-1>;shoulder2=<shoulder2+1>;if<shoulder1>=0>{elbow=elbow+1.25;}else{elbow=elbow-1.2;}}if<shoulder1>30>{tag=1;}if<shoulder1<-30>{tag=0;}IsStop=true;glutPostRedisplay<>;break;case's'://向前走turn1=turn;forward=forward+0.04*sin<<GLfloat>turn1/360*3.14*2>;z=z+0.05*cos<<GLfloat>turn1/360*3.14*2>;if<tag==0>{shoulder1=<shoulder1-1>;shoulder2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年电子商务教师资格证考试大纲试题及答案
- 市场营销师考试经典试题及答案分享
- 2024年注册会计师考试资料下载及试题及答案
- 数据挖掘技术在精算中的应用试题及答案
- 数据分析在马工学研究中的重要性试题及答案
- 2024年计算机二级考试全景视图试题及答案
- 物流系统信息集成的探索试题及答案
- 特许投资分析中的常用算法试题及答案
- 加强运动:2024年计算机二级考试试题及答案
- 特许另类投资的国际比较研究试题及答案
- MOOC 走进舞蹈艺术-首都师范大学 中国大学慕课答案
- AED急救知识课件
- 2023版《思想道德与法治》(绪论-第一章)绪论 担当复兴大任 成就时代新人;第一章 领悟人生真谛 把握人生方向 第3讲 创造有意义的人生
- 2023年水处理BOT合同模板范本
- mil-std-1916抽样标准(中文版)
- 监控施工方案范文六篇
- 支气管镜麻醉
- 2023-2024苏教版七年级数学上册期末试卷
- 少数民族民歌 课件-2023-2024学年高中音乐人音版(2019)必修 音乐鉴赏
- 云南白药成本控制分析报告
- 测绘生产成本费用定额2022
评论
0/150
提交评论