Real-time Rendering (3rd edition)学习笔记第4章

第4章 变换(Transforms)

What if angry vectors veer
Round your sleeping head, and form.
There’s never need to fear
Violence of the poor world’s abstract storm.

—Robert Penn Warren

变换(transforms)是一种操作,它接受点,向量或颜色等实体,并以某种方式对其进行转换。 对于计算机图形从业者来说,掌握转换极为重要。 使用它们,您可以定位,重塑形状和设置对象,灯光和照相机的动画。 您还可以确保所有计算都在同一坐标系中进行,并将对象以不同的方式投影到平面上。 这些只是可以通过转换执行的操作中的少数操作,但是它们足以证明转换角色在实时图形或任何形式的计算机图形中的重要性。
线性变换是保留矢量加法和标量乘法的变换。 特别地,

f ( x ) + f ( y ) = f ( x + y ) f(x)+f(y) = f(x+y) f(x)+f(y)=f(x+y) ,
k f ( x ) = f ( k x ) . kf(x)= f(kx). kf(x)=f(kx).(4.1)
例如,f(x)= 5x是一个采用向量并将每个元素乘以5的变换。 这种类型的转换是线性的,因为任何两个向量乘以5,然后相加就等于将向量相加然后相乘。 标量乘法条件已明显满足。 此功能称为缩放变换,因为它可以更改对象的缩放比例(大小)。 旋转变换是另一个使向量围绕原点旋转的线性变换。 缩放和旋转变换,实际上是3元素向量的所有线性变换,都可以使用3x3矩阵表示。
但是,矩阵的大小通常不够大。 三元素向量x的函数,例如,f(x)= x +(7,3,2)是非线性的。 在两个单独的向量上执行此功能将把(7,3,2)的每个值相加两次以形成结果。 将固定向量添加到另一个向量会执行翻译,例如,它将所有位置移动相同的数量。 这是一种有用的变换类型,我们想结合各种变换,例如,将对象缩放到一半大小,然后将其移动到其他位置。 到目前为止,将函数保持在简单的形式上很难使它们轻松组合。
可以使用仿射变换(affine transform,通常存储为4x4矩阵)来完成线性变换和平移的组合。 仿射变换是先执行线性变换然后执行平移的变换。 为了表示4元素向量,我们使用同构符号(homogeneous notation),以相同的方式表示点和方向(使用粗体小写字母)。
方向向量表示为v=(vx vy vz 0)T

点表示为v =(vx vy vz 1)T

在本章中,我们将广泛使用附录A中解释的术语。您不妨现在回顾一下此附录,尤其是有关同质符号的第A.4节,第905页。
所有平移,旋转,缩放,反射和剪切矩阵都是仿射的。 仿射矩阵的主要特征是它保留了线的平行性,但不一定保留长度和角度。 仿射变换也可以是各个仿射变换的串联的任何序列。
本章将从最基本的基本仿射变换开始。 这些确实是非常基础的,本节可以看作是简单转换的参考手册。 然后描述了更专业的矩阵,随后对四元数(一种强大的转换工具)进行了讨论和描述。 然后是顶点混合和变形,这是表达网格动画的两种简单但功能更强大的方法。 最后,描述了投影矩阵。 表4.1汇总了大多数这些转换,它们的符号,功能和属性。
变换是用于操纵几何的基本工具。 大多数图形应用程序编程接口(API)都包含矩阵操作,这些操作实现了本章中讨论的许多转换。 但是,仍然有必要了解函数调用背后的实际矩阵及其相互作用。 知道这样的函数调用之后矩阵的功能是一个开始,但是了解矩阵本身的属性将使您更进一步。 例如,这种理解使您可以辨别何时处理正交矩阵(正交的逆矩阵是其转置)(请参见第904页),从而可以更快地进行矩阵求逆。 这样的知识可以导致代码加速。
表4.1本章讨论的大多数转换的总结
表4.1本章讨论的大多数转换的总结

4.1 基本变换(Basic Transforms)

本节介绍最基本的变换,例如平移,旋转,缩放,剪切,变换级联,刚体变换,法线变换(不是正常的)和逆计算。 对于有经验的读者,可以将其用作简单转换的参考手册,对于新手,则可以作为本主题的入门。 本材料是本章其余部分和本书其他各章的必要背景。 我们从最简单的转换翻译开始。
图4.1 左边的正方形用平移矩阵T(5,2,0)变换,从而正方形向右移动5个距离单位,向上移动2个距离单位。
图4.1 左边的正方形用平移矩阵T(5,2,0)变换,从而正方形向右移动5个距离单位,向上移动2个距离单位

4.1.1 平移(Translation)

从一个位置到另一个位置的变化由转换矩阵T表示。此矩阵通过向量t =(tx,ty,tz)转换实体。 T由下面的公式4.2给出

T ( t ) = T ( t x , t y , t z ) = { 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 } T(t)= T(tx,ty,tz)= \left\{ \begin{matrix} 1 & 0 & 0 & tx \\ 0 & 1 & 0 & ty \\ 0 & 0 & 1 & tz \\ 0 & 0 & 0 & 1 \end{matrix} \right\} T(t)=T(tx,ty,tz)=100001000010txtytz1.(4.2),式中x,y,z均为下标。
图4.1显示了平移转换效果的示例。 容易证明,点p =(px,py,pz,1)与T(t)的乘积得到一个新点
p ′ = ( p x + t x , p y + t y , p z + t z , 1 ) p'=(px + tx, py + ty, pz + tz, 1) p=(px+tx,py+ty,pz+tz,1)
请注意,向量v =(vx,vy,vz,0)不受T乘法的影响,因为方向向量无法转换。 相反,其余的仿射变换都会影响点和向量。 平移矩阵的逆是T -1(t)= T(-t),即向量t为负。

4.1.2 旋转(Rotation)

旋转变换将矢量(位置或方向)绕经过原点的给定轴旋转给定角度。 像平移矩阵一样,它是一个刚体变换(rigid-body transform),即它保留了变换后的点之间的距离,并保留了惯用性(即它从不导致左右两侧互换)。 在计算机图形学中,这两种类型的变换对于定位和定向对象显然非常有用。 方向矩阵(orientation matrix)是与摄像机视图或对象相关联的旋转矩阵,它定义了其在空间中的方向,即其向上和向前的方向。 常用的旋转矩阵是Rx(φ),Ry(φ)和Rz(φ),它们分别绕x,y和z轴旋转实体φ弧度。 它们由公式4.3-4.5给出
R x ( φ ) = { 1 0 0 0 0 c o s φ − s i n φ 0 0 s i n φ c o s φ 0 0 0 0 1 } Rx(φ)=\left\{ \begin{matrix} 1 & 0 & 0 & 0 \\ 0 & cosφ & -sinφ & 0 \\ 0 & sinφ & cosφ &0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} Rxφ=10000cosφsinφ00sinφcosφ00001.(4.3)

R y ( φ ) = { c o s φ 0 s i n φ 0 0 1 0 0 − s i n φ 0 c o s φ 0 0 0 0 1 } Ry(φ)=\left\{ \begin{matrix} cosφ & 0 & sinφ & 0 \\ 0 & 1 & 0& 0 \\ -sinφ & 0 & cosφ &0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} Ryφ=cosφ0sinφ00100sinφ0cosφ00001.(4.4)

R z ( φ ) = { c o s φ − s i n φ 0 0 s i n φ c o s φ 0 0 0 0 1 0 0 0 0 1 } Rz(φ)=\left\{ \begin{matrix} cosφ & -sinφ & 0 & 0 \\ sinφ& cosφ &0 & 0 \\ 0 & 0 & 1 &0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} Rzφ=cosφsinφ00sinφcosφ0000100001.(4.5)
对于绕任何轴旋转φ弧度的每个3x3旋转矩阵R,迹线(有关定义,请参见898页)是恒定的,与轴无关,其计算公式为[742]:
t r ( R ) = 1 + 2 c o s φ tr(R)=1+2cosφ tr(R)=1+2cosφ (4.6)
旋转矩阵的效果可以在第62页的图4.4中看到。表征旋转矩阵Ri(φ)的特征除了在于绕轴i旋转φ弧度外,还在旋转轴i上所有的点不变。 注意,R也将用于表示围绕任何轴的旋转矩阵。 上面给出的轴旋转矩阵可以在一系列三个变换中使用,以执行任意轴旋转。 该过程在第4.2.1节中讨论。 第4.2.4节介绍了直接绕任意轴旋转。
所有旋转矩阵的行列式均为1,并且是正交的,可以使用附录A第904页上给出的正交矩阵的定义轻松地对其进行验证。这也适用于任意数量的这些变换的级联。 还有另一种求逆的方法:R- 1 i(φ)= Ri(φ),即绕同一轴沿相反方向旋转。 而且,旋转矩阵的行列式始终为1,因为矩阵是正交的。
图4.2 绕特定点p旋转的例子
图4.2 绕特定点p旋转的例子
图4.2。 由于绕点旋转的特征在于该点本身不受旋转的影响,因此变换首先通过平移对象使p与原点重合开始,这是通过T(-p)完成的。 此后跟随实际旋转:Rz(φ)。 最后,必须使用T(p)将对象平移回其原始位置。 得到的变换X,然后由式
X = T ( p ) R z ( φ ) T ( − p ) X=T(p)Rz(φ)T(-p) X=T(p)Rz(φ)T(p) .(4.7)
给出。

