3D图形学实验.doc_第1页
3D图形学实验.doc_第2页
3D图形学实验.doc_第3页
3D图形学实验.doc_第4页
3D图形学实验.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字图像处理实验指导书3D游戏图形学实验指导书指导老师:马文娟姓名:戎洪洋 学号:E09700223浙江理工大学二一一 年 11 月实验三 几何图形变换实验实验项目性质:设计性实验所属课程名称:3D游戏图形学实验计划学时:3学时一、 实验目的和要求1. 进一步掌握二维、三维变换的数学知识、变换原理、变换种类、变换方法;2. 利用OpenGL实现二维、三维图形变换,在屏幕上显示变换过程或变换结果;3. 掌握OpenGL常用的变换函数。二、 实验内容1、下面的代码采用GLUT库,使用了双缓存,在按下鼠标左键后,程序在空闲时一直不停地调用spinDisplay函数,实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动)。请修改代码,实现矩形在窗口内沿着水平线移动。#include #include static GLfloat spin = 0.0;void display(void) glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(spin,0.0f,0.0f); glColor3f(1.0, 1.0, 1.0); glRectf(-10.0, -10.0, 10.0, 10.0); glPopMatrix(); glutSwapBuffers(); /交换双缓存void spinDisplay(void) spin = spin + 0.02; if (spin 360.0) spin = spin - 360.0; glutPostRedisplay();void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void reshape(int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(spinDisplay); /设备空闲时调用的函数 break; case GLUT_MIDDLE_BUTTON: case GLUT_RIGHT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(NULL); break; default: break; int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); /使用双缓存模式 glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv0); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; 2. 已知某三角形的三顶点坐标50.0,25.0,150.0,25.0,100.0,100.0。要求:(1)创建一个长宽分别为600、600的窗口,窗口的左上角位于屏幕坐标(100,100)处。(提示:请试着修改gluOrtho2D函数参数,使得绘制的三角形尽可能居中显示)(2)绘制一个由上述顶点所描绘的三角形,实现该三角形进行下列的几何变化:首先使三角形沿着其中心的x轴,y轴方向缩小50%;然后沿着初始中心旋转90度;最后沿着y轴平移100个单位。参考代码:#include #include void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void draw_triangle(void) glBegin (GL_LINE_LOOP); glVertex2f(50.0, 25.0); glVertex2f(150.0, 25.0); glVertex2f(100.0, 100.0); glEnd();void display(void)glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glViewport(0,0,600,600); glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); draw_triangle (); glLineStipple (1, 0xF00F); glTranslatef (0.0, 100.0, 0.0); glTranslatef (100.0, 62.5, 0.0); glScalef (0.5, 0.5, 1.0); glRotatef (90.0, 0.0, 0.0, 1.0);glTranslatef (-100.0, -62.5, 0.0); draw_triangle (); glFlush ();void reshape (int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w = h) gluOrtho2D (-300.0, 500.0, -300.0*(GLfloat)h/(GLfloat)w, 500.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D (-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0); glMatrixMode(GL_MODELVIEW);int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv0); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;3. 绘制一个三棱椎的透视投影图,要求:实现匀速旋转(提示:参考题目1,使用双缓存模式);改变变换方式,达到不同的效果。参考代码:#include#includestatic GLfloat spin = 0.0;void init(void)glClearColor(0.0f,0.0f,0.0f,0.0f);glShadeModel(GL_SMOOTH); /设为smooth处理方式glEnable(GL_DEPTH_TEST); /激活深度测试(可以去掉,看看效果)void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();/清除颜色缓存和深度缓存glLoadIdentity(); glTranslatef(-1.5f,0.0f,-6.0f); /试尝试修改此函数,掌握其用法与参数含义 glRotatef(spin, 0.0, 5.0, 0.0); /试尝试修改此函数,掌握其用法与参数含义glBegin(GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glEnd(); glPopMatrix(); glutSwapBuffers(); /交换双缓存glFlush();void reshape(int width, int height)glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f, (GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();void keyboard(unsigned char key, int x, int y)switch(key)case x:exit(0);break;default:break;void spinDisplay(void) spin = spin + 0.02; if (spin 360.0) spin = spin - 360.0; glutPostRedisplay();void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(spinDisplay); /设备空闲时调用的函数 break; case GLUT_MIDDLE_BUTTON: case GLUT_RIGHT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(NULL); break; default: break;int main(int argc, char * *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(640,480);glutInitWindowPosition(100,100);glutCreateWindow(Transform2);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMouseFunc(mouse);glutKeyboardFunc(keyboard);glutMainLoop();return 0;附加:实现直线的编码裁剪算法(Cohen-Surtherland算法)。参考代码:#include #include #include #define LEFT_EDGE 1#define RIGHT_EDGE 2#define BOTTOM_EDGE 4#define TOP_EDGE 8void LineGL(int x0, int y0, int x1, int y1)glBegin(GL_LINES);glColor3f(1.0f,0.0f,0.0f); glVertex2f(x0,y0);glColor3f(0.0f,1.0f,0.0f); glVertex2f(x1,y1);glEnd();struct Rectanglefloat xmin, xmax, ymin, ymax;Rectangle rect;int x0,y0,x1,y1;int CompCode(int x, int y, Rectangle rect)int code=0x00;if(yrect.ymax)code=code|8;if(xrect.xmax)code=code|2;if(xrect.xmin)code=code|1;return code;int cohensutherlandlineclip(Rectangle rect, int &x0, int &y0, int &x1, int &y1)int accept, done;float x,y;accept=0;done=0;int code0, code1, codeout;code0=CompCode(x0,y0,rect);code1=CompCode(x1,y1,rect);doif(!(code0|code1)accept=1;done=1;else if(code0&code1)done=1;elseif(code0!=0)codeout=code0;elsecodeout=code1;if(codeout&LEFT_EDGE)y=y0+(y0-y1)*(rect.xmin-x0)/(x1-x0);x=(float)rect.xmin;else if(codeout&RIGHT_EDGE)y=y0+(y0-y1)*(rect.xmax-x0)/(x1-x0);x=(float)rect.xmax;else if(codeout&BOTTOM_EDGE)x=x0+(x1-x0)*(rect.ymin-y0)/(y1-y0);y=(float)rect.ymin;else if(codeout&TOP_EDGE)x=x0+(x1-x0)*(rect.ymax-y0)/(y1-y0);y=(float)rect.ymax;if(codeout=code0)x0=x;y0=y;code0=CompCode(x0,y0,rect);elsex1=x;y1=y;code1=CompCode(x1,y1,rect);while(!done);if(accept)LineGL(x0,y0,x1,y1);return accept;void myDisplay()glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glRectf(rect.xmin, rect.ymin, rect.xmax, rect.ymax);LineGL(x0,y0,x1,y1);glFlush();void Init()glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_FLAT);rect.xmin=100;rect.xmax=300;rect.ymin=100;rect.ymax=300;x0=450, y0=0, x1=0, y1=450;printf(Press key c to Clip! nPress key r to Restore!n);void Reshape(int w, int h)glViewport(0,0,(GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);void keyboard(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论