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