当前位置:
文档之家› 几何图形变换实验_计算机专业_OpenGL实验_Exp
几何图形变换实验_计算机专业_OpenGL实验_Exp
//输出五芒星信息
//设置缩放 //绘制纹理木箱
//输出木箱信息
4、分析讨论 OpenGL 是通过矩阵相乘实现图形的几何变换的, 由于矩阵乘法不满足交换律, 因此 在进行图形的复合几何变换时,特别要注意矩阵相乘的顺序。连续的平移变换、连续的 旋转变换、或者连续的比例变换是允许的,但是像“平移 1→旋转→平移 2”与“平移 1 →平移 2→旋转” 的几何变换则可能会出现截然不同的变换结果, 而实际上我们需要的结 果往往是后者。 为了避免这种情况,利用 OpenGL 提供的 glPushMatrix()函数对原始图形的矩阵 S 压 栈,然后把所有平移矩阵累乘得到矩阵 A、所有旋转矩阵累乘得到矩阵 B、所有比例矩 阵累乘得到矩阵 C,最后在视窗上绘制 S*A*B*C 的变换矩阵图形,最后用 glPopMatrix() 弹栈恢复变换前矩阵 S,准备下一次的几何变换。
void Display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(iMenu==1) //绘制五芒星 { glPushMatrix(); glTranslatef(Tx_2D,Ty_2D,0); glRotatef(Rz_2D,0,0,1); glScalef(Sx_2D,Sy_2D,1); DrawStar(); glPopMatrix(); glColor3f(1,1,1); ShowStar(); } else { //绘制木箱 glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glPushMatrix(); glTranslatef(Tx_3D,Ty_3D,0); glRotatef(Rx_3D,1,0,0); glRotatef(Ry_3D,0,1,0); glRotatef(Rz_3D,0,0,1); glScalef(Sx_3D,Sy_3D,Sz_3D); DrawTexTureCube(); glPopMatrix(); glDisable(GL_DEPTH_TEST); glDisable(GL_TEXTURE_2D); glColor3f(1,1,1); ShowCube(); } glutSwapBuffers(); return; } //设置平移 //设置旋转 //设置平移 //设置旋转 //设置缩放 //绘制五芒星
2、二维图形几何变换的计算 几何变换均可表示成 P’=P*T 的形式 (1)点的变换:先将点表示为规范化齐次坐标形式,再乘以变换矩阵。
(2)直线的变换:将直线的两个端点表示为规范化齐次坐标形式,再乘以变换矩阵。
(3)多边形的变换:将多边形的顶点表示为规范化齐次坐标形式,再乘以变换矩阵。
(4)曲线的变换:将曲线的每个点表示为规范化齐次坐标形式,再乘以变换矩阵。
图 6-4 旋转变换 推导:利用极坐标方程
逆时针旋转 θ 角的矩阵如下:
(4)对称变换 对称变换后的图形是原图形关于某一轴线或原点的镜像。
图 6-5 对称变换 ①关于 x 轴对称
图 6-6 关于 x 轴对称 ②关于 y 轴对称
图 6-7 关于 y 轴对称
③关于原点对称
图 6-8 关于原点对称 ④关于 y=x 轴对称
注:1、实验报告的内容: 一、实验目的;二、实验原理;三、实验步骤;四、实验结果;五、讨论分析 (完成指定的思考题和作业题) ;六、改进实验建议。 2、各专业可在满足学校对实验教学基本要求的前提下,根据专业特点自行设计实验报告的格式,所设 计的实验报告在使用前需交实践教学管理科备案。
五、实验步骤
1、复习有关算法,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用 C/C++语言编写源程序并调试、执行(任意指定一个图形) ; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。
六、实验报告要求:
1、分析各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析 4、实验总结(含问题分析及解决方法)
七、实验原理
1、二维基本几何变换 二维基本几何变换都是相对于坐标原点和坐标轴进行的几何变换, 有平移、 比例、 旋转、反射和错切等。 (1)平移变换 是指将 p 点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。 他是 一种不产生变形而移动物体的刚体变换(rigid-body transformation) ,如下图所示。
void Menu(void) { int MainMenu=glutCreateMenu(ProcessMenu); //创建主菜单 glutAddMenuEntry("二维图形几何变换 - 五芒星",1); glutAddMenuEntry("三维图形几何变换 - 纹理木箱",2); glutAttachMenu(GLUT_RIGHT_BUTTON); return; } void ChangeSize(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(iMenu==1) //二维图形映射规则 { if(w<=h) gluOrtho2D(-2,2,-2*h/w,2*h/w); else gluOrtho2D(-2*h/w,2*h/w,-2,2); } else //三维图形映射规则 { if(w<=h) glOrtho(-3,3,-3*h/w,3*h/w,-8,8); else glOrtho(-3*3/w,3*h/w,-3,3,-8,8); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); return; } //将主菜单与鼠标右键关联
图 6-9 关于 y=x 轴对称 ⑤关于 y=-x 轴对称
图 6-10 关于 y=-x 轴对称 (5)错切变换 错切变换也称为剪切、错位变换,用于产生弹性物体的变形处理。
图 6-11 错切变换
错切变换的变换矩阵为:
①沿 x 方向错切:b=0 ②沿 y 方向错切:c=0 ③两个方向错切:b 和 c 都不等于 0。
二、实验设备及实验环境
1、计算机(每人一台) 2、VC++6.0 或其他 C/C++语言程序设计环境(可使用 OpenGL)
三、实验学时
2 学时
四、实验内容
1、在 VC++编程环境下建立平面几何图形实现其常见几何变换; 2、在 VC++编程环境下建立三维立方体,实现其几何变换,包括缩放\平移\旋转.
Exp - University
实
课程名称 实验项目 专业班级 指导教师
验
报
告
计算机图形学实验 几何图形变换实验 姓 名 成 绩 Exp 学 号 QQ:289065406 日 期 2011.12.06
一、实验目的
1、通过实验,掌握计算机图形变换的基本知识、原理; 2、掌握二维和三维图形几何变换; 3、通过使用 VC++编程环境实现指定图形的常见几何变换;
十、实验总结
这次实验难度其实并不大,用到的都是以往的 OpenGL 绘图知识,例如绘制五芒星 时的描点连线、逼近法画圆、通过插值方式给图形填涂颜色、绘制木箱的纹理贴图、 OpenGL 视窗显示文字、右键菜单等等。 由于我是用工程的文件组织形式编程,因此很多功能都是通过代码重用实现的,所 以实际编程耗时很短。而我觉得真正有难度的是通过菜单切换二三维的映射规则。在我 的程序中,我是通过 gluOrtho2D()函数映射二维区域,gluOrtho()函数映射三维区域。 刚开始时,我只是简单地在 ChangeSize()函数里面通过判断当前菜单 iMenu 的值来 决定应该采用哪种映射规则,但这样做存在的问题就是每次切换菜单后,由于窗口大小 并没有发生变化,ChangeSize()函数并没有被 glutReshapeFunc()函数马上调用,必须人为 地拉伸一下窗口才能切换映射规则,这显然是很不理想的。为了解决这个问题,我进行 了多种尝试方法,最终决定在切换菜单后,马上人为地调用一次 ChangeSize()函数,传 参为 OpenGL 窗口的大小,即调用 ChangeSize(WinWidth,WinHeight),问题解决。 另一个问题是,我最初绘制三维的木箱时,使用的是透视投影 glFrustum(),但后来 发现,使用透视投影无法在在 OpenGL 窗口上绘制文字,但绘制出来的木箱效果很有实 感;而使用平行投影 gluOrtho()则既能显示文字,又能绘制出木箱,只是实感度相对于 透视投影略差。 遗憾的是我还没找到在透视投影下显示文字的方法, 唯有采用后者方案。
(3)旋转变换 三维旋转满足右手定则:大拇指指向围绕旋转的轴向,四指转的方向为正向。
图 7-6 旋转变换的角度方向
①绕 z 轴旋转
图 7-7 绕 z 轴旋转 ②绕 x 轴旋转
图 7-8 绕 x 轴旋转 ③绕 y 轴旋转
图 7-9 绕 y 轴旋转 (4)对称变换 ①关于坐标平面对称 关于 xoy 平面进行对称变换的矩阵计算形式为:
关于 yoz 平面的对称变换为:
关于 zox 平面的对称变换为:
②关于坐标轴对称变换 关于 x 轴进行对称变换的矩阵计算形式为:
关于 y 轴的对称变换为:
关于 z 轴的对称变换为:
(5)错切变换
①沿 x 方向错切
②沿 y 方向错切
③沿 z 方向错切
(6)逆变换 所谓逆变换即是与上述变换过程的相反的变换。 ①平移的逆变换
②比例的逆变换 局部比例变换的逆变换矩阵为:
整体比例变换的逆变换矩阵为:
③旋转的逆变换
八、算法流程
1、二维基本几何变换算法流程