实验三 观察三维物体.docx
- 文档编号:9157857
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:32
- 大小:457KB
实验三 观察三维物体.docx
《实验三 观察三维物体.docx》由会员分享,可在线阅读,更多相关《实验三 观察三维物体.docx(32页珍藏版)》请在冰点文库上搜索。
实验三观察三维物体
实验三观察三维物体
姓名叶传军学号E11414103得分
一.实验题目
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
#include
GLdoublevertices[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,-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,-2.0*(GLfloat)h/(GLfloat)w,
2.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);
else
glOrtho(-2.0*(GLfloat)w/(GLfloat)h,
2.0*(GLfloat)w/(GLfloat)h,-2.0,2.0,-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("E11414103叶传军");//创建一个名为E11414103叶传军的窗口
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
#include
GLdoublevertices[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,-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,-2.0*(GLfloat)h/(GLfloat)w,
2.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);
else
glOrtho(-2.0*(GLfloat)w/(GLfloat)h,
2.0*(GLfloat)w/(GLfloat)h,-2.0,2.0,-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("E11414103叶传军");//创建一个名为E11414103叶传军的窗口
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
#include
GLdoublevertices[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,-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,-2.0*(GLfloat)h/(GLfloat)w,
2.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);
else
glFrustum(-2.0*(GLfloat)w/(GLfloat)h,
2.0*(GLfloat)w/(GLfloat)h,-2.0,2.0,-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("E11414103叶传军");//创建一个名为E11414103叶传军的窗口
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)
四.结果分析
掌握了三维物体的观察方法,以及对视角的一些调整函数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 观察三维物体 实验 观察 三维 物体