1、第3章 几何变换为什么要进行变换甲甲乙乙图形定义图形定义空间空间:屏幕屏幕?为什么需要模型变换?q图形API提供的建模方法基于多边形的建模方式限制:只能使用一些简单基本图元简单基本图元(如点、线段和多边形)构建场景【例】模型变换的作用之一模型变换的作用之二模型变换的作用之三对象不变,变换照相机的位置对象不变,变换照相机的位置照相机固定,变换对象的位置照相机固定,变换对象的位置模型变换的作用之四q在计算机动画中,在相邻帧图像中,几个对象相对彼此的位置进行移动。这可以通过平移和旋转局部坐标系实现3.1 二维模型变换q平移平移变换q旋转旋转变换q缩放缩放变换q反射反射变换q错切错切变换q复合复合变换
2、说明:变换的两种实现方式坐标系固定,图形变换坐标系固定,图形变换图形固定,坐标系变换图形固定,坐标系变换3.1.1 二维平移变换xyxxtyyt xytxxtyy3.1.2 二维旋转变换默认情况下以坐标原点坐标原点为的正值定义基准点逆时针旋转,负值则以顺时针方向旋转点rrrr二维旋转变换矩阵坐标原点坐标原点cossinsincosxxyyxy cossin sincosxxyyR 3.1.3 二维缩放变换xyxs xys y 0 0 xyxxsyys S=(sx,sy)T称作齐次坐标P=P+TP=R PP=S P把平移变换转换把平移变换转换成矩阵乘法运算成矩阵乘法运算齐次坐标q几何变换基础(h
3、omogeneous coordinate)n维向量转换成n+1维(,)(,)0,(,1,)(,)x ywx wywx y zwx wy wwzww 通通常常令令XwXwZw p【例】在【例】在 齐次坐齐次坐标空间中,点标空间中,点 p(x,y,w)在在Zw=1平面上的投影是平面上的投影是(x,y)推导齐次坐标下的2D变换矩阵00 00001xysSs 1001001xytTt ()cossin0sincos0001R 缩放变换缩放变换PSP 平移变换平移变换 PPT 1xPy 1xPy 绕坐标原点绕坐标原点的旋转变换的旋转变换()PRP 推导齐次坐标下的2D变换矩阵00 00001xysSs
4、 1xPy 1xPy 1001001xytTt ()cossin0sincos0001R 111213212223001cccccc3.2 三维几何变换q三维图形的几何变换及其矩阵表示平移平移变换旋转旋转变换缩放缩放变换反射变换错切变换三维代数空间定义q基底基底100:010:001:ZYXzyxZYXzyxzyx),(1000100013.2.1 三维平移变换记为:记为:P=TP其中,参数其中,参数tx,ty,tz是平移向量是平移向量1 1xyzxxtyytzzt 1 1xyzxsxysyzs z3.2.2 三维缩放变换记为:记为:P=P其中,参数其中,参数sx,sy,sz是缩放因子是缩放因
5、子3.2.3 三维旋转变换q由和确定记为:P=Rz()P3.2.3 三维旋转变换3.2.4 三维几何变换的表示变换前点(x,y,z),变换后q代数表示q矩阵表示111213142122232431323334 1 0 0 01xa xa ya zaya xa ya zaza xa ya zaxyz 1112131421222324313233344142434411aaaaxxaaaayyaaaazzaaaa 3.3.1 OpenGL中的矩阵q在OpenGL中矩阵是状态的一部分q有三种类型(GL_MODELVIEW)(GL_PROJECTION)(GL_TEXTURE)();(GL_PROJE
6、CTION);3.3.2 OpenGL中的模型变换glTranslate(GLdouble x,GLdouble y,GLdouble z);glTranslate(GLfloat x,GLfloat y,GLfloat z);glScaled/fglRotated/f反射变换0010011xadxybey 错切变换复合变换q由其它变换组合实现的变换如:关于任意点的旋转由平移、绕原点的旋转及平移变换合成得到一种非常有效的构造变换的方式q复合变换的数学表达等同于矩阵乘法利用矩阵乘法结合率可带来计算效率的改进q注意:矩阵复合顺序从简单转换建立任意转换矩阵q绕任意基准点任意基准点的旋转变换q指定缩放固定点缩放固定点的缩放变换绕任意基准点的2D旋转变换q设旋转基准点为p(x0,y0)指定缩放固定点的缩放变换q缩放固定点:缩放后不改变位置的点,记为),(refrefyx图元绘制函数glBegin(GLenum mode)glVertex3f(x,y,z);glEnd()GL_POINTSGL_LINESGL_LINE_STRIPGL_LINE_LOOPGL_TRIANGLEGL_TRIANGLE_STRIPGL_TRIANGLE_FANGL_QUADSGL_QUAD_STRIPGL_PLOYGON