1、计算机图形学实验报告 实验报告文件命名方式:学号姓名_实验序号_实验名称.doc 姓名 学号 专业 任课教师 实验教师 评阅教师 实验地点 书写日期 2013-8-7 实验课时间 实验得分 实验序号与名称:实验十 交互的3D漫游世界 实验目的: 1) 进一步掌握3D编程概念: 2)主要掌握视点和目标的改变对场景生成的影响 3)掌握3D漫游场景的基本技巧 实验开发环境: 硬件要求: PC机,主流配置,最好为独立显卡,显存512M以上。 软件环境: 操作系统:Windows XP。
2、语言开发工具:Microsoft Visual studio 2008,Visual C++。
并安装OpenGL图形函数库
实验要求:
1.当场检查,计现场分
2.实验所有步骤所生成的效果截图拷贝到实验报告文档里备查,并附上相应的代码。 WORD文档命名方式:学号姓名-实验序号-实验名称。
实验内容与步骤小结、主要截图、核心代码实现:
比例:50%
#include "stdafx.h"
#include "3Dshijie.h"
#include
3、 float theta=-90.0; //rotating angle小球旋转角 int inner=10,outer=80; //torus's inner & outer radius内径外径 float s=outer+4*inner+50; float eyex=0,eyey=0,eyez=s; //eye point initial position float atx=0,aty=0,atz=0; //at point initial position int ww,hh; //variable for windows's width //bool
4、 flag=true; double angle=0;//漫游移动旋转角 float step=0.1*s;//步长为视点到目标点的距离 void Display(void); void Reshape(int w, int h); void mytime(int value); void drawground();//地板天花 void drawsphere();//环+球 void drawwall();//墙 void init(); void mykeyboard(unsigned char key, int x, int y); int APIE
5、NTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); char *argv[] = {"hello ", " "}; int argc = 2; // must/should match the number of strings in argv glut
6、Init(&argc, argv); //初始化GLUT库; glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(缓冲,颜色类型) glutInitWindowSize(500, 500); glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250); glutCreateWindow("Rotating 3D World"); //创建窗口,标题为“Rotating 3D World”; glutReshapeFunc(Reshape); init()
7、 glutDisplayFunc(Display); //用于绘制当前窗口; glutKeyboardFunc(mykeyboard); glutTimerFunc(100,mytime,10); glutMainLoop(); //表示开始运行程序,用于程序的结尾; return 0; } void init() { glClearColor(1,1,1,1); glPixelStorei(GL_PACK_ALIGNMENT, 1); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); } vo
8、id mykeyboard(unsigned char key, int x, int y) { switch(key) { case 'W': case 'w':// 向前直走旋转角angle不变,平移量为步长*sin/cos(angle) //your code Here eyex=eyex-step*sin(angle); eyez=eyez-step*cos(angle); atx=atx-step*sin(angle); atz=atz-step*cos(angle); break; case 'S': case '
9、s'://向后退 //your code Here eyex=eyex+step*sin(angle); eyez=eyez+step*cos(angle); atx=atx+step*sin(angle); atz=atz+step*cos(angle); break; case 'A': case 'a'://左看 //your code Here视点不变,目标点绕视点旋转 angle+=0.1; atx=eyex-x*sin(angle); atz=eyex-x*cos(angle); break; case
10、'D': case 'd'://右看 //your code Here angle-=0.1; atx=eyex-x*sin(angle); atz=eyex-x*cos(angle); break; } glutPostRedisplay();//参数修改后调用重画函数,屏幕图形将发生改变 } void Display(void) { //glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT); glMatr
11、ixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(eyex,eyey,eyez,atx,aty,atz,0,1,0); glPushMatrix();//旋转茶壶 glRotated(theta,0,1,0); glColor3f(0,0,1); glutWireTeapot(30); glPopMatrix(); glPushMatrix(); glColor3f(0.0,0.0,1.0); drawwall(); glColor3f(1.0,0,0); drawground();
12、 drawsphere();//画球+环 glPopMatrix(); glutSwapBuffers(); } void drawsphere() { float tr; tr=(outer+3*inner); glRotatef(theta,0,1,0); glPushMatrix(); glPushMatrix(); glColor3f(1.0,0,1.0); glutWireTorus(inner,outer,30,50); glPopMatrix(); glPushMatrix(); glTransla
13、tef(outer,0,0); glRotatef(theta,0,1,0); glTranslatef(-outer,0,0); glPushMatrix(); glTranslatef(tr,0,0); glRotatef(-45,1,0,0); glColor3f(0.0,1.0,0); glutWireSphere(inner,20,20); glPopMatrix(); glPopMatrix(); glPopMatrix(); } void drawground() { //ground for (i
14、nt i=-outer-4*inner;i 15、4*inner,i);
glEnd();
}
//top
for ( int i=-outer-4*inner;i 16、r,outer+4*inner,i+2*inner);
glVertex3d(j+2*inner,outer+4*inner,i);
glEnd();
}
}
void drawwall()
{
int i,j;
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
//left
for (i=-outer-4*inner;i 17、{
glBegin(GL_QUADS);
glVertex3d(-outer-4*inner,j,i);
glVertex3d(-outer-4*inner,j+2*inner,i);
glVertex3d(-outer-4*inner,j+2*inner,i+2*inner);
glVertex3d(-outer-4*inner,j,i+2*inner);
glEnd();
}
//right
for (i=-outer-4*inner;i<=outer+4*inner-2*inner;i+=2* 18、inner) //for z
for (j=-outer-4*inner;j<=outer+4*inner-2*inner;j+=2*inner) //for y
{
glBegin(GL_QUADS);
glVertex3f(outer+4*inner,j,i);
glVertex3f(outer+4*inner,j+2*inner,i);
glVertex3f(outer+4*inner,j+2*inner,i+2*inner);
glVertex3f(outer+4*inner,j,i 19、2*inner);
glEnd();
}
glColor3f(1.0,1.0,0.0);
//front
for (i=-outer-4*inner;i<=outer+4*inner-2*inner;i+=2*inner) //for z
for (j=-outer-4*inner;j<=outer+4*inner-2*inner;j+=2*inner) //for y
{
glBegin(GL_QUADS);
glVertex3f(j,i,-outer-4*inne 20、r);
glVertex3f(j+2*inner,i,-outer-4*inner);
glVertex3f(j+2*inner,i+2*inner,-outer-4*inner);
glVertex3f(j,i+2*inner,-outer-4*inner);
glEnd();
}
}
void mytime(int value)
{
theta+=0.5;
if (theta>=360.0) theta-=360.0;
glutPostRedisplay(); 21、
glutTimerFunc(100,mytime,10);
}
void Reshape(GLsizei w,GLsizei h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,w/h,10,2*outer+8*inner+250);
glViewport(0,0,w,h);
glMatrixMode(GL_MODELVIEW);
ww=w;
hh=h;
}
实验课完成程度与表现自我评价:
比例:20%
实验的体会、收获与建议(结论)
比例:30%
评阅教师特殊评语:
评阅教师:
日 期:






