收藏 分销(赏)

实验十交互的3D漫游世界.doc

上传人:人****来 文档编号:10781186 上传时间:2025-06-13 格式:DOC 页数:9 大小:356.01KB 下载积分:6 金币
下载 相关 举报
实验十交互的3D漫游世界.doc_第1页
第1页 / 共9页
实验十交互的3D漫游世界.doc_第2页
第2页 / 共9页


点击查看更多>>
资源描述
计算机图形学实验报告 实验报告文件命名方式:学号姓名_实验序号_实验名称.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% 评阅教师特殊评语: 评阅教师: 日 期:
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服