首页 Opengl实验四资料

Opengl实验四资料

举报
开通vip

Opengl实验四资料计算机学院12计算机科学与技术专业3班学号3112005883姓名:曲绍霖教师评定:实验四模型的成立以及光照、纹理的交互和运动一、实验目的掌握OpenGL的使用方法二、实验要求在Windows平台上用VC++联合GLUT做实验,要求掌握联合VC++和OpenGL的纹理模型的理解及实现,实验达成后要求根据自己的成就撰写一份实验报告。三、实验环境操作系统:Windowsxp开发环境:VC++6.0以及GLUT图形交互设施:鼠标和键盘四、实验内容运用所以学过的知识做一个opengl小程序。实现代码:#include#in...

Opengl实验四资料
计算机学院12计算机科学与技术专业3班学号3112005883姓名:曲绍霖教师评定:实验四模型的成立以及光照、纹理的交互和运动一、实验目的掌握OpenGL的使用 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 二、实验要求在Windows平台上用VC++联合GLUT做实验,要求掌握联合VC++和OpenGL的纹理模型的理解及实现,实验达成后要求根据自己的成就撰写一份实验报告。三、实验环境操作系统:Windowsxp开发环境:VC++6.0以及GLUT图形交互设施:鼠标和键盘四、实验内容运用所以学过的知识做一个opengl小程序。实现代码:#include#include#include#include#include#include全局变量#defineBITMAP_ID0x4D42#definepi3.1415926模式选择开关intiModel=1;intiTest=1;图形旋转与开关unsignedintispin=1;unsignedintirots=1;翡翠和红宝石的材质数据GLfloatno_mat[]={0.0,0.0,0.0,1.0};GLfloatmat_ambient[]={0.0215,0.1745,0.0215,0.55};GLfloatmat_ambient_color[]={0.1745,0.01175,0.01175,0.55};GLfloatmat_diffuse[]={0.07568,0.61424,0.07568,0.55};GLfloatmat_diffuse_color[]={0.61424,0.04136,0.04136,0.55};GLfloatmat_specular[]={0.633,0.727811,0.633,0.55};GLfloatmat_specular_color[]={0.727811,0.626959,0.626959,0.55};GLfloatno_shininess[]={0.0};GLfloatlow_shininess[]={76.8};GLfloathigh_shininess[]={76.8};GLfloatmat_emission[]={0.3,0.2,0.2,0.0};所在光源地点数据GLfloatposition[]={0.0,0.0,1.5,1.0};GLfloatanglex=0,angley=0;//设置X,Y旋转的角度纹理数据构造typedefstruct{intwidth;intheight;unsignedinttexID;unsignedchar*data;}texture;texture*groundTex;//草坪纹理指针texture*wallTex;//栅栏纹理指针调入位图作为纹理数据unsignedchar*LoadBmpFile(char*filename,BITMAPINFOHEADER*bmpInfoHeader){FILE*file;BITMAPFILEHEADERbmpFileHeader;unsignedchar*image;unsignedintimageIdx=0;unsignedchartempRGB;file=fopen(filename,"rb");if(file==NULL){returnNULL;}读取BMP头文件fread(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,file);if(bmpFileHeader.bfType!=BITMAP_ID){fclose(file);returnNULL;}fread(bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,file);fseek(file,bmpFileHeader.bfOffBits,SEEK_SET);分派内存给位图数据image=(unsignedchar*)malloc(bmpInfoHeader->biSizeImage);if(!image){free(image);fclose(file);returnNULL;}读取位图数据fread(image,1,bmpInfoHeader->biSizeImage,file);if(image==NULL){fclose(file);returnNULL;}//反转R和B值已获得RGB,因为位图颜色格式是BGRfor(imageIdx=0;imageIdxbiSizeImage;imageIdx+=3){tempRGB=image[imageIdx];image[imageIdx]=image[imageIdx+2];image[imageIdx+2]=tempRGB;}fclose(file);returnimage;}调入纹理文件texture*LoadTexFile(char*filename){BITMAPINFOHEADERtexInfo;texture*thisTexture;thisTexture=(texture*)malloc(sizeof(texture));if(thisTexture==NULL)returnNULL;调入纹理数据并检查有效性thisTexture->data=LoadBmpFile(filename,&texInfo);if(thisTexture->data==NULL){free(thisTexture);returnNULL;}设置纹理的宽和高thisTexture->width=texInfo.biWidth;thisTexture->height=texInfo.biHeight;生成纹理对象名glGenTextures(1,&thisTexture->texID);returnthisTexture;}初始化所有纹理数据和属性boolLoadAllTextures(){调入草坪纹理数据groundTex=LoadTexFile("ground.bmp");if(groundTex==NULL)returnfalse;调入栅栏纹理数据wallTex=LoadTexFile("wall.bmp");if(wallTex==NULL)returnfalse;//设置草坪纹理控制glBindTexture(GL_TEXTURE_2D,groundTex->texID);//使用双线性纹理滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//设置重复模式glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);//定义草坪纹理gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,groundTex->width,groundTex->height,GL_RGB,GL_UNSIGNED_BYTE,groundTex->data);//设置栅栏纹理控制glBindTexture(GL_TEXTURE_2D,wallTex->texID);//使用双线性纹理滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//设置重复模式glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);//定义栅栏纹理gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,wallTex->width,wallTex->height,GL_RGB,GL_UNSIGNED_BYTE,wallTex->data);returntrue;}初始化光照voidLoadAllLights(){定义光源,它是一种白色的光源GLfloatambient[]={0.0,0.0,0.0,1.0};GLfloatdiffuse[]={1.0,1.0,1.0,1.0};GLfloatspecular[]={1.0,1.0,1.0,1.0};GLfloatlmodel_ambient[]={0.5,0.5,0.5,1.0};GLfloatlocal_view[]={0.0};glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);//过好多次反射后最终遗留在环境中的光芒强度(颜色)glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);//漫反射后最终遗留在环境中的光芒强度(颜色)glLightfv(GL_LIGHT0,GL_SPECULAR,specular);//镜面反射后最终遗留在环境中的光芒强度(颜色)glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view);glEnable(GL_LIGHTING);//在后边的衬着中使用光照glEnable(GL_LIGHT0);//使用第0号光照}初始化OpenGL绘制环境voidinit(void){glClearColor(1.0,1.0,1.0,0.0);//背景颜色为白色glEnable(GL_DEPTH_TEST);//这句是启用深度测试,这样,在后边的物领会被挡着glShadeModel(GL_SMOOTH);}voidmyDisplay(void){//禁用光照和纹理glDisable(GL_LIGHTING);glDisable(GL_TEXTURE_2D);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//消除屏幕和深度缓存glLoadIdentity();//重置目前的模型察看矩阵if(iTest==1){gluLookAt(2.0,2.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);//设置图元描绘的视角//设置正方体旋转并绘制glRotatef(angley,0.0f,1.0f,0.0f);glRotatef(anglex,1.0f,0.0f,0.0f);glBegin(GL_QUADS);glColor3f(0.0f,1.0f,0.0f);//颜色改为绿色glVertex3f(1.0f,1.0f,-1.0f);//四边形的右上极点(顶面)glColor3f(1.0f,0.0f,0.0f);//颜色改为红色glVertex3f(-1.0f,1.0f,-1.0f);//四边形的左上极点(顶面)glColor3f(0.0f,0.0f,1.0f);//颜色改成蓝色glVertex3f(-1.0f,1.0f,1.0f);//四边形的左下极点(顶面)glColor3f(1.0f,0.5f,0.0f);//颜色改成橙色glVertex3f(1.0f,1.0f,1.0f);//四边形的右下极点(顶面)glColor3f(0.0f,1.0f,0.0f);//颜色改为绿色glVertex3f(1.0f,-1.0f,1.0f);//四边形的右上极点(底面)glColor3f(1.0f,0.0f,0.0f);//颜色改为红色glVertex3f(-1.0f,-1.0f,1.0f);//四边形的左上极点(底面)glColor3f(0.0f,0.0f,1.0f);//颜色改成蓝色glVertex3f(-1.0f,-1.0f,-1.0f);//四边形的左下极点(底面)glColor3f(1.0f,0.5f,0.0f);//颜色改成橙色glVertex3f(1.0f,-1.0f,-1.0f);//四边形的右下极点(底面)glColor3f(1.0f,0.5f,0.0f);//颜色改成橙色glVertex3f(1.0f,1.0f,1.0f);//四边形的右上极点(前面)glColor3f(0.0f,0.0f,1.0f);//颜色改成蓝色glVertex3f(-1.0f,1.0f,1.0f);//四边形的左上极点(前面)glColor3f(1.0f,0.0f,0.0f);//颜色改为红色glVertex3f(-1.0f,-1.0f,1.0f);//四边形的左下极点(前面)glColor3f(0.0f,1.0f,0.0f);//颜色改为绿色glVertex3f(1.0f,-1.0f,1.0f);//四边形的右下极点(前面)glColor3f(1.0f,0.5f,0.0f);//颜色改成橙色glVertex3f(1.0f,-1.0f,-1.0f);//四边形的右上极点(后边)glColor3f(0.0f,0.0f,1.0f);//颜色改成蓝色glVertex3f(-1.0f,-1.0f,-1.0f);//四边形的左上极点(后边)glColor3f(1.0f,0.0f,0.0f);//颜色改为红色glVertex3f(-1.0f,1.0f,-1.0f);//四边形的左下极点(后边)glColor3f(0.0f,1.0f,0.0f);//颜色改为绿色glVertex3f(1.0f,1.0f,-1.0f);//四边形的右下极点(后边)glColor3f(0.0f,0.0f,1.0f);//颜色改成蓝色glVertex3f(-1.0f,1.0f,1.0f);//四边形的右上极点(左面)glColor3f(1.0f,0.0f,0.0f);//颜色改为红色glVertex3f(-1.0f,1.0f,-1.0f);//四边形的左上极点(左面)glColor3f(0.0f,0.0f,1.0f);//颜色改成蓝色glVertex3f(-1.0f,-1.0f,-1.0f);//四边形的左下极点(左面)glColor3f(1.0f,0.0f,0.0f);//颜色改为红色glVertex3f(-1.0f,-1.0f,1.0f);//四边形的右下极点(左面)glColor3f(0.0f,1.0f,0.0f);//颜色改为绿色glVertex3f(1.0f,1.0f,-1.0f);//四边形的右上极点(右面)glColor3f(1.0f,0.5f,0.0f);//颜色改成橙色glVertex3f(1.0f,1.0f,1.0f);//四边形的左上极点(右面)glColor3f(0.0f,1.0f,0.0f);//颜色改为绿色glVertex3f(1.0f,-1.0f,1.0f);//四边形的左下极点(右面)glColor3f(1.0f,0.5f,0.0f);//颜色改成橙色glVertex3f(1.0f,-1.0f,-1.0f);//四边形的右下极点(右面)glEnd();//结束绘制}if(iTest==2){LoadAllLights();//载入光照glPushMatrix();gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);//设置可动光源地点glPushMatrix();glRotated(anglex,1.0f,0.0f,0.0f);glRotated(angley,0.0f,1.0f,0.0f);glLightfv(GL_LIGHT0,GL_POSITION,position);glTranslated(0.0,0.0,1.5);glDisable(GL_LIGHTING);//绘制一个红色球体 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示光源地点glColor3f(1.0,0.3,0.3);glutWireSphere(0.07,8,8);glEnable(GL_LIGHTING);glPopMatrix();if(iModel==1){//材质一,翡翠,球体glPushMatrix();glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);glutSolidSphere(1.0,64,64);glPopMatrix();}if(iModel==2){//材质二,红宝石,球体glPushMatrix();glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient_color);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse_color);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular_color);glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);glutSolidSphere(1.0,64,64);glPopMatrix();}glPopMatrix();}if(iTest==3){glEnable(GL_TEXTURE_2D);//启动二维纹理LoadAllTextures();//调入纹理if(iModel==1){//设置正方体旋转并绘制gluLookAt(5.0,9.0,20.0,0.0,0.0,0.0,0.0,1.0,0.0);glColor3f(1.0f,1.0f,1.0f);//对颜色消除,否则图元描绘的颜色会和纹理矛盾glRotatef(angley,0.0f,1.0f,0.0f);//设置花园旋转轴为y使用“草坪”纹理绘制土地glBindTexture(GL_TEXTURE_2D,groundTex->texID);//设置目前纹理为地面glBegin(GL_QUADS);//绘制地面glTexCoord2f(5.0f,5.0f);glVertex3f(6.0f,-3.0f,6.0f);glTexCoord2f(5.0f,0.0f);glVertex3f(6.0f,-3.0f,-6.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-6.0f,-3.0f,-6.0f);glTexCoord2f(0.0f,5.0f);glVertex3f(-6.0f,-3.0f,6.0f);glEnd();//地面绘制结束使用“栅栏”纹理绘制栅栏glBindTexture(GL_TEXTURE_2D,wallTex->texID);//设置目前纹理为栅栏glBegin(GL_QUADS);//绘制正前方栅栏glNormal3f(0.0f,0.0f,1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-6.0f,-3.0f,6.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-6.0f,-1.5f,6.0f);glTexCoord2f(5.0f,1.0f);glVertex3f(6.0f,-1.5f,6.0f);glTexCoord2f(5.0f,0.0f);glVertex3f(6.0f,-3.0f,6.0f);//绘制右边栅栏glNormal3f(1.0f,0.0f,0.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(6.0f,-3.0f,-6.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(6.0f,-1.5f,-6.0f);glTexCoord2f(5.0f,1.0f);glVertex3f(6.0f,-1.5f,6.0f);glTexCoord2f(5.0f,0.0f);glVertex3f(6.0f,-3.0f,6.0f);绘制左边栅栏glNormal3f(-1.0f,0.0f,0.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-6.0f,-3.0f,-6.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-6.0f,-1.5f,-6.0f);glTexCoord2f(5.0f,1.0f);glVertex3f(-6.0f,-1.5f,6.0f);glTexCoord2f(5.0f,0.0f);glVertex3f(-6.0f,-3.0f,6.0f);//绘制后边栅栏glNormal3f(0.0f,0.0f,-1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-6.0f,-3.0f,-6.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-6.0f,-1.5f,-6.0f);glTexCoord2f(5.0f,1.0f);glVertex3f(6.0f,-1.5f,-6.0f);glTexCoord2f(5.0f,0.0f);glVertex3f(6.0f,-3.0f,-6.0f);glEnd();//四面栅栏绘制结束}}glFlush();//强制刷新glutSwapBuffers();//双缓冲}设窗口的坐标voidreshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(40.0,(GLfloat)w/(GLfloat)h,1.0,100.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}键盘控制voidSpecialKeys(intkey,intx,inty){if(iTest==2&&key==GLUT_KEY_F1){irots=!irots;anglex=0,angley=0;ispin=1;}if(iTest==1||iTest==2||iTest==3){if(irots==0){if(iTest!=3){//纹理模式下不支持if(key==GLUT_KEY_UP)if(key==GLUT_KEY_DOWN)x旋转anglex-=5.0f;anglex+=5.0f;}if(key==GLUT_KEY_LEFT)angley-=5.0f;if(key==GLUT_KEY_RIGHT)angley+=5.0f;if(anglex>356.0f)anglex=0.0f;if(anglex<-1.0f)anglex=355.0f;if(angley>356.0f)angley=0.0f;if(angley<-1.0f)angley=355.0f;}}glutPostRedisplay();}voidkeyboard(unsignedcharkey,intx,inty){switch(key){case27://当按下键盘的esc键的时候退出exit(0);break;}}voidmouse(intbtn,intstate,intx,inty){//鼠标左键操作变换旋转轴且在模式1、3和自动选择开启条件if(iTest==1||iTest==3){if(irots==1)if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)ispin=!ispin;}}设置刷新时间voidTimerFunction(intvalue){glutPostRedisplay();//图元描绘和纹理模式下设置自动旋转为模式1开启if(iTest==1||iTest==2||iTest==3){if(irots==1){if(iTest==2){光照模式下光源自动旋转设置angley+=10;if(angley>=360)angley-=360;anglex+=10;if(anglex>=360)anglex-=360;}if(iTest==1){if(ispin==1){angley+=10;if(angley>=360)angley-=360;}else{anglex+=10;if(anglex>=360)anglex-=360;}}if(iTest==3){if(ispin==1){angley+=10;if(angley>=360)angley-=360;}else{angley-=10;if(angley<=-360)angley+=360;}}}}printf("%f,%f,irots=%d,ispin=%u\n",anglex,angley,irots,ispin);glutTimerFunc(100,TimerFunction,1);}菜单项选择项设置voidnMenu(intvalue){switch(value){//1、2为图元模式case1:iTest=1;iModel=1;irots=1;anglex=0,angley=0;ispin=1;break;case2:iTest=1;iModel=1;irots=0;anglex=0,angley=0;ispin=1;break;//3、4为光照模式case3:iTest=2;iModel=1;irots=1;anglex=0;angley=0;break;case4:iTest=2;iModel=2;irots=1;anglex=0;angley=0;break;//5、6为纹理模式case5:iTest=3;iModel=1;irots=1;anglex=0,angley=0;ispin=1;break;case6:iTest=3;iModel=1;irots=0;anglex=0,angley=0;ispin=1;break;}glutPostRedisplay();}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowPosition(100,100);glutInitWindowSize(800,600);//设置窗口大小800*600glutCreateWindow("键盘鼠标交互下的图元描绘与光照纹理");创立右键选择菜单intnPolyMenu=glutCreateMenu(nMenu);glutAddMenuEntry("自动旋转的正四面体",1);//创立图元描绘菜单glutAddMenuEntry("方向键控制旋转",2);intnLinghtMenu=glutCreateMenu(nMenu);//创立光照模型菜单glutAddMenuEntry("翡翠(键盘F1键能够选择自动或许手动旋转)",3);glutAddMenuEntry("红宝石(键盘F1键能够选择自动或许手动旋转)",4);intnTextureMenu=glutCreateMenu(nMenu);//创立纹理模型菜单glutAddMenuEntry("自动旋转察看花园",5);glutAddMenuEntry("左右键旋转察看花园",6);intnMainMenu=glutCreateMenu(nMenu);//创立主菜单glutAddSubMenu("图元描绘下的正方体",nPolyMenu);glutAddSubMenu("光照模式",nLinghtMenu);glutAddSubMenu("纹理",nTextureMenu);glutAttachMenu(GLUT_RIGHT_BUTTON);glutTimerFunc(100,TimerFunction,1);init();glutSpecialFunc(SpecialKeys);glutKeyboardFunc(keyboard);glutMouseFunc(mouse);glutDisplayFunc(myDisplay);glutReshapeFunc(reshape);glutMainLoop();return0;}结果截图:鼠标右键调出菜单项选择择,上下左右控制旋转,鼠标左键在自动旋转下切换旋转角。图元描绘下的正方体,鼠标右键菜单项选择择自动旋转或手动旋转,键盘方向键控制手动旋转光照模式下的翡翠与红宝石,鼠标右键菜单项选择择材质,F1键控制光照自动旋转与手动旋转切换,键盘方向键控制光照手动旋转纹理模式下的花园,鼠标右键菜单控制切换旋转模式,键盘左右键控制手动旋转
本文档为【Opengl实验四资料】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
蜜雪冰花
暂无简介~
格式:doc
大小:210KB
软件:Word
页数:14
分类:
上传时间:2022-07-09
浏览量:0