实验三 观察三维物体分析.docx
《实验三 观察三维物体分析.docx》由会员分享,可在线阅读,更多相关《实验三 观察三维物体分析.docx(6页珍藏版)》请在冰豆网上搜索。
![实验三 观察三维物体分析.docx](https://file1.bdocx.com/fileroot1/2023-2/6/808a7ffd-eb52-4193-b19e-ad16be9dd83c/808a7ffd-eb52-4193-b19e-ad16be9dd83c1.gif)
实验三观察三维物体分析
实验三观察三维物体分析
观察三维物体姓名叶传军学号E得分一、实验题目1、阅读arraycube、c,掌握彩色立方体的建模方法,为程序加注释。
2、修改arraycube、c,实现交互式地移动照相机来观察已经建模好的彩色立方体。
即用鼠标或键盘来改变gluLookAt(eyex,eyey,eyez,atx,aty,atz,upx,upy,upz)函数的9个参数,以此来观察立方体。
要求:
(1)交互时采用的鼠标和键盘按键自定。
(2)分别在正投影和透视投影下实现题目中的功能。
(3)可增加菜单功能,将正投影和透视投影下的观察功能融合到一个程序中。
可参考交互式教程Projection、c的功能。
3、在arraycube、c的基础上编写一个交互式程序,实现立方体的旋转。
具体要求如下:
(1)立方体的旋转方式由鼠标和键盘按键来控制:
按下鼠标左键,立方体绕x轴连续旋转;按下鼠标左键+ctrl键,立方体绕y轴连续旋转;按下鼠标右键,立方体绕z轴连续旋转。
(注意:
旋转的不动点在原点,正好是立方体的中心。
)
(2)如果旋转的不动点不在原点,而改为点P(1,1,1),如何实现立方体绕3个坐标轴轴的旋转?
(3)如果要求每按下一次鼠标按键或键盘按键,立方体旋转的角度增加5度,应如何修改程序?
4、自学教材4、2、7节。
编写一个交互式程序,使其可以通过鼠标(或键盘)和菜单实现一些glu和glut对象的旋转,平移和比例缩放。
(加自己的创意)二、设计思想本次试验主要是用户交互与三维物体观察的结合,主要用到的函数有gluPerspective(fovy,aspect,near,far);glOrtho(left,right,bottom,top,near,far);gluLookAt(eyex,eyey,eyez,atx,aty,atz,upx,upy,upz);通过这些函数的调用可以分别在正投影和透视投影下从不同的角度来观察三维物体。
三、程序清单1、#include"stdafx、h"#include#includeGLdoublevertices[8][3]={-1、0,1、0,1、0,1、0},{1、0,1、0,1、0},?
1、0,-1、0,1、0},{-1、0,-1、0,-1、0},{-1、0,1、0,-1、0},{1、0,1、0,-1、0},{1、0,-1、0,-1、0}};GLdoublecolors[8][3]={{0、0,0、0,0、0},{1、0,0、0,0、0},{1、0,1、0,0、0},{0、0,1、0,0、0},{0、0,0、0,1、0},{1、0,0、0,1、0},{1、0,1、0,1、0},{0、0,1、0,1、0}};//定义顶点和颜色的全局数组voidpolygon(inta,intb,intc,intd){//根据索引列表绘制多边形/*drawapolygonvialistofvertices*/glBegin(GL_QUADS);glColor3dv(colors[a]);glVertex3dv(vertices[a]);glColor3dv(colors[b]);glVertex3dv(vertices[b]);glColor3dv(colors[c]);glVertex3dv(vertices[c]);glColor3dv(colors[d]);glVertex3dv(vertices[d]);glEnd();}voidcolorcube(){/*mapverticestofaces*///利用表面绘制立方体polygon(0,3,2,1);polygon(2,3,7,6);polygon(0,4,7,3);polygon(1,2,6,5);polygon(4,5,6,7);polygon(0,1,5,4);}voiddisplay(){/*displaycallback,clearframebufferandzbuffer,/anddraw,swapbuffers*///显示回调函数glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(1、0,1、0,1、0,0、0,0、0,0、0,0、0,1、0,0、0);colorcube();glutSwapBuffers();}voidmyReshape(intw,inth){//设置投影方式glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)
glOrtho(-2、0,2、0,
10、0,
10、0);elseglOrtho(-2、0*(GLfloat)
w/(GLfloat)
h,2、0*(GLfloat)
w/(GLfloat)
h,
10、0,
10、0);glMatrixMode(GL_MODELVIEW);}voidmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);//设置窗口的显示模式glutInitWindowSize(500,500);//指定窗口大小glutCreateWindow("E叶传军");//创建一个名为E叶传军的窗口glClearColor(0、0,0、0,0、0,0、0);//指定窗口的背景色为黑色//glShadeModel(GL_SMOOTH);glShadeModel(GL_FLAT);glutReshapeFunc(myReshape);glutDisplayFunc(display);//设置当前窗口的显示回调函数//glEnable(GL_DEPTH_TEST);/*Enablehidden--surface--removal*/glutMainLoop();//启动主GLUT事件处理循环}2、
(1)#include"stdafx、h"#include#includeGLdoublevertices[8][3]={{-1、0,1、0,1、0,1、0},{1、0,1、0,1、0},{1、0,-1、0,1、0},{-1、0,-1、0,-1、0},{-1、0,1、0,-1、0},{1、0,1、0,-1、0},{1、0,-1、0,-1、0}};GLdoublecolors[8][3]={{0、0,0、0,0、0},{1、0,0、0,0、0},{1、0,1、0,0、0},{0、0,1、0,0、0},{0、0,0、0,1、0},{1、0,0、0,1、0},{1、0,1、0,1、0},{0、0,1、0,1、0}};//定义顶点和颜色的全局数组intx1=1,y1=1,z1=1,x2=0,y2=0,z2=0,x3=0,y3=1,z3=0;voidpolygon(inta,intb,intc,intd){//根据索引列表绘制多边形/*drawapolygonvialistofvertices*/glBegin(GL_QUADS);glColor3dv(colors[a]);glVertex3dv(vertices[a]);glColor3dv(colors[b]);glVertex3dv(vertices[b]);glColor3dv(colors[c]);glVertex3dv(vertices[c]);glColor3dv(colors[d]);glVertex3dv(vertices[d]);glEnd();}voidcolorcube(){//利用表面绘制立方体/*mapverticestofaces*/polygon(0,3,2,1);polygon(2,3,7,6);polygon(0,4,7,3);polygon(1,2,6,5);polygon(4,5,6,7);polygon(0,1,5,4);}voiddisplay(){//显示回调函数/*displaycallback,clearframebufferandzbuffer,/anddraw,swapbuffers*/glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(x1,y1,z1,x2,y2,z2,x3,y3,z3);colorcube();glutSwapBuffers();}voidmyReshape(intw,inth){//设置投影方式正投影glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)
glOrtho(-2、0,2、0,
10、0,
10、0);elseglOrtho(-2、0*(GLfloat)
w/(GLfloat)
h,2、0*(GLfloat)
w/(GLfloat)
h,
10、0,
10、0);glMatrixMode(GL_MODELVIEW);}voidkeyboard(unsignedcharkey,intx,inty){if(key==q)
{x1++;glutPostRedisplay();}elseif(key==Q)
{x1--;glutPostRedisplay();}elseif(key==w)
{y1++;glutPostRedisplay();}elseif(key==W)
{y1--;glutPostRedisplay();}elseif(key==e)
{z1++;glutPostRedisplay();}elseif(key==E)
{z1--;glutPostRedisplay();}elseif(key==a)
{x2++;glutPostRedisplay();}elseif(key==A)
{x2--;glutPostRedisplay();}elseif(key==s)
{y2++;glutPostRedisplay();}elseif(key==S)
{y2--;glutPostRedisplay();}elseif(key==d)
{z2++;glutPostRedisplay();}elseif(key==D)
{z2--;glutPostRedisplay();}elseif(key==z)
{x3++;glutPostRedisplay();}elseif(key==Z)
{z3--;glutPostRedisplay();}elseif(key==x)
{y3++;glutPostRedisplay();}elseif(key==X)
{y3--;glutPostRedisplay();}elseif(key==c)
{z3++;glutPostRedisplay();}elseif(key==C)
{z3--;glutPostRedisplay();}}voidmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);//设置窗口的显示模式glutInitWindowSize(500,500);//指定窗口大小glutCreateWindow("E叶传军");//创建一个名为E叶传军的窗口glClearColor(0、0,0、0,0、0,0、0);//指定窗口的背景色为黑色//glShadeModel(GL_SMOOTH);glShadeModel(GL_FLAT);glutReshapeFunc(myReshape);glutDisplayFunc(display);//设置当前窗口的显示回调函数glutKeyboardFunc(keyboard);//glEnable(GL_DEPTH_TEST);/*Enablehidden--surface--removal*/glutMainLoop();//启动主GLUT事件处理循环}
(2)#include"stdafx、h"#include#includeGLdoublevertices[8][3]={{-1、0,1、0,1、0,1、0},{1、0,1、0,1、0},{1、0,-1、0,1、0},{-1、0,-1、0,-1、0},{-1、0,1、0,-1、0},{1、0,1、0,-1、0},{1、0,-1、0,-1、0}};GLdoublecolors[8][3]={{0、0,0、0,0、0},{1、0,0、0,0、0},{1、0,1、0,0、0},{0、0,1、0,0、0},{0、0,0、0,1、0},{1、0,0、0,1、0},{1、0,1、0,1、0},{0、0,1、0,1、0}};//定义顶点和颜色的全局数组intx1=1,y1=1,z1=1,x2=0,y2=0,z2=0,x3=0,y3=1,z3=0;voidpolygon(inta,intb,intc,intd){//根据索引列表绘制多边形/*drawapolygonvialistofvertices*/glBegin(GL_QUADS);glColor3dv(colors[a]);glVertex3dv(vertices[a]);glColor3dv(colors[b]);glVertex3dv(vertices[b]);glColor3dv(colors[c]);glVertex3dv(vertices[c]);glColor3dv(colors[d]);glVertex3dv(vertices[d]);glEnd();}voidcolorcube(){//利用表面绘制立方体/*mapverticestofaces*/polygon(0,3,2,1);polygon(2,3,7,6);polygon(0,4,7,3);polygon(1,2,6,5);polygon(4,5,6,7);polygon(0,1,5,4);}voiddisplay(){//显示回调函数/*displaycallback,clearframebufferandzbuffer,/anddraw,swapbuffers*/glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(x1,y1,z1,x2,y2,z2,x3,y3,z3);colorcube();glutSwapBuffers();}voidmyReshape(intw,inth){//设置投影方式透视投影glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)
glFrustum(-2、0,2、0,
10、0,
10、0);elseglFrustum(-2、0*(GLfloat)
w/(GLfloat)
h,2、0*(GLfloat)
w/(GLfloat)
h,
10、0,
10、0);glMatrixMode(GL_MODELVIEW);}voidkeyboard(unsignedcharkey,intx,inty){if(key==q)
{x1++;glutPostRedisplay();}elseif(key==Q)
{x1--;glutPostRedisplay();}elseif(key==w)
{y1++;glutPostRedisplay();}elseif(key==W)
{y1--;glutPostRedisplay();}elseif(key==e)
{z1++;glutPostRedisplay();}elseif(key==E)
{z1--;glutPostRedisplay();}elseif(key==a)
{x2++;glutPostRedisplay();}elseif(key==A)
{x2--;glutPostRedisplay();}elseif(key==s)
{y2++;glutPostRedisplay();}elseif(key==S)
{y2--;glutPostRedisplay();}elseif(key==d)
{z2++;glutPostRedisplay();}elseif(key==D)
{z2--;glutPostRedisplay();}elseif(key==z)
{x3++;glutPostRedisplay();}elseif(key==Z)
{z3--;glutPostRedisplay();}elseif(key==x)
{y3++;glutPostRedisplay();}elseif(key==X)
{y3--;glutPostRedisplay();}elseif(key==c)
{z3++;glutPostRedisplay();}elseif(key==C)
{z3--;glutPostRedisplay();}}voidmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);//设置窗口的显示模式glutInitWindowSize(500,500);//指定窗口大小glutCreateWindow("E叶传军");//创建一个名为E叶传军的窗口glClearColor(0、0,0、0,0、0,0、0);//指定窗口的背景色为黑色//glShadeModel(GL_SMOOTH);glShadeModel(GL_FLAT);glutReshapeFunc(myReshape);glutDisplayFunc(display);//设置当前窗口的显示回调函数glutKeyboardFunc(keyboard);//glEnable(GL_DEPTH_TEST);/*Enablehidden--surface--removal*/glutMainLoop();//启动主GLUT事件处理循环}(3)四.结果分析掌握了三维物体的观察方法,以及对视角的一些调整函数。