1、Chapter 3. Transforms 变换,金小刚 Email: 浙江大学CAD&CG国家重点实验室,教I 三楼,变换可以用来改变物体的位置、形状;对物体、光源和摄像机设置动画等用齐次坐标,4X4矩阵来表示大部分图形API (Application Programming Interface)包含矩阵操作,基本变换,Translation transform Rotation transform Scaling transform Shearing transform Transform concatenation Rigid body transform Normal transfo
2、rm,平移变换,x,y,x,y,旋转变换,性质1:迹与旋转轴无关,都为性质2:所有旋转矩阵为正交阵,多个旋转矩阵相乘仍为正交阵。,比例缩放变换,Example: Scaling in a certain direction 假设沿正交、右手系的矢量fx , fy , fz进行比例变换,则首先构造矩阵最后的变换为,错切变换,六个基本错切矩阵:Hxy(s), Hxz(s), Hyx(s), Hyz(s), Hzx(s), Hzy(s)。 第一个下标表示改变的坐标 第二个下标表示实施错切的坐标,x,z,1,1,x,z,1,1,s,Hxz(s),由于|H|=1, 故错切变换是一个保体积的变换,Conc
3、atenation of Transforms,因矩阵相乘是不可交换的,所以矩阵的串连是与次序有关的矩阵串连的好处:节约计算量,提高效率复合矩阵为:C=TRS (对于column-major) 注:对于row-major,复合矩阵为C=SRT,刚体变换,只有物体的位置(平移变换)和朝向(旋转变换)发生改变,而形状不变,得到的变换称为刚体变换 特点:保持长度和角度,Normal Transform(法向变换),几何变换矩阵不能直接用于变换法向! 假设变换几何的矩阵为M,则用于变换法向的矩阵为N(M-1)T,x,y,polygon,normal,x,y,incorrect,x,y,correct,
4、沿x方向比例缩放0.5,如果已知矩阵是正交的(只有旋转),则不需要计算机矩阵的逆:N(M-1)TM 平移不影响法向若是刚体变换(保长的),采用法向变换的优点是可以避免法向的重新单位化什么时候应用? 如果三角形的顶点包含法向信息,则必须应用法向变换。 若法向是通过计算三角形边的叉积得到,则不需要。,逆矩阵的计算,如果矩阵由一个或多个简单变换复合而成,而且已知参数,则逆矩阵可通过“逆参数”和矩阵相乘次序来得到。 例子:M=T(t)R(),则M-1= R(-)T(-t) 如果矩阵已知是正交的,则M-1 MT如果未知任何信息:伴随矩阵法、Cramer法、LU分解法、Gauss消去法 Cramer法和伴
5、随矩阵法具有较少的“if”分叉,应优先选用。 在现代的体系结构中, “if”测试最好避免,特殊矩阵变换和操作,实时图形中非常重要的矩阵变换和操作 1。Euler变换 2。从一矩阵中抽取基本变换 3。绕任意轴的旋转,Euler变换是一种直观的使一个物体(或摄像机)朝向一指定方向的有效方法。其来源:瑞士大数学家Leonard Euler缺省视域方向:视线为z轴,头朝y轴Euler变换是三个矩阵的相乘E为一正交阵,其逆矩阵,Euler变换,x,y,-z,pitch,head,roll,Euler变换:Head,Pitch and Roll,其它命名方式:x-roll, y-roll, z-roll。
6、在飞行仿真中,采用yaw而非head,摇头 “No”,点头,左右摇晃身体,Gimbal lock现象:当一个自由度丧失时。当 时,矩阵只依赖一个角(r+h),从一正交矩阵反求Euler参数把上式展开,得到,从Euler变换获取参数,由于sin p= f21 , f01/ f11= - tan r, f20/f22= -tan h 故三个欧拉参数的值为h = atan2 (-f20, f22)p = arsin(f21)r = atan2(-f01,f11),特殊情况处理,当cos p = 0时,f01=f11=0,此时r = atan2(-f01,f11)无解。因cos p = 0时,故sin
7、 p = 1,可任意设定 h=0, 再得到 r = atan2(f10, f00)由于p的值域为-900,900,如果p的值不在这个范围,原始参数无法求得。故求得的h、p、r不是唯一的。,矩阵分解,应用需求: 获取比例缩放因子对于特殊系统,获取基本变换(如VRML采用Transform节点,不支持任意4X4矩阵) 决定一个变换是否刚体变换当只有矩阵信息时,动画中关键帧插值问题从一矩阵中剔除错切部分平移获取很容易,rotation, scaling, shears获取较复杂,绕任意轴旋转,x,y,z,r,s,t,x,y,z,r,s,t,x,y,z,r,s,t,M,MT,Rx(),绕任意单位轴r旋
8、转角度是一个很有用的操作 思想: (1).由r构造一正交坐标系 (2).变换坐标系,使得r与x轴重合 (3).绕x轴旋转 (4).变换回去,正交坐标系的构造,数值稳定的方法:先找到r中绝对值最小的坐标分量,然后把其设置为0,然后设置,由(r, s, t)构造矩阵M,该矩阵M把r变换为x轴, s变换为y轴, t变换为z轴。故最后的变换为含义:先把r变换为x轴,然后绕x轴旋转,最后用M的逆矩阵变换回去。注:这里M-1=MT,Goldman提出的方法,参考:Goldman, Ronald, “Matrices and Transformations ”, in Graphics Gems, 1990
9、, pp.472-475,四元数(Quaternion),最早由Sir William Rowan Hamilton于1843年提出,从复数推广到四维空间1985年,Shoemake把四元数引入计算机图形学在表示旋转和朝向方面,优于Euler角。具有表示紧凑,朝向插值稳定的优点,数学背景,定义:q=(qv, qw)=(iqx+jqy+kqz+qw)= qv+qw ,qv= (iqx+jqy+kqz)=(qx, qy, qz) ,i2 = j2 = k2 =-1, jk=-kj=i, ki=-ik=j, ij=-ji=kqw为实部, qv称为虚部,i, j, k 称为虚轴,四元数乘: qr =
10、(iqx+jqy+kqz+qw) (irx+jry+krz+rw)= i (qyrz-qzry+rwqx+qwrx)+ j (qzrx-qxrz+rwqy+qwry)+ k (qxry-qyrx+rwqz+qwrz)+ qwrw-qxrx-qyry-qzrz=(qv rv+rw qv+ qw rv, qw rw- qv. rv)四元数加: q + r = (qv, qw) + (rv, rw) = (qv+rv , qw+rw),四元数共轭: q*= (qv, qw)*= (-qv, qw) 四元数范数:n(q)= |q2| =q q*=q* q = qv .qv+q2w=q2x+q2y+q2
11、z+q2w四元数的逆:q1= q* / |q2| 共轭法则: (q*)*= q; (q+r)*= q*+ r* ; (qr)*= r*q*范数法则: n(q) = n(q*); n(qr) = n(q) n(r),线性性: p(sq+tr) = s pq+ tpr(sp+tq)r = s pr+ tqr 交换率:p(qr)=(pq)r单位四元数: n(q) =1, 可写成 q= (sin uq, cos)=sin uq+cos; 其中|uq|=1 对于单位复数,有 cos+ i sin = ei 对于单位四元数有:q= sinuq+ cos= euq对数运算:log(q)=log(euq)=u
12、q 指数运算:qt=(sinuq, cos)t=etuq =sin(t)uq+ cos(t),四元数变换,单位四元数的最重要性质:能表示任意旋转,而且表示简单、紧凑给定矢量p=(px, py , pz , pw)T和单位四元数 q= (sin uq, cos),qpq-1把p绕单位轴uq旋转2角度,uq,q和-q表示相同的旋转q和r的复合旋转为rq,矩阵转换,把q转化为旋转矩阵,可得到( 设s=2/n(q) ):对于单位四元数,上式简化为,旋转矩阵到四元数的转换,由Mq可得到故若得到qw,则qx、 qy、 qz便可得。因为,故单位四元数为,单位四元数的球面线性插值,给定两个单位四元数q和r,计
13、算其插值四元数代数形式更有用的形式Spherical Linear intERPolation (Slerp),多个单位四元数的插值,目标:给定单位四元数q0, q1, qn-1,计算其插值四元数用Slerp直接推广,会导致关键帧处朝向的变化不连续三次样条法: (1) 首先计算辅助四元数(2) 然后用三次样条进行插值,从一个矢量旋转到另一矢量,给定两个单位矢量s和t,要把s变换到t该问题可很容易采用四元数来解决。(1) 首先计算单位旋转轴u=(st)/| st | (2) e=s.t=cos(2), |st|=sin(2), 2为s和t之间的夹角,则所对应的旋转四元数为q=(sinu,cos)
14、,简化后可得,通过巧妙的技巧,对应的旋转矩阵简化为由于没有开方和三角运算,计算效率高,顶点混合(Vertex Blending),假设一个数字角色的手臂用前臂和后臂来模拟,我们要对手臂设置动画。若采用刚体变换设置动画,则关节处(肘)不像真实手臂。因为我们采用了两个分离的物体来模拟手臂,在关节处有重叠部分。解决方法:Vertex Blending (其它称呼:Skinning, Enveloping, Skeleton-subspace Deformation) 采用一个物体模拟,关节处应是柔性的。,刚 体,bones,顶点混合,folding,(2/3,1/3),(1/3,2/3),前臂2/3
15、, 后臂1/3,simple skin,最简单方法:前臂和后臂仍单独设置动画,但关节处用一柔性的“skin”来连接。柔性部分的一部分顶点由前臂的矩阵来变换,另一部分由后臂的矩阵来变换。即:一个三角形的顶点可以由不同的矩阵来变换,而不是一个矩阵。这种基本技术有时也称为“Stitching”。进一步推广:一个顶点可以由几个不同的矩阵进行加权变换实施方法:在物体上放置关节骨架,每个骨架按用户给定的权因子影响顶点。,整只手臂可以是 “柔性”的。所有的顶点可以由多个矩阵影响。整个多边形网格常称为骨架上的“skin”(外皮)vertex blending 例子,顶点混合的数学表示,p为原始顶点,u(t)为
16、变换后的顶点,n为影响p的关节数目 Mi:把第i个关节骨架的初始坐标系变换到世界坐标系 Bi(t):第i个关节随时间变化的世界变换,通常是一系列矩阵的连乘 wi:第i个关节骨架作用于p的权因子vertex blending 例子,顶点混合可在CPU上实现。如果是瓶颈,则该操作应在图形硬件上实现,有些图形硬件支持顶点混合。也可以用可编程图形硬件(Vertex Shader)实现。DirectX 8 允许两种流水线来实现Skinning: (1) Fixed function path (2) Vertex shader,Fixed function path: 最多允许256个矩阵,每个顶点可最
17、多用其中4个矩阵(在实用中已足够)。该系统称为“indexed vertex blending”。 缺点:Fixed function path 不能与Vertex shader联合使用,因为 Vertex shader 是另一个流水线的一部分。采用Vertex shader实现vertex blending 的好处: (1). 硬件加速 (2). 可与per-pixel lighting 结合,Vertex Blending的一些其它问题,如果需要对皮肤模型进行精确的碰撞检测,则为了获取变换后的顶点,顶点混合不得不在CPU内进行(否则需要在GPU和CPU之间进行顶点传输)。 顶点混合可能出现
18、的问题:不应该的折叠、扭曲,自交,投影(Projections),到目前为止,齐次变换中的w分量还没有用到透视投影矩阵(Perspective projection matrices)将用到该分量我们采用右手坐标系,视线方向为-z 注:DirectX 采用的是左手系,正交投影(Orthographic Projection),特征:平行线投影后仍为平行线正投影到平面z0的投影矩阵为,实现正交投影更常用的矩阵:通过六元组来表达。(l, r, b, t, n, f):Left, Right, Bottom, Top, Near, Far planes. 该矩阵把由这些平面构成的Axis-Align
19、ed Bounding Box (AABB)变换为与轴对齐的立方体,x,y,z,b,t,l,r,n,x,y,z,T(t),x,y,z,S(s),对应的矩阵,Direct X中的正交投影,在DirectX中,z的值域为0,1,而不是-1,1,此时正交矩阵为,透视投影,特征:平行线投影后不再平行。透视投影是图形学应用中用得最多的投影变换,因为它符合人观察世界的习惯。假设投影平面为z=-d, d0, 摄像机(视点)在原点,待投影的点为p,投影得到的点为q(qx, qy, -d),+,z,x,y,q,p,投影平面z = -d,x,z,z = -d,pz,px,qx,q,q,p,根据相似三角形法则:,得
20、到透视变换矩阵显然,容易验证,透视变换把视域四棱锥变换为正则视域体视域四棱锥由(l, r, b, t, n, f)决定,y,x,z,(l, b, n ),(r, t, n ),Pp,y,x,z,视域FOV(Field of View),Horizontal field of view: 由左右平面的夹角决定(l和r)Vertical field of view:由上下平面的夹角决定(t和b)FOV越大,则摄像机看到越多若lr或者tb,则视域四棱锥为不对称的。在CAVE等立体视域中,需要不对称视域四棱锥,透视变换矩阵,把该变换应用于一个点,我们可以得到点q=(qx, qy,qz,qw)T, 通常其w分量不为零且不等于1。为了得到投影点,需要除qw分量。 该矩阵把z=f变换为1,把z=n变换为1,OpenGL的透视变换矩阵,首先乘以变换S(1,1,-1),使得远平面和近平面的值为正,0nf,DirectX的透视变换矩阵,把近平面变换为z=0, 远平面变换为z=1;而且DirectX采用左右系来定义投影矩阵,透视变换引起的深度值的非线性变化,采用透视变换的一个结果是计算得到的深度值不再随输入的pz值线性变化远平面和近平面的值影响z-buffer的精度,近平面越靠近原点,接近远平面的点使用的规范化设备坐标深度空间越小,这使得Zbuffer在远距离的地方不精确,