4.1.3 缩放(Scaling)

缩放矩阵S(s)= S(sx,sy,sz)分别沿x,y和z方向缩放因子为sx,sy和sz的实体。 这意味着可以使用缩放矩阵来放大或缩小对象。 si,i ∈{x,y,z})越大,在该方向上缩放的实体就越大。 将s的任何分量设置为1自然可以避免该方向缩放的更改。 公式4.8
S ( s ) = { s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 } S(s)=\left\{ \begin{matrix} sx & 0 & 0 & 0 \\ 0& sy &0 & 0 \\ 0 & 0 & sz &0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} S(s)=sx0000sy0000sz00001.(4.8)
第62页的图4.4说明了缩放矩阵的作用。 如果sx = sy = sz,则缩放操作称为均匀操作(uniform),否则称为非均匀操作(nonuniform)。 有时,使用等向性(isotropic)和各向异性缩放(anisotropic scaling)来代替均匀和非均匀性。 倒数是S -1(s)= S(1 / sx,1 / sy,1 / sz)。
使用齐次坐标,创建统一缩放矩阵的另一种有效方法是通过操作位置(3,3)处的矩阵元素,即右下角的元素。 该值影响齐次坐标的w分量,因此缩放矩阵变换的每个坐标。 例如,要均匀地缩放5倍,可以将缩放矩阵中(0,0),(1、1)和(2,2)的元素设置为5,或将(3, 3)可以设置为1/5。 执行此操作的两种不同矩阵如下所示:
S = { 5 0 0 0 0 5 0 0 0 0 5 0 0 0 0 1 } , S ′ = { 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 / 5 } S=\left\{ \begin{matrix} 5 & 0 & 0 & 0 \\ 0& 5 &0 & 0 \\ 0 & 0 & 5 &0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\},S'=\left\{ \begin{matrix} 1 & 0 & 0 & 0 \\ 0& 1&0 & 0 \\ 0 & 0 & 1&0 \\ 0 & 0 & 0 & 1/5 \end{matrix} \right\} S=5000050000500001,S=1000010000100001/5. (4.9)
与使用S进行均匀缩放相反,必须始终使用S’进行均质化。 这可能是低效的,因为它涉及均质化过程中的分歧。 如果右下角的元素(位置(3,3))为1,则不需要除法。 当然,如果系统总是在不进行1测试的情况下进行该划分,则不会产生任何额外运算。
s的一个或三个分量上的负值会给出一个反射矩阵(reflection matrix),也称为镜像矩阵(mirror matrix)。 如果只有两个比例因子为-1,那么我们将旋转π弧度。 当检测到反射矩阵时,通常需要进行特殊处理。 例如,当顶点由反射矩阵转换时,其顶点具有逆时针顺序的三角形将获得顺时针顺序。 此顺序更改可能导致不正确的照明和背面剔除。 要检测给定的矩阵是否以某种方式反射,请计算矩阵左上3x3元素的行列式。 如果该值为负,则矩阵是反射性的。
示例:按特定方向缩放。 缩放矩阵S仅沿x轴,y轴和z轴缩放。 如果应在其他方向执行缩放,则需要复合转换。 假设缩放应沿着正交,右向向量fx,f y和f z的轴进行。 首先,如下构建矩阵F:
F = { f x f y f z 0 0 0 0 1 } F =\left\{ \begin{matrix} fx & fy& fz & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} F={fx0fy0fz001}.(4.10)
想法是使三个轴给定的坐标系与标准轴重合,然后使用标准缩放矩阵,然后变换回去。 第一步是通过乘以F的转置即它的逆来进行的。然后完成实际的缩放,然后再变换回去。 转换如公式4.11所示
X = F S ( s ) F T X=FS(s)FT X=FS(s)FT. (4.11) T为F的上标。

