实验三 观察三维物体分析.docx

上传人:b****6 文档编号:13369201 上传时间:2023-06-13 格式:DOCX 页数:32 大小:456.90KB
下载 相关 举报
实验三 观察三维物体分析.docx_第1页
第1页 / 共32页
实验三 观察三维物体分析.docx_第2页
第2页 / 共32页
实验三 观察三维物体分析.docx_第3页
第3页 / 共32页
实验三 观察三维物体分析.docx_第4页
第4页 / 共32页
实验三 观察三维物体分析.docx_第5页
第5页 / 共32页
实验三 观察三维物体分析.docx_第6页
第6页 / 共32页
实验三 观察三维物体分析.docx_第7页
第7页 / 共32页
实验三 观察三维物体分析.docx_第8页
第8页 / 共32页
实验三 观察三维物体分析.docx_第9页
第9页 / 共32页
实验三 观察三维物体分析.docx_第10页
第10页 / 共32页
实验三 观察三维物体分析.docx_第11页
第11页 / 共32页
实验三 观察三维物体分析.docx_第12页
第12页 / 共32页
实验三 观察三维物体分析.docx_第13页
第13页 / 共32页
实验三 观察三维物体分析.docx_第14页
第14页 / 共32页
实验三 观察三维物体分析.docx_第15页
第15页 / 共32页
实验三 观察三维物体分析.docx_第16页
第16页 / 共32页
实验三 观察三维物体分析.docx_第17页
第17页 / 共32页
实验三 观察三维物体分析.docx_第18页
第18页 / 共32页
实验三 观察三维物体分析.docx_第19页
第19页 / 共32页
实验三 观察三维物体分析.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验三 观察三维物体分析.docx

《实验三 观察三维物体分析.docx》由会员分享,可在线阅读,更多相关《实验三 观察三维物体分析.docx(32页珍藏版)》请在冰点文库上搜索。

实验三 观察三维物体分析.docx

实验三观察三维物体分析

实验三观察三维物体

姓名叶传军学号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

#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)

四.结果分析

掌握了三维物体的观察方法,以及对视角的一些调整函数。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2