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

下载本文档

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

文档简介

数字图像处理实验指导书3D游戏图形学实验报告书(实验三)姓名: 学号:班级:浙江理工大学二一二 年 十一 月2实验三 几何图形变换实验一、实验目的和要求1. 进一步掌握二维、三维变换的数学知识、变换原理、变换种类、变换方法;2. 利用OpenGL实现二维、三维图形变换,在屏幕上显示变换过程或变换结果;3. 掌握OpenGL常用的变换函数。2、 实验原理OpenGL的三个基本几何变换函数介绍如下:1. 平移变换平移变换函数如下:void glTranslate fd (TYPE x, TYPE y, TYPE z);三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数表示用这三个偏移量生成的矩阵乘以当前矩阵。2. 旋转变换旋转变换函数如下: void glRotate fd (TYPE angle, TYPE x, TYPE y, TYPE z);函数中第一个参数是表示目标沿从点(x, y, z)到原点的方向逆时针旋转的角度,后三个参数是旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。3. 比例变换比例变换函数如下: void glScale fd (TYPE x, TYPE y, TYPE z);三个函数参数值就是目标分别沿三个轴向缩放的比例因子。这个函数表示用这三个比例因子生成的矩形乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。以参数x为例,若当x大于1.0时,表示沿x轴方向拉伸目标;若x小于1.0时,表示沿x轴方向收缩目标;若x=-1.0表示沿x轴反射目标。4. 投影变换1)OpenGL平行投影函数共有两个:一个函数是:void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)它创建一个平行视景体。实际上这个函数的操作是创建一个平行投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。 另一个函数是:void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)它是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。因此它的裁剪面是一个左下角点为(left,bottom)、右上角点为(right,top)的矩形。2)OpenGL透视投影函数共有两个:void glFrustum(GLdouble left, GLdouble Right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);它创建一个透视视景体。其操作是创建一个透视投影矩阵,并且用这个矩阵乘以当前矩阵。这个函数的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far是远裁剪平面的Z负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。near和far表示离视点的远近,它们总为正值。另一个函数是:void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);它也创建一个对称透视视景体,但它的参数定义于前面的不同。其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数fovy定义视野在X-Z平面的角度,范围是0.0,180.0;参数aspect是投影平面宽度与高度的比率;参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。3、 实验内容1、下面的代码采用GLUT库,使用了双缓存,在按下鼠标左键后,程序在空闲时一直不停地调用spinDisplay函数,实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动)。请修改代码,实现矩形在窗口内沿着水平线移动。 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个单位。 3、绘制一个三棱椎的透视投影图,要求:实现匀速旋转(提示:参考题目1,使用双缓存模式);改变变换方式,达到不同的效果。选做:实现直线的编码裁剪算法(Cohen-Surtherland算法)。程序中存在小错误,请调试改正;分别给出直线的三种不同位置情况,测试实验代码是否存在其它问题,有的话请改正。4、 实验代码1、修改代码,实现矩形在窗口内沿着水平线移动(红色部分为修改部分)/* * double.c * This is a simple double buffered program. * Pressing the left mouse button rotates the rectangle* Pressing the right mouse button stops the rotation. */#include #include static GLfloat spin = 0.0;void display(void) glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); / glRotatef(spin, 0.0, 0.0, 1.0); glTranslatef(0.0,spin,0.0); glColor3f(1.0, 1.0, 1.0); glRectf(-10.0, -10.0, 10.0, 10.0); glPopMatrix(); glutSwapBuffers(); /交换双缓存 void spinDisplay(void) spin = spin + 0.01; if (spin 20.0) spin = spin - 20.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; /* * Request double buffer display mode. * Register mouse input callback functions */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; /* ANSI C requires main to return int. */2、已知某三角形的三顶点坐标50.0,25.0,150.0,25.0,100.0,100.0。要求:(1)创建一个长宽分别为600、600的窗口,窗口的左上角位于屏幕坐标(100,100)处。(提示:请试着修改gluOrtho2D函数参数,使得绘制的三角形尽可能居中显示)#include #include void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void draw_triangle(void)/绘制三角形 glBegin(GL_TRIANGLES);/开始画三角形 /glColor3f (1.0, 0.0, 0.0); glVertex2f(25.0, 25.0); glVertex2f(100.0, 100.0); glVertex2f(150.0, 25.0); glEnd();void display(void) glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity (); glColor3f (0.0, 1.0, 0.0); draw_triangle (); /画三角形 glEnable (GL_LINE_STIPPLE); /打开画线模式 glLineStipple (1, 0xF0F0); glLoadIdentity (); glTranslatef (-100.0, 0.0, 0.0); glColor3f (0.0, 0.0, 1.0); draw_triangle (); glLineStipple (1, 0xF00F); glLoadIdentity (); glScalef (1.0, 0.5, 1.0); glColor3f (0.0, 1.0, 1.0); draw_triangle (); glLineStipple (1, 0x8888); glLoadIdentity (); glRotatef (90.0, 0.0, 0.0, 1.0); glColor3f (1.0, 0.0, 1.0); draw_triangle (); glDisable (GL_LINE_STIPPLE); glFlush ();void reshape (int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w = h) gluOrtho2D (-150.0, 200.0, -50.0*(GLfloat)h/(GLfloat)w, 200.0*(GLfloat)h/(GLfloat)w);/修改参数,使三角形尽量显示在窗口中央位置 else gluOrtho2D (-20.0*(GLfloat)w/(GLfloat)h, 200.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|GLUT_DEPTH);/显示模式 glutInitWindowSize (600, 600); /创建600*600的窗口 glutInitWindowPosition (100, 100);/左上角位于(100,100)glutCreateWindow (argv0);/创建窗口 init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;(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_TRIANGLES); /glColor3f (1.0, 0.0, 0.0); glVertex2f(25.0, 25.0); glVertex2f(100.0, 100.0); glVertex2f(150.0, 25.0); glEnd();void display(void) glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity (); glColor3f (0.0, 1.0, 0.0); draw_triangle (); glEnable (GL_LINE_STIPPLE); /打开画线模式 glLineStipple (1, 0xF0F0); glLoadIdentity (); glTranslatef (100.0, 63.0, 0.0);/移到参考点 glTranslatef (0.0, 100.0, 0.0);/平移100个单位 glRotatef (90.0, 0.0, 0.0, 1.0);/旋转90度 glScalef (0.5, 0.5, 1.0);/沿着其中心的x轴,y轴方向缩小% glTranslatef (-100.0,-63.0, 0.0);/反平移 glColor3f (0.0, 255.0, 1.0); draw_triangle (); glDisable (GL_LINE_STIPPLE); glFlush ();void reshape (int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w = h) gluOrtho2D (0.0, 200.0, 0.0*(GLfloat)h/(GLfloat)w, 200.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D (0.0*(GLfloat)w/(GLfloat)h, 200.0*(GLfloat)w/(GLfloat)h, 0.0, 200.0); glMatrixMode(GL_MODELVIEW);int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize (600, 600); 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 draw_trangles() /绘制的三棱锥glBegin(GL_TRIANGLES);/开始绘制三棱锥glColor3f(1.0f,0.0f,0.0f);/颜色设定glVertex3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,255.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,1.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(255.0f,0.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(1.0f,255.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f,1.0f);glEnd();void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /清除颜色缓存和深度缓存glPushMatrix(); /清除颜色缓存和深度缓存glLoadIdentity(); glTranslatef(0.5f,0.0f,-6.0f); /试尝试修改此函数,掌握其用法与参数含义 glRotatef(spin,0.0f,5.0f,0.0f); /试尝试修改此函数,掌握其用法与参数含义draw_trangles();glPopMatrix();glutSwapBuffers(); /交换双缓存glFlush();void spinDisplay(void)/控制旋转速度,速度越转越快 spin+=0.25; if(spin360.0) spin=spin-360.0; glutPostRedisplay();void spinDisplay1(void)/不同的方向不同速度,速度越转越快 spin=spin-; if (spin360.0) spin=spin-360.0; glutPostRedisplay();void reshape(int width, int height)glViewport(0,0,(GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glL

温馨提示

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

最新文档

评论

0/150

提交评论