4.1.4 剪切(Shearing)

另一类转换是剪切矩阵集。 例如,它们可以在游戏中用于扭曲整个场景,以产生迷幻效果或通过抖动产生模糊的反射(请参阅第9.3.1节)。 基本剪切矩阵有六个,分别表示为Hxy(s),Hxz(s),Hyx(s),Hyz(s),Hzx(s)和Hzy(s)。

第一个下标用于表示剪切矩阵正在更改哪个坐标,而第二个下标表示进行剪切的坐标。 公式4.12给出了一个剪切矩阵Hxz(s)的示例。 注意,下标可用于在下面的矩阵中找到参数s的位置; x(其数字索引为0)标识第零行,而z(其数字索引为2)标识第二列,因此s位于此处:
H x z ( s ) = { 1 0 s 0 0 1 0 0 0 0 1 0 0 0 0 1 } Hxz(s)=\left\{ \begin{matrix} 1 & 0 & s & 0 \\ 0& 1&0 & 0 \\ 0 & 0 & 1&0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} Hxz(s)=10000100s0100001. (4.12)
将此矩阵与点p相乘的结果是一个点:(px + spz py pzT。 在图4.3中以图形方式显示了单位正方形。 Hij(s)

的倒数(相对于第j个坐标剪切第i个坐标,其中i = j)是通过在相反方向上进行剪切生成的,即H -1 ij(s)= Hij(-s)。
一些计算机图形文本[348,349]使用的剪切矩阵略有不同:
H ′ x y ( s , t ) = { 1 0 s 0 0 1 t 0 0 0 1 0 0 0 0 1 } H'xy(s,t)=\left\{ \begin{matrix} 1 & 0 & s & 0 \\ 0& 1&t & 0 \\ 0 & 0 & 1&0 \\ 0 & 0 & 0 & 1 \end{matrix} \right\} Hxy(s,t)=10000100st100001 . (4.13)
但是,在此,两个下标均用于表示这些坐标将被第三坐标剪切。 这两种不同类型的描述之间的联系是Hij(s,t)= Hik(s)Hjk(t),其中k用作第三坐标的索引。 正确使用的矩阵取决于审美和API支持。
最后,应该注意的是,由于任何剪切矩阵的行列式| H | = 1,这是一个保留体积的转换。
图4.3
图4.3 用Hxz(s)剪切单位平方的效果。 y值和z值都不受转换的影响,而x值是旧x值和s乘以z值的和,从而导致平方倾斜。

4.1.5 级联转换(Concatenation of Transforms)

由于矩阵上乘法运算的不可交换性,因此矩阵出现的顺序很重要。 因此,变换的级联被认为是顺序相关的。
作为顺序依赖性的示例,请考虑两个矩阵SRS(2,0.5,1)将x分量缩放为两倍,将y分量缩放为0.5。 Rz(π/ 6)绕z轴逆时针旋转π/ 6弧度(从本书的页面向外指向)。 这些矩阵可以通过两种方式相乘,结果完全不同。 这两种情况如图4.4所示。
图4.4 这说明了矩阵相乘时的顺序依赖性。 在第一行中,应用旋转矩阵Rz(π/ 6),然后缩放S(s),其中s =(2,0.5,1)。 这样,合成矩阵为S(s)Rz(π/ 6)。 在底行中,以相反的顺序应用矩阵,得出Rz(π/ 6)S(s)。 结果明显不同。 对于任意矩阵M和N,通常认为MN≠NM。
图4.4 这说明了矩阵相乘时的顺序依赖性。 在第一行中,应用旋转矩阵Rz(π/ 6),然后缩放S(s),其中s =(2,0.5,1)。 这样,合成矩阵为S(s)Rz(π/ 6)。 在底行中,以相反的顺序应用矩阵,得出Rz(π/ 6)S(s)。 结果明显不同。 对于任意矩阵MN,通常认为MNNM

将一系列矩阵连接为单个矩阵的明显原因是为了提高效率。 例如,假设您有一个具有数千个顶点的对象,并且必须缩放,旋转并最终平移该对象。 现在,不是将所有顶点与这三个矩阵中的每一个相乘,而是将这三个矩阵连接到一个矩阵中。 然后将此单个矩阵应用于顶点。 该复合矩阵为C = TRS。 请注意此处的顺序:比例矩阵S应该首先应用于顶点,因此在合成中显示在右侧。 该排序意味着TRSp =(TRSp)))。
值得注意的是,虽然矩阵级联是依赖于顺序的,但是矩阵可以根据需要进行分组。 例如,假设您要使用TRSp计算一次刚体运动变换TR。将这两个矩阵(TR)(Sp)分组在一起并用中间结果替换是有效的。 因此,矩阵级联是关联(associative)的。

