资源描述
计算机图形学实验报告
实验报告文件命名方式:学号姓名_实验序号_实验名称.doc
姓名
学号
专业
任课教师
实验教师
评阅教师
实验地点
书写日期
2013-8-7
实验课时间
实验得分
实验序号与名称:实验十 交互的3D漫游世界
实验目的:
1) 进一步掌握3D编程概念:
2)主要掌握视点和目标的改变对场景生成的影响
3)掌握3D漫游场景的基本技巧
实验开发环境:
硬件要求:
PC机,主流配置,最好为独立显卡,显存512M以上。
软件环境:
操作系统:Windows XP。
语言开发工具:Microsoft Visual studio 2008,Visual C++。
并安装OpenGL图形函数库
实验要求:
1.当场检查,计现场分
2.实验所有步骤所生成的效果截图拷贝到实验报告文档里备查,并附上相应的代码。 WORD文档命名方式:学号姓名-实验序号-实验名称。
实验内容与步骤小结、主要截图、核心代码实现:
比例:50%
#include "stdafx.h"
#include "3Dshijie.h"
#include <math.h>
#include <glut.h>
#define PI 3.14159
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 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 APIENTRY _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
glutInit(&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();
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);
}
void 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 '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 '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);
glMatrixMode(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();
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();
glTranslatef(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 (int i=-outer-4*inner;i<outer+4*inner;i+=2*inner)
for (int j=-outer-4*inner;j<outer+4*inner;j+=2*inner)
{
glBegin(GL_QUADS);
glVertex3d(j,-outer-4*inner,i);
glVertex3d(j,-outer-4*inner,i+2*inner);
glVertex3d(j+2*inner,-outer-4*inner,i+2*inner);
glVertex3d(j+2*inner,-outer-4*inner,i);
glEnd();
}
//top
for ( int i=-outer-4*inner;i<outer+4*inner;i+=2*inner)
for (int j=-outer-4*inner;j<outer+4*inner;j+=2*inner)
{
glBegin(GL_QUADS);
glVertex3d(j,outer+4*inner,i);
glVertex3d(j,outer+4*inner,i+2*inner);
glVertex3d(j+2*inner,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<outer+4*inner;i+=2*inner)
for (j=-outer-4*inner;j<outer+4*inner;j+=2*inner)
{
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*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+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*inner);
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();
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%
评阅教师特殊评语:
评阅教师:
日 期:
展开阅读全文