Transcript 2. 旋转变换
计算机图形学 河南理工大学 计算机学院 徐文鹏 [email protected] 教学博客http:// Opengl.cnblogs.com 1 问题的提出 组合场景 10:43 2 问题的提出 雪花的构造 10:43 3 问题的提出 构造三维场景 10:43 4 问题的提出 在计算机动画中,在相邻帧图像中,几个对象相对彼此 的位置进行移动 10:43 5 一般变换 • 所谓变换就是把点映射到其它点,把向量映射到其 它向量 10:43 6 平移 • 把一个点移到新的位置 • 平移由一个向量d确定 – 三个自由度 – P’= P + d 10:43 7 对象的平移 • 把一个对象上的所有点沿同一向量平移 对象 10:43 平移后的对象 8 平移的表示 平移变换:将p点从一个坐标位置移到另一个坐标位置的过程. Y P' T P Ty Tx 新点坐标? X 图6-1 10:43 平移变换 9 平移的表示 • 向量表示: P' Y x x t x y ' y t y ' T P Ty Tx P P T ' t x T t y 10:43 X 平移变换 10 旋转 10:43 11 旋转变换 将p点绕坐标原点转动某个角度(逆时针为正,顺时针为负) 得到新的点p’的过程 Y P' r θ r α 10:43 图6-4 P X 旋转变换 12 旋转变换表示 r ' x r cos cos r sin sin y ' r sin cos r cos sin x x cos y sin y ' x sin y cos ' 10:43 P' Y • 向量表示: x ' r cos( ) y ' r sin( ) θ r α P X 图6-4 旋转变换 x ' cos y ' sin ' P RP sin x cos y 13 旋转变换表示 • 向量表示: Y P' x ' cos y ' sin P' R P cos R sin sin x cos y r θ r sin cos α P X 图6-4 旋转变换 顺时针旋转θ 角? 10:43 14 齐次坐标 P P T ' P R P 1. 平移变换: x x tx y ' y ty ' x x tx y ' y ty 1 1 ' 10:43 ' P P T P P T tx,ty称为平移参数 x ' 1 0 t x x y ' 0 1 t y y 1 0 0 1 1 1 0 t x T (t x , t y ) 0 1 t y 0 0 1 P T (t x , t y ) P 15 齐次坐标 2. 旋转变换: 逆时针旋转θ角 x ' cos y ' sin 1 0 10:43 x ' x cos y sin y ' x sin y cos sin cos 0 0 x 0 y 1 1 cos R ( ) sin 0 P R ( ) P 齐次坐标 sin cos 0 0 0 1 16 齐次坐标 • 齐次坐标表示法是由n+1维向量表示一个n维向量。 如:n维向量(P1,P2, … ,Pn)表示为(hP1,hP2,hPn,h), 其中h称为哑坐标。 • 普通坐标与齐次坐标的关系为“一对多” 由普通坐标h→齐次坐标 由齐次坐标÷h→普通坐标 如:普通坐标(2,3)→齐次坐标 (4,6,2), (6,9,3) • 当h=1时产生的齐次坐标称为“规格化坐标”,因为前n个 坐标就是普通坐标系下的n维坐标。 齐次坐标的作用 10:43 17 齐次坐标 1. 齐次坐标是所有计算机图形系统的关键 2. 将各种变换用阶数统一的矩阵来表示。提供了用 矩阵运算把二维、三维甚至高维空间上的一个点 从一个坐标系变换到另一坐标系的有效方法。 3. 便于变换合成, 以利于硬件实现 几何意义? 10:43 18 齐次坐标 齐次坐标 (x,y)点对应的齐次坐标为 ( x, y ) ( x, y ,1) ( hx, hy , h) ( x, y, z ) ( hx, hy, h) z 齐次坐标为三维空间的一条直线 P Z=1平面 O Y x 10:43 19 放缩 • 沿每个坐标轴伸展或收缩(原点为不动点) 10:43 20 放缩变换 对p点相对于坐标原点沿x方向放缩Sx倍,沿y方向放 缩Sy倍。其中Sx和Sy称为比例系数。 Sx S 0 0 10:43 0 Sy 0 Y x xS x y ' yS y 0 0 1 P'(4,3) P(2,1) X 放缩变换(Sx=2,Sy=3) 21 错切变换 Y Y Y 用于产生弹性物体的变形处理。在游戏中用它扭曲 整个场景,产生虚幻效果. (a) X 原图 (b) 图6-7 10:43 沿x方向错切 错切变换 X X (c) 沿y方向错切 22 错切变换 (1)沿x方向错切 每一点的y坐标不变,x坐标平移一个y坐标的线性量. x ' 1 a 0 x y ' 0 1 0 y 1 0 0 1 1 Y x x ay y' y 1 SH x 0 0 10:43 a 1 0 0 0 1 (b) 沿x方向错切 X 23 错切变换 (2)沿y方向错切 x x y ' y bx x ' 1 0 0 x y ' b 1 0 y 1 0 0 1 1 1 0 0 SH y b 1 0 0 0 1 10:43 Y 每一点的x坐标不变,y坐标平移一个x坐标的线性量. X (c) 沿y方向错切 24 仿射变换 x' ax by m y' cx dy n • 平移、比例、旋转、错切和反射等变换均是 二维仿射变换的特例 • 仿射变换具有平行线不变性和有限点数目的 不变性 10:43 25 二. 复合变换 • 基本变换 • 任何一复杂的几何变换都可以看作基本几何变换的 组合形式。 • 复合变换具有形式: P' P T P (T1 T2 T3 Tn ) P T1 T2 T3 Tn 10:43 (n 1) 26 二. 复合变换 1. 二维复合平移 两个连续平移是加性的 P T (t x , t y ) P P T (mx , my ) P 1 0 t x T1 T (t x , t y ) 0 1 t y 0 0 1 1 0 mx T2 T (mx , m y ) 0 1 m y 0 0 1 T (mx , my ) T (t x , t y ) P T (mx t x , my t y ) P 10:43 27 二. 复合变换 2. 二维复合比例 连续放缩变换是相乘的 S (mx , my ) S (t x , t y ) S (mx t x , my t y ) 3. 二维复合旋转 连续旋转变换是相加的 R(1 ) R( 2 ) R(1 2 ) 10:43 28 二. 复合变换 4. 相对任一参考点的二维几何变换 思路? 例. 相对点O’的旋转变换 相对某个参考点O’作二维几何变换,其变换过程为: (1) 平移 y p(xp,yp) (2) 对原点进行几何变换 (3) 反平移 y0 O 10:43 O' x0 相对任一参考点的变换 29 x 二. 复合变换 5. 相对任意方向的二维几何变换 Y 例. 相对直线l的反射变换 相对任意方向作二维几何变换,其变换的过程是: (1) 旋转变换 (2) 针对坐标轴进行二维几何变换; (3) 反向旋转 P(x,y) X l 10:43 P'(x,-y) (a)关于x轴对称 30 二. 复合变换 例. 将正方形ABCO各点沿图6-8所示的(0,0)→(1,1)方向进行 Y 拉伸,结果为如图所示的,写出其变换矩阵和变换过程。 2 A' B' 3/2 B A 1/2 C' C O 1/2 图6-8 10:43 1 3/2 2 X 针对固定方向的拉伸 31 二. 复合变换 • Example: 10:43 32 一.3D基本几何变换 • 三维基本几何变换都是相对于坐标原点和 坐标轴进行的几何变换 • 假设三维形体变换前一点为p(x,y,z),变 换后为p'(x',y',z')。 10:43 33 一.3D基本几何变换 平移变换 10:43 0 1 0 0 0 0 1 0 X tx ty tz 1 Z 1 0 0 0 (x,y,z) x ' x Tx y ' y Ty z ' z Tz (x',y',z') 1. Y 图7-5 平移变换 34 一.3D基本几何变换 2. 旋转变换 z z o y X X 旋转变换 10:43 o y 旋转变换的角度方向 35 一.3D基本几何变换 (1)绕z轴旋转 TRZ cos sin 0 0 sin cos 0 0 0 0 1 0 0 0 0 1 z y X 10:43 36 一.3D基本几何变换 (2)绕x轴旋转 TRX 0 1 0 cos 0 sin 0 0 0 sin cos 0 0 0 0 1 z y X 10:43 37 一.3D基本几何变换 (3)绕y轴旋转 TRY cos 0 sin 0 0 sin 1 0 0 cos 0 0 0 0 0 1 z y Flash演示 10:43 X 38 一.3D基本几何变换 3. 放缩变换 sx 0 Ts 0 0 10:43 0 sy 0 0 0 0 sz 0 0 0 0 1 39 一.3D基本几何变换 例:对如图7-6所示的长方形体进行放缩变换, 其中Sx=1/2,Sy=1/3,Sz=1/2,求变换后的长 方形体各点坐标。 z z 2 E F 2 3 H 1 G A B D y y 1 C x 10:43 1 x 图7-6 比例变换 40 二.3D复合变换 • 三维复合变换是指图形作一次以上的基本变 换,变换结果是基本变换矩阵相乘。 P' P T P (T1 T2 T3 Tn ) 10:43 (n 1) 41 二.3D复合变换 1. 相对任一参考点的三维变换 相对于参考点F(xf,yf,zf)作比例、旋转、错 切等变换的过程分为以下三步: (1)将参考点F移至坐标原点 (2)针对原点进行三维几何变换 (3)进行反平移 10:43 42 二.3D复合变换 例:相对于F(xf,yf,zf)点进行放缩变换 x (a)原图 y 10:43 y x (b)移至坐标原点 图7-8 z (x',y',z') (x',y',z') F z (x',y',z') z (x',y',z') z y x (c)基本比例变换 F y x (d)移回F点原来位置 相对参考点F的比例变换 43 二.3D复合变换 2. 绕任意轴的三维旋转变换 [ x' y' z' 1] [ x y AB与Z轴重合 Z z 1] TRAB P' B θ 问题:如何求出TRAB? P 向基本变换转化 A Y X P点绕AB轴旋转 10:43 44 二.3D复合变换 (1) 将A点平移到坐标原点 下一步? z E b B B' a c o D y x 10:43 45 二.3D复合变换 欲使OB绕x轴旋转至xoz坐标平面内,旋转角 度应为 ,原因是 . A) EOB B) AOB z E b B A B' a c y o x F 10:43 D G 46 二.3D复合变换 (2) 将OB绕x轴逆时针旋转α角,则OB旋转到 xoz平面上, a, b, c 已知 z z b E B B' a b E B B' a c c o D x o y D x (a) α=? 10:43 y (b) 若绕z轴, α? 47 二.3D复合变换 (3) 将OB绕y轴顺时针旋转β角,则OB旋转到 z轴上 β =? F B z E b B F a c o D y x 10:43 48 二.3D复合变换 (4) 经以上三步变换后,AB轴与z'轴重合,此时 绕AB轴的旋转转换为绕z轴的旋转。 (5) 最后,求TtA,TRx,TRy的逆变换,回到AB原 来的位置。 Z P' 1 1 TRAB TtATRxTRyTRzTRy TRx TtA B 1 θ P A Y X 10:43 P点绕AB轴旋转 49 二.3D复合变换 针对任意方向轴的变换可用五个步骤来完成: (1)平移:使任意方向轴起点与坐标原点重合 (2)旋转:使方向轴与某一坐标轴重合,变换可 能不止一次 (3)针对该坐标轴完成所需变换 (4)逆旋转:使方向轴回到其原始方向 (5)逆平移:使方向轴回到其原始位置。 10:43 50 OpenGL旋转、平移、放缩 • 上载单位阵: glLoadIdentity(); • 在右边相乘: glRotatef(theta, vx, vy, vz); –theta以角度为单位,(vx,vy,vz)定义旋转轴 glTranslatef(dx, dy, dz); glScalef(sx, sy, sz); 每个函数的参数还可以是d(double)类型 10:43 51 示例 • 固定点为(1.0, 2.0, 3.0), 绕z轴旋转30° glMatrixMode(GL_MODEL_VIEW); glLoadIdentity(); glTranslated(1.0, 2.0, 3.0); glRotated(30.0,0.0,0.0,1.0); glTranslated(-1.0,-2.0,-3.0); • !!在程序中最后指定的矩阵是最先被执行的操作 10:43 52 变换的应用 • 例如:应用空闲函数旋转立方体,鼠标函数改变旋 转的方向 • 从一个画立方体的程序开始(cube.c) – 立方体中心在原点 – 各方向与坐标轴平行 10:43 53 OpenGL中的矩阵 • 在OpenGL中矩阵是状态的一部分 • 有三种类型 – 模型视图(GL_MODELVIEW) – 投影(GL_PROJECTION) – 纹理(GL_TEXTURE) • 用于操作的单组函数 • 选择所操作的对象 – glMatrixMode(GL_MODEL_VIEW); – glMatixMode(GL_PROJECTION); 10:43 54 当前变换矩阵(CTM) • 从概念上说,当前变换矩阵(CTM)就是一个4x4阶 的齐次坐标矩阵,它是状态的一部分,被应用到经 过流水线中的所有顶点 • CTM是在应用程序中定义的,并被上载到变换单 元中 10:43 55 CTM运算 • CTM可以被改变,改变的方法是上载一个新的 CTM或者右乘一个矩阵 – 上载单位阵:C ← I – 上载任意矩阵:C ←M – 上载一个平移矩阵:C ← T – 上载一个旋转矩阵:C ←R – 上载一个放缩矩阵:C ← S – 右乘任意矩阵:C ←CM – 右乘一个平移矩阵:C ←CT – 右乘一个旋转矩阵:C ←CR 10:43 – 右乘一个放缩矩阵:C ←CS 56 绕固定点的旋转 • • • • • • • 从单位阵开始:C ← I 把固定点移到原点:C ← CT−1 旋转:C ← CR 把固定点移回到原处:C ← CT 结果:C = T−1RT 其中每个运算对应于程序中的一个函数调用 !!在程序中最后指定的运算是最先被执行的运算 10:43 57 在OpenGL中的CTM • 在OpenGL的流水线中有一个模型视图矩阵和一个 投影矩阵,这两个矩阵复合在一起构成CTM • 可以通过首先设置正确的矩阵模式处理每个矩阵 10:43 58 任意矩阵 可以上载应用程序中定义的矩阵,或者使之与CTM 相乘 glLoadMatrixf(m) glMultMatrixf(m) •矩阵m是有16个元素的一维数组,其按列定义了4x4 矩阵 •在glMultMatrixf(m)中m乘在已有乘法的右边 10:43 59 矩阵堆栈 • 许多情况中需要保存变换矩阵,待稍后再用 – 遍历层次数据结构 – 当执行显示列表时避免状态改变 • OpenGL为每种类型的矩阵维持一个堆栈 – 应用下述函数处理矩阵堆栈(也是由 glMatrixMode设置 矩阵类型) glPushMatrix() glPopMatrix() 10:43 60 读入后台矩阵 • OpenGL状态中有些信息是以矩阵形式保存的 • 可以利用查询函数读入矩阵(以及其它部分的 状 态) glGetIntegerv glGetFloatv glGetBooleanv glGetDoublev • 例如,对于CTM: double m[16]; glGetDoublev(GL_MODELVIEW,m); 10:43 61