4.1.6 刚体变换(The Rigid-Body Transform)

当一个人抓住一个固体物体时,例如从桌上说一支笔,然后将其移动到另一个位置,也许移动到衬衫的口袋里,只有物体的方向和位置发生变化,而物体的形状通常不会受到影响。 这种仅由平移和旋转的串联组成的变换称为刚体变换(rigid-body transform),并具有保留长度,角度和惯用性的特征。

可以将任何刚体矩阵X表示为平移矩阵T(t)和旋转矩阵R的串联。因此,X在公式4.14中具有矩阵的外观:
X = T ( t ) R = { r 00 r 01 r 02 t x r 10 r 11 r 12 t y r 20 r 21 r 22 t z 0 0 0 1 } X=T(t)R=\left\{ \begin{matrix} r00 & r01 & r02 & tx \\ r10& r11&r12 & ty \\ r20& r21 & r22&tz \\ 0 & 0 & 0 & 1 \end{matrix} \right\} X=T(t)R=r00r10r200r01r11r210r02r12r220txtytz1.(4.14)
X的倒数计算为X -1 =(T(t)R-1 = R -1T(t)-1 = RTT(-t)。 因此,为了计算逆矩阵,对R的左上3x3矩阵进行转置,并且T的转换值改变符号。 将这两个新矩阵以相反的顺序相乘以获得逆矩阵。
另一种计算X逆的方法是将R(使R出现为3×3矩阵)和X考虑为以下符号:
公式

4.1.7 正态变换(Normal Transform)

单个矩阵可用于一致地变换点,线,多边形和其他几何形状。 同一矩阵还可以沿这些线或在多边形表面上变换切线向量。 但是,此矩阵不能始终用于变换一个重要的几何特性,即表面法线(以及顶点照明法线)。 图4.5显示了如果使用相同的矩阵会发生什么。
图4.5 左侧是原始几何图形,多边形以及从侧面显示的法线。 中间的插图显示了如果模型沿x轴缩放0.5且法线使用相同的矩阵会发生什么。 右图显示了法线的正确变换。
图4.5 左侧是原始几何图形,多边形以及从侧面显示的法线。 中间的插图显示了如果模型沿x轴缩放0.5且法线使用相同的矩阵会发生什么。 右图显示了法线的正确变换

代替乘以矩阵本身,合适的方法是使用矩阵伴随的转置[156]。伴随的计算在A.3.1节中描述。伴随关系始终保证存在。无法保证法线在变换后具有单位长度,因此通常需要将其标准化。
转换法线的传统答案是计算逆的转置[1277]。此方法通常有效。但是,完全逆不是必需的,并且有时无法创建。逆是伴随数除以原始矩阵的行列式。如果该行列式为零,则矩阵是奇异的,并且不存在逆。
即使只计算一个完整的4x4矩阵的伴随项,也可能很昂贵,并且通常没有必要。由于法线是矢量,因此翻译不会对其产生影响。此外,大多数建模变换都是仿射的。它们不会更改传入的齐次坐标的w分量,即,它们不会执行投影。在这些(常见)情况下,正常变换所需的全部是计算左上3 3分量的伴随。通常甚至不需要这种伴随计算。假设我们知道变换矩阵完全由平移,旋转和均匀缩放操作(无拉伸或压扁)的级联组成。翻译不影响正常。统一的缩放因子仅改变法线的长度。剩下的就是一系列旋转,总是产生某种形式的净旋转,仅此而已。旋转矩阵是通过其转置为逆来定义的。逆的转置可用于变换法线,并且两个转置(或两个逆)相互抵消。放在一起,结果是原始变换本身也可以在这些情况下直接用于变换法线。
最后,并不总是需要完全正常化生成的法线。如果仅平移和旋转连接在一起,则法线在通过矩阵进行变换时不会更改长度,因此不需要重新归一化。如果还连接了统一的缩放比例,则可以使用整体缩放比例因子(如果已知,或从第4.2.3节中提取)来对所生成的法线进行直接归一化。例如,如果我们知道应用了一系列缩放,使对​​象变大5.2倍,则通过将此矩阵直接转换的法线除以5.2将对其进行重新规格化。或者,要创建将产生归一化结果的正态变换矩阵,可以将原始矩阵s 3x3左上角除以该比例因子一次。请注意,法线变换在变换后从三角形派生表面法线(例如使用三角形s边的叉积)的系统中不是问题。切向量本质上与法线不同,并且总是由原始矩阵直接转换。

4.1.8 逆矩阵的计算(Computation of Inverses)

在许多情况下都需要逆,例如,在坐标系统之间来回变换时。根据关于变换的可用信息,可以使用下列三种计算矩阵逆的方法之一。

  • 如果矩阵是单个变换或具有给定参数的简单变换序列,则可以通过反转参数和矩阵顺序轻松地计算矩阵。 例如,如果MT(t)R(φ),则M-1R(-φ)T(-t)。
  • 如果已知矩阵是正交的,则M -1 = MT,即转置为逆。 旋转的任何顺序都是旋转,所以正交。
  • 如果没有特别了解,则可以使用伴随方法(第902页的公式A.38),Cramer规则,LU分解或高斯消去法来计算逆(请参阅A.3.1节)。 通常最好使用Cramer规则和伴随方法,因为它们的分支操作较少; 是否可以避免在现代体系结构上进行测试。 请参阅第4.1.7节,了解如何使用伴随来逆变换法线。
    优化时也可以考虑逆计算的目的。 例如,如果将逆函数用于矢量转换,则通常只需要逆矩阵的3x3左上部分(请参见上一节)。

4.2 特殊矩阵的变换和运算(Special Matrix Transforms and Operations)

在本节中,将介绍和导出对实时图形必不可少的许多矩阵变换和运算。 首先,我们介绍Euler变换(及其参数提取),这是描述方向的直观方法。 然后,我们谈到从单个矩阵中检索一组基本变换。 最终,得出一种绕任意轴旋转实体的方法。

4.2.1 欧拉变换(The Euler Transform)

这种转换是构造矩阵以将自己(即摄像机)或任何其他实体定向到某个方向的一种直观方法。 它的名字来自伟大的瑞士数学家Leonhard Euler(1707 1783)。
Figure 4.6. Depicting the way, in terms of the Euler transform, you turn your head,pitch, and roll. The default view direction is shown, looking along the negative z-axis with the head oriented along the y-axis.
Figure 4.6. Depicting the way, in terms of the Euler transform, you turn your head,pitch, and roll. The default view direction is shown, looking along the negative z-axis with the head oriented along the y-axis.
首先,必须建立某种默认的视图方向。 通常,它沿负z轴放置,并且头部沿y轴定向,如图4.6所示。 欧拉变换是三个矩阵的乘积,即图中所示的旋转。 更正式地说,表示为E的变换由公式4.17给出:
E ( h , p , r ) = R z ( r ) R x ( p ) R y ( h ) . E(h, p, r) = Rz(r)Rx(p)Ry(h). E(h,p,r)=Rz(r)Rx(p)Ry(h). (4.17)

4.2.2 欧拉变换参数提取(Extracting Parameters from the Euler Transform)

参考Real-time Rendering (3rd edition) p68

4.2.3 矩阵分解(Matrix Decomposition)

到目前为止,我们一直在假设我们知道所使用的转换矩阵的起源和历史的情况下进行工作。 通常不是这种情况:例如,仅将级联矩阵与某个转换后的对象相关联。 从级联矩阵中检索各种变换的任务称为矩阵分解(matrix decomposition)。
检索一组转换的原因很多。 用途包括:

  • 仅提取对象的比例因子。
  • 查找特定系统所需的转换。 例如,VRML [1310]使用Transform节点(请参见第4.1.5节),并且不允许使用任意4x4矩阵。
  • 确定模型是否仅经历了刚体变换。
  • 在动画中的关键帧之间进行插值,其中仅对象的矩阵可用。
  • 从旋转矩阵中删除剪切。
    我们已经提出了两种分解方法,一种是推导用于刚体变换的平移和旋转矩阵(请参见第4.1.6节),另一种是从正交矩阵中推导欧拉角(参见4.2.2节)。 如我们所见,检索转换矩阵很简单,因为我们只需要4 4矩阵的最后一列中的元素。 我们还可以通过检查矩阵的行列式是否为负来确定是否发生了反射。 要分离出旋转,缩放和剪切,需要花费更多的精力。 幸运的是,有许多关于该主题的文章以及在线提供的代码。 托马斯[1265]和戈德曼[414,415]各自针对不同类型的转换提出了一些不同的方法。 Shoemake [1178]改进了他们的仿射矩阵技术,因为他的算法与参考系无关,并尝试分解矩阵以获得刚体变换。

4.2.4 绕任意轴旋转(Rotation about an Arbitrary Axis)

有时使用使实体绕任意轴旋转某个角度的过程会很方便。 假设旋转轴r已归一化,并且应该创建一个使r弧度围绕r旋转的变换。 为此,首先要找到另外两个单位长度的任意轴,它们彼此正交并且与r正交,即正交。 然后将这些作为基础。想法是将基准(从A.3.2节)更改为新基准,然后围绕x轴旋转α弧度(然后应对应于r),最后 转换回标准基础[214]。 此过程如图4.7所示。
4.7

4.3 四元数(Quaternions)

尽管四元数是威廉·罗恩·汉密尔顿爵士于1843年发明的,是对复数的扩展,但直到1985年,Shoemake [1176]才将它们引入计算机图形学领域。四元数是用于构建具有引人注目的功能的变换的强大工具,并且在某些方面,它们优于欧拉角和矩阵,尤其是在旋转和方向方面。给定轴和角度表示,从四元数转换或从四元数转换都是简单明了的,而在任一方向上进行欧拉角转换都具有挑战性。四元数可用于稳定和恒定的方向插值,而欧拉角无法很好地完成这些操作。复数具有实部和虚部。每个实数由两个实数表示,第二个实数乘以√(-1)。类似地,四元数有四个部分。前三个值与旋转轴密切相关,旋转角影响所有四个部分(有关更多信息,请参见第4.3.2节)。每个四元数由四个实数表示,每个实数与一个不同的部分关联。由于四元数具有四个分量,因此我们选择将它们表示为向量,但是为了区分它们,我们在它们上加了一个帽子:q。我们从四元数的一些数学背景开始,然后将其用于构建有趣且有用的变换。

4.3.1 数学背景(Mathematical Background)

P72

4.3.2 四元数转换(Quaternion Transforms)

P75

4.4 顶点混合(Vertex Blending)

4.5 变形(Morphing)

4.6 投影(Projections)

4.6.1 正投影(Orthographic Projection)

4.6.2 透视投影(Perspective Projection)

Further Reading and Resources

One of the best books for building up one s intuition about matrices in a painless fashion is Farin and Hansford’s The Geometry Toolbox [333]. Another useful work is Lengyel’s Mathematics for 3D Game Programming and Computer Graphics [761]. For a different perspective, many computer graphics texts, such as Hearn and Baker [516], Shirley [1172], Watt and Watt [1330], and the two books by Foley et al. [348, 349], also cover matrix basics. The Graphics Gems series [36, 405, 522, 667, 982] presents various transform-related algorithms and has code available online for many of these. Golub and Van Loan’s Matrix Computations [419] is the place to start for a serious study of matrix techniques in general. See: http://www. realtimerendering.com for code for many different transforms, including quaternions. More on skeleton-subspace deformation/vertex blending and shape interpolation can be read in Lewis et al. s SIGGRAPH paper [770]. Hart et al. [507] and Hanson [498] provide visualizations of quaternions. Pletinckx [1019] and Schlag [1126] present different ways of interpolating smoothly between a set of quaternions. Vlachos and Isidoro [1305] derive formulae for C2 interpolation of quaternions. Related to quaternion interpolation is the problem of computing a consistent coordinate system along a curve. This is treated by Dougan [276]. Alexa [16] and Lazarus & Verroust [743] present surveys on many different morphing techniques.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值