《Real-Time Rendering 4th Edition》读书笔记--简单粗糙翻译 第四章 变换 Transforms
由于英语基础较弱,在阅读速度上确实有所欠缺。因此,在短时间内难以深入理解内容。不如就按照个人理解进行粗略的翻译尝试,并当作个人学习总结使用。然而,在此过程中也会发现许多不足之处较多。等到对内容有了更深的理解之后,在未来提高英语水平后再次进行细致修改和完善吧。相信花在本书上的时间和精力是值得的
———————————————————————————————
If angry vectors veer around your sleeping head, what would they form? There is no need to fear the violent abstract storm of the poor world.
当那些令人神魂颠倒的矢量计算开始时,请注意它们将你带入一个充满挑战的世界。
Transform(变换) 是一种操作,在计算机图形学中涉及点、向量或颜色值,并通过特定的方式进行转换。对于图形处理专家来说掌握 Transform 至关重要——它可赋予物体光照效果、确定摄像机的位置以及重塑形状或触发动画流程。此外你还可以将所有的计算转移到同一个坐标系中并采用不同的方法将物体投射至一个平面上。
线性变换满足向量加法和标量乘法:

举个例子,在Markdown中使用...表示数学公式时会遇到问题吗?是的(Yes),因为当我们在Markdown中使用斜体文字时会遇到问题吗?不会(No)。如果需要在Markdown中插入图片链接时会遇到问题吗?不会(No)。不过在Markdown中使用斜体文字时会遇到问题吗?不会(No)。
然而,在处理空间变换时相比之下**的情况下情况下比较小的矩阵难以满足需求因此我们需要使用更大的矩阵尺寸如前所述使用的矩阵大小会影响整个系统的性能
采用仿射变换(Affine transform)这一方法来进行数据处理。该方法一般通过一个4x4的矩阵来表示线性变化和平移操作的整合方式。在仿射变换中通常会先执行线性操作后再完成平移步骤。为了简化计算过程,在处理几何问题时我们常常用齐次坐标系统来表示四元向量这样使得点与方向向量都可以使用相同的表达形式来表示

表示,点可以用

包括所有平移矩阵在内的所有线性变换都属于仿射变换;包括旋转型、缩放型、反射型和剪切型变换在内的所有线性变换也都属于仿射变换
本章将从最基础的仿射变换展开讨论。主要列举了这一系列的变换及其相关性质(见表4.1)。在此基础上提出以下重要性质:正交矩阵的转置矩阵即为其逆矩阵。

表4.1 本章中讨论的大部分变换的总结
变换可被视为操作几何图形的核心手段。许多图形API让用户能够配置任意类型的矩阵,并提供一系列复杂的矩阵运算功能集合。尽管如此,在深入理解这些库及其背后的矩阵运算方面仍有许多值得探索的地方。掌握一个API的基本功能仅是入门阶段... 例如,在掌握正交矩阵及其逆运算时就能显著提升代码效率与简洁度
4.1 基本变换
本节主要阐述一些最基础的几何变换操作及其相关性质与应用方法。这些操作包括但不限于:平移、旋转、缩放、切变(Shearing)、刚体变换(rigid body transformation)、法线变换(normal transformation),以及求逆运算等。我们从最基础的平移变换操作开始详细探讨这些几何操作的基本实现原理与具体应用方法。
4.1.1 平移
平移矩阵T被应用于将物体从初始位置转移至目标位置 。该矩阵基于向量

平移一个物体。T 表示如公式4.3.

下图4.1是一个平移矩阵的实例。可以看到,将点

和

相乘,会生成一个新点

,这就是平移。注意向量

与T相乘没有意义,原因在于方向向量不会受到平移操作的影响.然而,点和平移变换会影响仿射变换中的其他组成部分.需要注意的是,平移矩阵的逆矩阵是其自身.

。

图4.1 在左子图中显示的方形块经过由矩阵T(5,2,0)定义的平移变换后,在x轴方向移动了5个单位长度,在y轴方向移动了2个单位长度。
需要特别注意的一点是,在计算机图形行业中经常可以看到矩阵的平移向量被存储在最后一行的位置上。例如,在DirectX中就采用了这种方式。由于这些向量和矩阵通常采用行优先存储方式,在本书中,则采用了列优先的方法来组织数据。这些差异本质上只是表现形式上的不同,并且矩阵在内存中存放时会包含16个数字中的最后四个元素作为三个平移值并附加一个1来完成变换操作。
4.1.2 旋转
旋转操作是指以特定转角围绕通过坐标系中心的旋转轴对某个向量的方向或位置进行改变 。与平移操作类似,在刚体变换中也保持了各点之间的相对距离,并未颠倒左右关系。这些操作在计算机图形学中具有广泛的应用。方向矩阵(Orientation Matrix)用于描述观察者的朝向或面向情况 ,例如,在视线对齐场景中可实现朝上或朝前的状态描述。
对于二维空间中的向量运算而言,构建旋转矩阵相对简便。给定一个向量V=(Vx, Vy),我们可以将其表示为极坐标形式:V=(rcosθ, rsinθ)。当将该向量逆时针旋转φ度后,则新的向量u的坐标为u=(r cos(θ+φ), r sin(θ+φ))。

在3D领域中常用旋转矩阵Rx(φ), Ry(φ), and Rz(φ)来描述空间中的旋转运动其分别对应于绕x轴y轴和z轴的旋转变换如公式所示

改写说明

该处展示了旋转矩阵的作用,并具备两个显著特点:其一是在围绕着i轴(即x、y、z坐标系)进行转动;其二则是位于i轴上的所有点均维持不动位置。值得注意的是,在三维空间中存在多种旋转变换形式,在这里我们主要关注并讨论了绕任意给定直线进行旋转变换的情况:这种变换可以通过结合前面所述三个基本旋转变换来实现。特别地,在后续章节中的第4章第2节详细阐述了如何根据不同的需求选择合适的旋转变换方式以达到预期效果
每个旋转矩阵的行列式的值均为1,并且它们都是正交矩阵。这也意味着任何数量的旋转变换都可以依次进行处理。通过一系列操作来实现这些变换的效果。

来表示旋转矩阵的逆矩阵**,绕着同一个轴进行反方向旋转。
例子:绕点旋转。假设围绕z轴旋转

以P为中心进行旋转变换(见图4-2),由于绕着点P进行旋转变换(即绕着位置向量p所在的位置轴线进行),因此不动点位于位置向量p处。第一步是对物体执行平移操作(即应用变换矩阵T(-p)),将位置向量p移动至坐标系的原点位置;随后执行旋转变换(即应用变换矩阵R(θ))。

进行旋转操作,最后利用平移矩阵T(P)将物体移回到原始位置。最终结果为

注意上式的矩阵顺序。

图4.2 围着P点进行旋转。
4.1.3 缩放
缩放矩阵

该物体按Sx, Sy, Sz的比例分别沿x轴、y轴、z轴进行缩放**。
这表明缩放矩阵能够放大或缩小物体。
其中Si,

此相关轴向的放大程度会随着参数增大而越显著。此外,在缩放因子等于1时将不会发生任何缩放。4.10式所示为缩放矩阵:

图4.4 描述了缩放矩阵的功能。当Sx=Sy=Sz时可被称为统一变换(uniform),而不满足此条件时则为非统一变换(nonuniform)。也可被称为等向性(isotropic)与非等向性(anisotropic)。逆运算

。
在采用齐次坐标系的情况下,在该矩阵(位于(3,3)位置)处进行相应调整是一种有效的方法来表示统一缩放矩阵的一种形式。这种方法会直接影响齐次坐标系中的W分量,并进一步影响到点在其各个轴向上的变换效果;然而这种调整不会对统一缩放的效果产生方向性的影响。例如以下两种方法分别展示了这一概念:

与S矩阵相比,在齐次空间中必须存在一个对应的矩阵S'。这可能显得效率不高。由于齐次操作涉及除法运算,在右下角元素为1的情况下可以省略除法。然而,在一些系统中为了避免判断右下角元素是否为1以减少计算开销。
如果S中的一个元素或三个元素为负数时,则被称为反射矩阵(reflection)或镜像矩阵(mirror)。当仅有两个元素等于-1时,则物体将被旋转π。请注意,在旋转变换下任意数量的旋转变换复合后的变换仍然属于旋转变换 group.

在应用反射矩阵时需经特别处理;例如,在反射矩阵作用下将一个逆时针三角形转换为顺时针三角形;这可能导致错误的照明效果及背面消隐问题;为此需要计算Reflection matrix左上角3×3子行列式的值;若该值为负,则表明该Reflection matrix属于镜像变换;如图4.12所示, 计算结果表明0×0 − (−1) × (−1) = −1
按照某一特定方向进行缩放。标准缩放矩阵仅在x、y、z轴上执行了缩放操作。若要实现某一特定方向上的缩放,则需执行复合变换。假设希望沿正交坐标系

,

和

进行缩放,则第一步是先构建出F矩阵,如下

基于F矩阵,则该变换的过程主要包括:首先将标准坐标系下的点转换至新的中间坐标系;接着执行缩放操作;最后将这些中间坐标的点转移回原始空间。

4.1.4 切变
我们称这种线性变换为剪切变换。例如,在游戏设计中运用剪切变换能够创造出丰富的视觉效果。在虚拟现实环境中使用剪切矩阵也能实现独特的空间变形效果。具体来说,在图形学领域有六种基础剪裁矩阵:包括沿X轴方向的水平剪裁、沿Y轴方向的垂直剪裁、斜向右上45度的剪裁、斜向左上45度的剪裁、斜向右下45度的剪裁以及斜向左下45度的剪裁等基本类型。

,

,

,

,

,

第一个下标代表的是用于描述切变矩阵变化的位置坐标;第二个下标则代表的是用于描述切变变换所使用的位置坐标。如公式(4.15)所示

可明确看出该矩阵属于切变变换。在该矩阵的下标位置中能够确定参数s的位置。x对应的是该矩阵中的第0行。z对应的是该矩阵中的第2列。S则位于该矩阵的第0行与第二列的交点位置。

将

和点P相乘得到新点P'

。图4.3展示了一个方块切变变换后的效果。

(i 不等于j)的逆矩阵为其反方向的切变矩阵,

。

图4.3展示了单位立方体上的切变效果。观察可得,y轴和z坐标保持不变,而x坐标增加了对应于每个点z坐标的s倍量(即x' = x + s * z),从而导致正方形呈现出斜向变形的特点。这种线性变换保持了图形的面积不变,如图所示,虚线区域所围区域的面积保持恒定

如公式4.16所示,有两个下标表示表示被第三个坐标切变。两种切变有关系:

其中作为第三个坐标轴的索引使用。需要注意的是切变矩阵的行列式始终等于1, 它保持体积不变, 如图4.3所示
4.1.5 变换结合
因为矩阵乘法中存在不可交换的现象,在这种情况下矩阵的排列顺序具有关键性作用,在串联变换的过程中也是如此。
假设存在两个矩阵 S(2, 0.5, 1)与 Rz(π/6),其中 S 使得沿 x 轴方向缩放因子为 2、沿 y 轴方向缩放因子为 0.5 并使 z 坐标保持不变;而 R 则表示绕着 z 轴逆时针方向旋转 π/6 弧度。如图 4.4 所示,在右手坐标系中这一旋转操作会将垂直平面指向外部的方向定义为正向旋转方向。当分别按照 S 后 R 和 R 后 S 的顺序进行矩阵运算时(如图 4.4 所示),所得的结果矩阵会产生不同的变换效果。

_图4.4 矩阵相乘顺序不同的例子。上面表示的是

,先进行旋转然后再缩放。下面表示的是

,先进行缩放,然后再进行旋转。可见结果不同,有矩阵的不可交换性

。_
在提升效率方面,串联矩阵扮演着关键角色。例如,在一个包含数百万顶点的游戏场景中,在整个场景中的所有物体都需要执行缩放、旋转以及平移操作。将每个顶点分别与这三个变换矩阵依次作用,则其复合效果则可由一个综合的变换矩阵来表示。其复合效果则可由一个综合的变换矩阵来表示。

。注意,这里的顺序。首先进行的是缩放变换,所以S出现在最右侧。所以有

其中P代表那些需要变换的顶点。在图形系统中,TRS通常被视为最常用的顺序
值得注意的是, 由于矩阵以顺序连接在一起的形式存在, 从而使得对矩阵的分组计算成为可能. 例如, 在执行刚体变换的过程中, 可将TR进行组合, 因此有 TRSp = (TR)(Sp) . 由此可见, 在对矩阵进行串联时遵循结合律.
4.1.6 刚体变换
当一个人握取一个实物并将其从一个位置转移到另一个位置时(例如从桌子上的铅笔转移到衬衫口袋),只有实物的方向和位置发生了转变(方向或位置的变化)。这样的操作仅涉及旋转和平移两种操作的结合,并被称为刚体变换。其特性在于保持了物体本身的长度、角度以及对称性等基本属性未发生变化。
用T(t)表示平移矩阵,R表示旋转矩阵,X表示刚体矩阵,那么有

X的逆矩阵有

也就是说求解X逆矩阵的过程只需对R左上角的3×3子矩阵进行转置操作 并将平移变换T取反 接着反转原有相乘顺序将这两个新子矩
阵依次相乘。另外一种方法则是根据公式4.18 X可表示为...

其中

表示旋转矩阵的第一列,

表示旋转矩阵的第一行。注意

表示的是一个3x1的列向量,每个元素值都为0。所以X的逆可以表达为

例子:例如,在图形学中常涉及的方向问题包括调整摄像机的方向使其指向特定的目标位置。在旧版OpenGL中常用gluLookAt()函数来实现这一功能(来自OpenGL Utility库简称GLU)。然而在现代计算机图形学中这一功能已逐渐被其他更高效的方法取代但确定物体指向目标的需求始终存在。假设有物体位于位置c处并要求该物体指向点I并给定了世界空间向上的向量u'如图4-5所示需要构建一个基坐标系{r u v}其中首先确定视觉方向

,从摄像机指向目标对象的归一化向量。摄像机朝向所对应的朝右方向有

。u'通常不能表示摄像机朝上向量,最终的向上向量还是通过计算

在向量空间中进行运算时,
因为v和r都已进行了单位化处理,
所以u同样被单位化并且与v、r保持正交关系。
为了构建摄像机的变换矩阵M,
首先将摄像机的位置平移到原点,
然后建立一个新的坐标系,
使得r方向与新坐标系的x轴对齐,
u方向与y轴对齐,
而v方向则指向z轴正方向。


图4.5中已放置于位置C的目标处于位置I,在具有方向性向量u'的世界坐标系中,请计算从相机到目标i的空间变换矩阵
注意,4.20中需要将平移矩阵T放在最右侧,因为先进行平移。
4.1.7 法线变换
该方法同样适用于对点、线以及多边形等几何元素进行仿射变换;值得注意的是,在某些情况下(如将仿射空间转换为齐次坐标系),必须先对齐次坐标进行处理才能正确应用仿射变换;此外,在某些特殊情况下(如将仿射空间转换为齐次坐标系),必须先对齐次坐标进行处理才能正确应用仿射变换;此外,在某些特殊情况下(如将仿射空间转换为齐次坐标系),必须先对齐次坐标进行处理才能正确应用仿射变换;

图4.6左侧图像展示了基础几何形状及其对应的Normal矢量,在中间图像中我们展示了该三角形沿x轴方向进行比例缩放处理后的情况,并标注了经由相同变换后的Normal矢量方向;右侧图像则呈现了准确的Normal矢量计算结果.
__
以下是改写后的文本
经过该线性变换作用后发现基向量的模长可能偏离单位长度
此方法通常表现良好
计算一个4×4矩阵的伴随矩阵是高昂的,并非必需,在此情况下平移操作不会对法线向量产生影响。大多数模型变换都会执行仿射变换操作,在这种情况下齐次坐标系中的w分量保持不变。此外,在这些操作中并不会执行投影变换操作。因此,在这些情况下法线向量可以被高效地通过计算对应的3×3子矩阵来实现转换
有时即使伴随变换出现在左上方的位置也不会被计算到其中。由平移、旋转以及无压缩或伸展的均匀缩放组成的变换矩陣被称为T。由于平移操作不会改变法向量的方向,在进行几何变换时可以忽略这部分内容而不影响结果的质量与准确性。均匀缩放仅调整法向量长度而不改变方向;其中唯一的改变部分来自于旋转变换。对于正交变换而言,在求逆时可以直接使用它的转置;因此逆运算即为转置本身。当仅涉及正交变换时这种情况下就可以直接使用原始矩陣来进行运算
归一化操作有时无需实施。当平移与旋转同时进行时,在执行几何变换后法线长度会发生变化。若采用统一缩放,则可直接应用统一缩放因子进行处理更为简便。例如,在将物体放大5.2倍的情况下,则只需将变换后的法线向量除以相应的缩放下即可实现归一化处理。
需要注意的是,在本研究中所涉及的法线变换并非直接作用于该三角形的面法线。具体而言,在该研究中所提到的面法线是由该三角形各条边矢量叉乘所得,并始终保持垂直状态。与之不同的是,在本研究中所涉及的所有切向量都是通过原始矩阵直接计算得出的结果
4.1.8 求逆运算
在各种场景中(比如),当涉及坐标系转换的过程中(如),基于变换的关键信息时(如),可用以下三种方法来计算矩阵的逆矩阵:
· 当一个矩阵是由单一的一个变换或者由多个简单变换组成的复合时 ,那么可以通过反转这些排列并分别计算每个相应位置上的逆操作来实现相应的效果 (例如AB) 。

, 那么

=

。这样简单且能保留变换的精度,这对渲染大世界的时候很有用。
· 如果已知矩阵是正交矩阵,则有

根据定义,在对称情况下,该方阵的转置即为其逆变换。
· 当已知变换缺乏有用信息时,则必须借助伴随矩阵、Cramer's rule、LU分解或Gaussian elimination等方法来计算逆矩阵。
在优化过程中通常会涉及到求逆运算。如果需要对变换矩阵进行求逆运算,则只需计算其左上角的3×3子矩阵。
4.2 特殊的矩阵变换和操作
本节将介绍关键的几种矩阵变换。
首先涉及的是欧拉变换(Euler transform),包含参数提取的过程。
一种直观描述方向的方式是通过这一方法。
从单一矩阵中解析出一组基础变换。
最后讨论如何实现围绕任意轴进行旋转的技术。
4.2.1 欧拉变换
欧拉变换是一种非常直观的方法用于确定物体的具体朝向。它的名字来源于伟大的瑞典数学家莱昂哈德·欧拉(Leonhard Euler)。
为了便于操作,默认设置视图方向较为合理。通常选择沿负z轴方向,并使头部沿y轴正方向延伸(如图4.7所示)。欧拉变换可由三个旋转矩阵依次相乘获得(如图4.7所示的三个矩阵即为此类变换的基础)。用公式E表示如下:

该矩阵可用24种不同的表达式表示。其中最常用的就是这一组表达。由于E是由一系列旋转矩阵依次连接而成,则可知E必然是一个正交矩阵,并由此可得其逆矩阵的形式为


,当然也可以直接使用E的转置矩阵。

图4.7 呈现了欧拉变换及其对head, pitch和roll的影响。在默认设置下,默认视图方向是从负z轴方向向前看,并朝着正y轴方向延伸。
欧拉角由h、p、r分别代表旋转顺序及其各自沿自身轴线的旋转角度。有时这些角度也可被称作rolls(例如,在飞行模拟中常将head视为y方向的roll)。其中head有时也被直接称为yaw**(例如在飞行模拟中)。
这种变换显然很简单,因为容易让非专业人士理解.例如,**改变头的方向与让人摇头相似,而改变pitch角的效果类似于点头的动作,改变roll角的效果则如同倾斜头部.因此我们可以避免使用笛卡尔坐标系的x, y, z轴,转而采用头的方向、pitch角和roll角来描述.需要注意的是,欧拉变换能够精确确定任意物体的方向.不仅可以在全局坐标系中应用,也可以在局部坐标系中应用.
某些欧拉角将z轴视为初始向上的方向;这种差异仅在于符号的不同,并不容易引起混淆。在计算机图形学领域存在两种不同的观点:一种主张沿z轴正方向定义上行;另一种则建议沿y轴正方向作为上行的方向。许多制造领域如3D打印技术所示;通常情况下;大多数应用都遵循沿世界坐标系的x、y、z三个正交维度来构建三维模型;其中x通常是水平向前;而y则是垂直向上的方向;这与我们在计算机图形学课程中学到的摄像机视线方向一致——即通常假设摄像机的视线沿着负y方向延伸;而焦点位于负z方向的位置上。值得注意的是;这两种坐标系统的区别主要体现在旋转90度或镜像反射90度的操作上;因此了解它们之间的差异对于正确理解和应用三维坐标系至关重要。为了避免混淆;在本教材中除非另有特别说明;否则我们将采用沿y轴正方向定义为上行的方向
需要注意的是,在相机的空间中向上方向与全局坐标系中向上方向并不一致。当相机发生旋转时(即相机Roll),观察视角会发生倾斜;此时,在全局坐标系中相机的空间向上方向与全局坐标系定义的方向也不相同。例如,在全局坐标系中,默认情况下y轴正方向为上,在向下拍摄俯视图时(即相机朝着下方移动),此时就需要将相机 pitch 转动90度;因此此时相机在全局坐标系中的向上向量表示为(0, 0, -1)。值得注意的是,在观察空间中,默认情况下依然是y轴正方向为上;但在这种情况下由于相机没有y分量(即 camera's position only has x and z components),因此相对于全局坐标系来说-z 轴成为了新的向上向量。然而,在观察空间内,默认情况下的 y 轴依然是正确的指向
尽管在某些微小的角度变化或从观察视角来看,具有显著效果的工具 欧拉角仍然存在明显的局限性。它难以实现对两组不同 欧拉 角的有效结合运用,因为这种结合并非简单的叠加关系
4.2.2 从欧拉角中提取参数
有时候,从一个正交矩阵中提取出欧拉参数(h,p,r)会非常有用。步骤如下:

这里用一个3×3矩阵来表示一个旋转运动(表现为一个旋转矩阵),而这个方法实际上替换了原本需要使用一个4×4齐次变换矩阵来进行空间变换的操作。由于在旋转运动中并不涉及平移或缩放等仿射变换的信息(除了绕原点的旋转外),因此我们只需要关注旋转部分即可。至于齐次变换中的平移分量,在这种情况下被简化为右下角的一个1元素以及其余位置为0的结构
公式4.22可表示为:

可以看到,pitch可以通过

得到。将

除以

可以得到roll,

除以

可以得到head。

因此,欧拉角h(head)、p(pitch)、r(roll)可以通过矩阵E用函数

得到:

然而,有一个特殊的情况需要考虑到**。如果

这会导致万向节产生死锁问题。roll和平头组件将围绕同一轴线进行旋转(具体来说,由于它们可能会朝相反的方向转动(这取决于参数p的具体旋转角度),因此建议在编程实现时特别注意这一点)。

还是

)。(Gimbal lock问题表明,在特定的旋转变换顺序下可能会出现姿态不可控的情况。若取定旋转顺序为先绕Y轴进行仰俯角(Yaw),接着绕X轴进行俯仰角(Pitch),最后再绕Z轴进行滚动角(Roll),那么当完成Y轴旋转变换后,在随后进行X方向旋转变换时会发现Z和Y两根坐标系重合的现象)。假设h = 0,则有R_x(\pi/2) R_y(θ) R_z(φ) v = [v_z, -v_x, -v_y]^T。

因为p不会影响到第一列,如果,则可以用

,得到

。
注意arcsin的定义,p的取值区间为

这表明,在这种情况下(此处插入具体条件),则无法提取相应的参数。其中h、p、r三个参数并非唯一确定,在不同的欧拉角组合下仍能获得相同的结果。这种方法虽然会导致数据出现不稳定性问题(此处插入具体影响),但这种缺陷可有效降低系统性能消耗。
从公式4.26也可以看出万向节死锁,如果

,例如

时,在这种情况下(其中k属于整数),会导致一个轴向自由度的丢失;这是因为矩阵仅依赖于一个角度。

或者

。
虽然规定了欧拉角在模型系统中的旋转顺序通常是x/y/z的形式;然而,在实践中仍然广泛使用欧拉角这一方法论体系(Euler angles framework),特别是在曲线编辑器中。比如,在动画制作中通常采用z/x/y的旋转次序来实现效果;而由于万向节奇点的存在,并没有任何一种固定的旋转顺序能够完全消除万向节奇点(gimbal lock)现象。
一个潜在的限制在于:例如,在使用虚拟扳手时(如绕x轴旋转),若输入设备(如鼠标或虚拟手套)提供的旋转变换可能存在偏差。这是因为仅需绕x轴旋转即可完成螺丝固定工作。为了防止这种情况的发生,请通过提取出欧拉角h、p、r来进行校准,并生成一个新的精确变换矩阵以确保准确性。

。这样绕x轴旋转就变得很简单了。
4.2.3 矩阵分解
到目前为止的研究都基于假设已知所使用的变换矩阵这一前提条件进行展开。然而实际情况往往并不总是如此可依赖的例子包括只知道一些由一系列连接而成的复杂系统中的一些整体性质而无法直接掌握其内部细节的情况。通过分析这些复杂的系统能够发现其中潜在的规律性并将其转化为具体的操作步骤这一过程通常被称为系统的建模与分析过程
到目前为止的研究都基于假设已知所使用的变换矩阵这一前提条件进行展开
分解矩阵的原因有很多:
· 提取出物体的缩放因子。
· 找出一些特定系统的变换。(例如一些系统不允许使用任意的4x4矩阵)。
· 确定模型是否只进行了刚体变换。
· 插值动画的关键帧。
· 从旋转矩阵中去掉切变。
该领域已发展出两种分解方法,在刚体变换过程中,通常会分离出平移分量和旋转分量;而另一种方法则通过分析正交矩阵的结构特性来获取欧拉角参数。
可以看出,在处理过程中相对而言较为简单的便是分解一个4x4矩阵的最后一列对应的元素即可得到所需信息。此外,在计算过程中可以通过观察该矩阵行列式的符号变化来判断是否存在反射现象。相比之下,在分解这些变换时需要考虑的因素更多
4.2.4 绕任意轴旋转
假设现在需要物体绕一个任意轴旋转。旋转轴为r,已归一化,旋转角度为

。
第一步需要一个旋转变换来将物体变换到新的空间,在这个新空间中将转轴r重新定位为x轴方向。接着完成绕该新x轴的最终旋转操作。最后通过相应的逆变换矩阵来恢复物体在原始坐标系中的位置与姿态。

变换回原来空间。这个过程如图4.8所示。

图4.8围绕任意轴r进行旋转变换。随后借助Transform Matrix M确定了正交基底向量r,s,t。接着将此正交基与标准坐标系的x轴进行了对准处理。最终通过反向变换Matrix M完成了坐标系的还原过程。
为了求得M值的实现, 需要确定与r轴互相垂直且相互之间也互相垂直的另外两个坐标轴.一旦确定了第二个坐标轴s, 相应的第三个坐标轴t则可以直接通过计算r与s的叉乘得到.

一种较为稳妥的方式是确定r的最小绝对值分量,并将其设为零。接着将这两个分量中的一个取反。数学表达式如下:

这样保证了

和

是垂直的,(r,s,t)就是正交基。然后利用这三个向量构建出一个旋转矩阵。

这个矩阵将向量r与x轴对齐, s与y轴对齐,t与z轴对齐.那么围绕着r进行旋转.

度就变成在新坐标系中对x轴旋转。

Goldman提出了另外一种绕任意归一化轴r旋转

角度的方法。其中的变换公式如下:

4.3 四元数
虽然Sir William Rowan Hamilton在1843年将四元数(quaternions)作为复数的一种扩展而提出这一概念, 但直到1985年Shoemake才将其成功引入到计算机图形学领域. 四元数在多个方面具有显著的优势, 它能够有效地表示三维空间中的旋转向量及其方向. 任何一个三维方向都可以表示为围绕某一固定轴进行单一旋转变换. 当确定了该特定轴以及相应的旋转角度后, 将其转换为四元数形式则非常简便, 这一过程对欧拉角而言则显得相对复杂. 此外, 四元数值计算过程中还能够实现连续且稳定的三维方向插值过程, 这一特性使得它远胜过基于欧拉角的方法.
复数分实部和虚部。 每个部分都由两个实数表示,第二实数需要乘以

同样的情况下,在讨论四元数时需要特别注意其结构特点:它是由四个构成要素组成的有序集合,在这种情况下需要注意的是其内部各要素之间的相互关系及其作用范围的变化情况:其中前三者与旋转轴之间存在密切的关系而第四者则会对整体表现产生显著影响

。
4.3.1 数学背景
下面先聊下四元数的定义。
定义。四元数可以用下列方式定义,都是等价的。

变量

被称为四元数

的实部,而

称为虚部,i,j,k称为虚部单元。
对于虚部,在处理虚部时我可以应用所有常规的向量运算操作如加法、缩放、点积与叉积等

和

相乘,如下所示。需要注意,虚部单元的相乘是非交换的。

从上面的等式可以看出,用到了点乘和叉乘。
基于四元数的定义,在此之外还可以提供加法运算、共轭元素、模长以及单位元素

对范数

,虚部被消除,只剩下实部。范数有时候也用

表示。通过上面的这些公式可以推导出四元数的逆

。满足

。从范数的定义推导出一个公式如下:

再推导出

四元数和常数的乘法满足交换律:

,

,所以有

。
下面介绍下规则:




单位四元数

,也就是

。

也可以写成:

其中三维向量有

,因为

当且仅当

。单位四元数是非常适合用于创建旋转和方向。
对于复数,一个2维单元向量可以写成


。所以四元数可以表示为

单位四元数的log函数和power函数 如下:

4.3.2 四元数变换
接下来深入探讨其子类——单位四元数。其关键点在于它能够实现任意三维空间中的旋转操作。
首先,将一个点或者一个向量的四个分量

组成一个四元数

。假设现在有单位四元素

,则有:

将点p绕着

旋转

。注意,因为

是单位四元数,所以有

。见图4.9。

_图4.9 单位四元数


,绕

旋转

度。_
任何非零实数乘以

所表示的变换和

表示的变换一样,也就是说

和-

表示的旋转是一样的。也就是说将

取反,实部

求其反元素后重新计算得到的新四元数与原四元数所代表的空间旋转效果等价。由某个矩阵可导出的单位四元数能够表示该空间中相应的旋转操作。

也可以是-

。
给定两个单位四元数

和

,先应用

,再用

,则有:

在这

,是一个串联了

和

的单位四元数。
矩阵变换
由于通常需要将多个不同的变换结合起来处理,并且大多数情况下以矩阵的形式出现。其中一种具体的方法就是公式(4.34)。一个四元素群可以有效地表示三维空间中的旋转操作。

可以用公式4.45转换成矩阵

:

其中s是标量,

。而对单位四元数可简化为:

当四元数被成功构建后, 就不再依赖三角函数, 在实际应用中的处理效率得到了显著提升.
从正交矩阵

转换到成单位四元数就稍微复杂点。从公式4.46可有:

如果知道了

,就可以算出四元数剩下的三个元素,也就知道了四元数

。可以算出

该矩阵的所有对角线元素之和被称为其迹,并标记为tr(A)

对单位四元数有:

为了保证稳定性,被除数需要避免太小 。因此,设

,则有:

如果知道

,

,

,

谁最大,也就知道了

,

,

,

谁最大。如果

是最大的,公司4.49 就可以用来计算四元数。另外需要注意:

可以用4.51计算出

,

,

谁最大。这样就可以避免使用除法计算出四元数。
球面线性插值
球面线性插值是:利用两个单位四元数

和

及参数

进行插值计算。这一技术对动画制作非常有帮助。然而,在处理插值摄像机的方向时并不奏效,因为摄像机的'向上'方向在应用时会发生倾斜,如果不加以注意就容易出现错误。
这种操作的代数表现形式是一个复合四元数

,如下:

然后在一些软件内部实现中,用slerp表示球面线性插值:

其中

有

。对参数

,slerp计算出的插值四元数,组合在一起构建出了从

到

的四维单位球的最短弧。这个弧位于

和

在由平面与四维单位圆相交所确定的圆上

图4.10展示了单位四元数在单位球面上的位置。slerp算法被用来计算两个四元数之间的插值过程;其结果表现为连接这两个点的一段弧线。需要注意的是,在某些情况下可能会出现路径不连续的情况

到

的插值和从

到

再到

的插值不是一回事,虽然最后到达同一个方向。_
该算法特别擅长在两个不同方向之间实现平滑插值。\n在这种情况下运行良好。\n如果采用欧拉角表示可能会遇到问题。\n其核心在于直接计算时必须依赖三角函数运算。\n这使得计算过程相对耗时。\nMalyshau提出了一种优化方法,在渲染管线中应用四元数来进行插值计算。\n这种方法特别适用于优化渲染效率。\n从而有效防止了万向节奇异现象的发生。\n这种处理方式能够在视觉效果上维持较高质量
如果超过两个方向,有n个方向

,并且希望从

插值到

再到

,一直到

。用slerp是一个简单直接的方法。但是当到达

的时候,需要用到

,紧接着到

,又需要用到

,这样会引起抖动,如图4.10所示。这点做线性插值的情况很像。
一种更好的方法是利用样条曲线(spline) 。在

和

间引入四元数

和

。就可以用

和

做球面三次插值(Spherical cubic interpolation)。

和

的计算如下:

三次球面插值公式如下:

可以看出,squad函数 是通过 slerp 实现三次球面插值的过程。这些插值路径沿着起始方向展开。

,

,而不会通过

,而

可以用来表示初始方向

的切线方向。
从一个方向旋转到另外一个方向
一种常见的操作通常是通过最短路径将一个方向s转移到另一个方向t上。借助四元数这一过程得到了有效的简化。第一步是对s和t进行标准化处理。接着计算得到单位旋转轴u

。然后

,

,其中

是s和t的夹角。从s旋转到t的四元数可以表示为

。实际上,可以简化为

。利用半角公式和三角恒等式有:

这种生成四元数的方式能够防止s和t趋近于同一方向时出现计算不稳定性

几乎可以忽略不计的低值水平。然而,在s与t方向相反时仍存在问题。除了上述特殊情况外,在任何垂直于s的方向上都可以选择一个合适的轴来进行旋转操作到达t位置。
有时需要用矩阵来表示从s旋转到t。通过公式4.46可有

其中一些中间计算如下:

在这些运算中没有平方根或三角函数的存在;值得注意的是;其中4;57与4·30极为接近;但4·57无需应用三角函数。
需要注意当s和t平行或者反向的时候,因为这种情况下

。如果

,可以返回单位矩阵。然而如果

,可以围绕任意轴旋转

。这个旋转轴可以通过对s和任何与s非平行的向量叉乘得到。
4.4 顶点混合
想象一下,在虚拟角色的身体结构中,手臂部分被划分为前臂和上臂两部分,并如图4.11所示展示。该模型能够通过刚体变换实现流畅的动画效果。然而,在这两个组成部分之间形成的连接部位并不像真实的肘部那样灵活可靠。这是因为关节部分是由两个不同的对象所共享的重叠区域所构成的。显然地,在这种情况下最好只使用一个单一的对象进行建模。然而,在静态模型中单独处理各个部件仍然无法解决关节灵活性的问题
为了应对这一问题,在计算机动画领域中顶点混合(Vertex blending)被广泛采用作为一种主流技术。这种方法还有其他几个别称可供参考:例如线性混合蒙皮(linear-blend skinning)、**包络法(包络线性 blend skinning)以及骨骼子空间变形(skeleton-subspace deformation)**等名称。尽管目前尚不清楚该算法的确切起源与提出者是谁,定义骨骼并使皮肤对形态变化作出反应一直是计算机动画领域的经典思路之一。在最基础的形式中,前臂与上臂各自独立进行动画处理,但在关节部位通过一个富有弹性的连接层进行协调,从而实现了局部区域由不同矩阵控制的情况——即一组顶点由前臂矩阵控制,另一组则由上臂矩阵控制,这种机制使得单个三角形可使用不同矩阵来进行变换效果,而不是每个三角形都仅有一个统一的矩阵应用。

第4.11节中左侧图形展示了由前臂与上臂构成的手臂结构,在肘关节处形成重叠区域。该部位呈现不自然的效果是因为通过独立的刚体变换矩阵实现动画效果时,在肘部区域出现了明显的变形现象。右侧图形采用单一对象并结合顶点混合技术实现手臂构造,在这一设计中右侧图形展示了将单一皮肤直接连接两部分覆盖肘部的情况,并通过不同权重(2/3和1/3)进行顶点混合处理:其中上臂部分占据2/3权重而前臂仅占1/3。从右侧图形可以看出这种顶点混合方法存在不足之处——由于局部区域过度拉伸导致肘部内部出现明显折叠现象。为了进一步优化这一效果可以通过引入更多骨骼系统并优化各部分之间的权重分配以获得更为平滑流畅的表现效果
此外,在现代三维建模软件中提供了更为灵活的功能选项。具体而言,在进行网格变形操作时可以选择多种不同的变形方式:既可以对单个控制网格进行独立操作以达到局部变形效果;也可以对多个控制网格依次叠加变形以获得复杂效果;还可以同时施加两种甚至更多的变形方式并结合使用以实现更为精细的效果控制。这种方法的核心在于将复杂的几何形变分解成一系列简单的线性变换操作并建立它们之间的关系网络从而使得最终的结果可以通过综合运用这些基本变换而得到理想的视觉效果

图形4.12展示了顶点混合的真实示例。左上方显示了一个手臂由两个骨骼组成的结构,并位于伸展的位置。右上方显示的手臂网格模型使用颜色区分了两块骨骼。下方呈现的是经过渲染后的弯曲的手臂结构。
在数学上,可以用4.59表示,其中p是原始顶点,

为转换后的顶点,其位置随着时间变化。

有n根骨骼会影响到p在世界空间的位置。

是每个骨骼影响到p的权重。

通过将p从模型空间变换到世界空间完成相应的操作流程

第i个骨骼的世界变换通常由多个矩阵依次连接组合而成,并会随着时间的推移而发生变化。
Woodland深入讨论了一种维护和更新

该动画函数基于矩阵运算机制。每个骨骼体通过自身所处的局部坐标系将一个顶点的位置信息转换为全局坐标。随后对该顶点应用插值算法计算出最终定位坐标。矩阵

在蒙皮的时候没有被详细说明,而是经常被认为是

其中一部分内容特意拿出来是因为其重要性,在矩阵串联过程中通常作为组成部分出现。
顶点p通过不同骨骼的串联矩阵进行变换,然后用权重

将各顶点映射至相应位置后再执行插值运算的方式即为顶点混合方法。其约束条件包括权重系数非负并且其总和等于1。经过上述处理后得到的新位置坐标u将在该集合内确定

的凸包内。法线也可以用公式4.59进行转换。 如果骨头被拉伸或压扁的严重,

的逆转置矩阵可能会用到。
顶点混合最适合适合GPUs。网格中的一个顶点集合可以被放置在一个静态缓冲区中,在每一帧内一次性被发送给GPU并循环利用。当模型的所有骨骼矩阵能够共同使用时最为简单,在这种情况下模型无需分割且可复制骨骼矩阵。然而如果不满足这一条件,则需要将模型分割并复制部分骨骼矩阵以供使用。此外骨骼变换可以通过存储在可访问的纹理中来避免达到寄存器存储上限,在这种表示法下每个变换都可以存在于两个纹理中。如果硬件支持的话UAV(无序访问视图)也可以存储变换结果以减少内存占用。
参数也可以超越[0,1]区间,并且其总和不一定等于1。然而,在采用特定混合算法(如第4.5节所述的morph变形方法)时才具有实际意义。
顶点混合的一个局限性在于可能会导致这些不必要的情况的发生

每个顶点都经历着类似的变形过程。为了确保精确度和稳定性,在运算过程中每一步骤都需要高度协调配合。为此我们采用了预设每个顶点对应的旋转基准点的方法,并采用刚体约束技术以防止臂部下垂以及类似‘软包装效果’的形变发生。在运算过程中该算法与线性蒙皮混合方法相仿图形处理器首先对各旋转基准点进行线性蒙皮处理随后完成四元数插值计算

图4.13 图表左侧直观地呈现了线性混合蒙皮导致关节问题的现象。相比之下,图表右侧采用的对偶四元数方法则有效规避了这些问题.
4.5 变形
形态转换技术(Morphing) 当一个三维(3D)动画模型被播放时,在以下场景中:当其中一个形状逐步变换至另一个形状的过程中,“想象一下,在这种动态过程中会发生什么有趣的现象”。

时刻,展示的是模型A,等到

时刻则变成了另外一个模型B。而在

到

在这段时间里,模型持续进行类似于插值变换的操作(mixed)。通过图4.14可以看出这是一个模型变形的过程。

如图4.14所示,在顶点变形过程中展示了其几何结构变化情况。每个顶点包含两个坐标位置参数以及一个法线向量。在每一帧渲染周期中,在着色阶段会对每个顶点的坐标参数及其对应的法线向量执行插值计算。
变形过程需要应对顶点对应问题和插值问题这两个关键问题。
当涉及两个模型时,
可能存在拓扑结构差异以及顶点数量上的不同,
并且网格连接模式也存在差异,
通常会建立这些顶点之间的对应关系。
这确实是一个挑战性的问题,
在相关领域已有诸多研究致力于解决这一难题。
当两个模型之间建立了一一对应关系时,则可以在每个顶点处进行插值计算。对于第一个模型中的每一个顶点,在第二个模型中也只能存在唯一对应的顶点(反之亦然)。

,首先计算

,然后进行线性顶点混合:

其中

和

是同一个顶点在两个不同时刻的值。
morph targets 和blend shapes 是两个常用的方法。原理如图4.15所示。

图4.15展示了两种不同的开口形态;通过一组独特的向量来进行插值计算,在morph targets方法中;将这些向量应用于基准模型;赋予每个向量一个正权重;这会产生一个笑容的面部形态;而负权重则会带来相反的效果。
从一个中性模型( neutral model )开始,在上图的例子里是一张脸,用

来表示。此外,我们还有一组不同的脸型(face pose)。假设有k个不同的脸型,

,

。设

,即用每个变形后的脸型减去一开始的中性模型。
这样,如果有了一个中性模型

和一组姿势(pose)

,那么新的变形模型可以用下面的公式算出:

如图4.15,如果

可得到一个微笑的脸,

会得到一个半微笑的脸,以此类推。也可以用负值或大于1的值。
对这个简单例子来说,在对眉形应用一个负值权重即可获得一个快乐的眉形。因为位移属于附加元素,在设计眉毛时将其考虑进去会使眉毛姿势与微笑时嘴角的位置协调一致。
Morph targets是一种极具力量的技术,并能为动画师提供极大的帮助。Lewis等开发者提出了姿势空间变形(Pose-Space Deformation)这一技术,并将其与Morph Targets相结合。Senior采用预先计算的顶点纹理来存储和检索不同姿势之间的位移数据。
图4.16展示了一个同时使用了蒙皮和变形的例子。

该图表展示了inFAMOUS Second Son角色Delsin的脸部特征,并采用了 blend 形状技术进行建模。所有照片均采用了相同的坐姿作为基准面,并通过调整面部权重来呈现不同的表情变化。
4.6 几何缓存重播
为了实现高质量的过场动画效果,在制作过程中通常需要采用高精度的画面呈现技术。与现有技术相比难以完美呈现的动作可以通过其他方式实现效果。一种简单的方法是记录每一帧中的所有顶点信息并将这些数据存储到硬盘上用于更新网格结构。然而,在拥有3万个顶点的简单模型中,则需要达到每秒50MB的数据存储能力。Gneiting提出了一种能够减少约10%数据量的方法供选用。
首先,在量子化(quantization)过程中,我们通过16位整数编码坐标位置和纹理坐标。这一过程不可避免地会带来数据损失(loss),因为压缩后无法完全恢复原始信息。为了进一步减少数据量,在时间维度上进行预测编码也是必要的。具体而言,在空间压缩阶段可借助**平行四边形预测(parallelogram prediction)**这一方法。对于一个三角形带(triangle strip),我们采用如下策略:基于当前三角形对应边的镜像反射点作为下一个顶点的位置估计值,并计算该预测点与实际位置之间的差异值进行编码。这种策略能够有效降低差异值大小,在理想情况下大多数差异值接近于零(zero)。此外,在时间维度上也可以进行预测编码:每隔一定帧数执行一次压缩操作。例如,在n帧到n+1帧之间使用delta向量表示顶点移动量的变化规律,并以此减少存储需求的同时实现实时数据流传输
4.7 投影
在真实渲染前的预处理阶段中,系统需将场景中的所有物体投射到特定表面或者单一几何体上。随后执行裁剪操作以及绘制过程以生成最终画面
到目前为止为止,在本章中我们尚未涉及第四坐标w分量的处理工作。这表明,在变换操作后点与向量的属性类型得以保留。然而,在4x4矩阵运算中存在一个显著的区别:透视投影矩阵不同于其他情况,在其运算过程中会使用到该第四坐标,并且必须执行齐次化处理步骤。具体而言,在该过程中通常会令w值为1(除非另有特别说明),因此在得到齐次空间后还需将其转换为非齐次空间以获得最终结果点坐标。而正交投影操作则相对简单,在这种情况下该第四坐标不会对变换结果产生影响。
许多计算机图形学库和渲染引擎(如DirectX)采用左手坐标系,默认情况下将空间中的点定义为其到视点的位置关系这一特点与之不同
尽管采用了不同的坐标系统设定(右手与左手),但它们都能有效地实现相同的视觉效果
4.7.1 正交投影
平行线在经过正交投影作用后仍保持其平行性。当使用正交投影观察场景时,在不管场景中物体与摄像机之间的距离如何变化的情况下(即不管距离如何),摄像机中的物体大小都会保持不变。下面的矩阵

这是一个简单的正交矩阵,在应用时能够保证x分量和y分量保持不变的同时将z轴上的分量被置零进而实现对平面z=0的正交投影

正交投影的效果如图4.17所示。很明显**,

没有逆,因为它的行列式

另一种方式是将物体从三维空间转换为二维图形。存在一个问题在于该方法会将所有点(不论其z坐标的正负值)映射到同一个平面上。通常的做法是将z轴限定于特定范围内,在近平面n和远平面f之间进行处理。

图形 4.17 展示了 orthographic 投影的三个典型视图。当观察者沿-z 方向注视物体时,默认情况下 x 和 y 坐标保持不变,并将 z 值设为零。在平面 Z=0 上被投射的所有物体都位于该平面上(忽略 z 值的正负区别)。
正交投影的一个常见矩阵为

,分别位于左右前后近远六个方向上,并构成了轴对齐边框(AABB包围盒) 。请指出该AABB包围盒的最小点是什么。

,最大点为

。需要知道

,因为是摄像机是沿着-z轴往前看的。
在OpenGL中使用轴对齐边框的最小点是(-1,-1,-1),最大点是(±[±] [±] [±])= (±[±] [±] [±])= (±[±] [±] [±])= (±[±] [±] [±])= (¹,¹,¹)。同样的,在DirectX中使用轴对齐边框时最小点为(-¹,-¹,0),而最大值仍然是(¹,¹,¹)。这些概念构成了规范视图体元(canonical view volume)的基础,在规范视图体元下定义的空间称为规格化设备坐标(NPC: normalized device coordinates)。如图4.2所示的是这一转换过程的具体实现。规范视图体元的作用在于提高裁剪效率。

图4.18展示了将一个轴对准包围盒映射至规范化视觉空间的过程。首先将包围盒中心与原点重合,并随后缩放其尺寸。
在完成转换之后

如上式所示,可以是由变换矩阵和串联而成,其中,。矩阵是可逆的,。
在计算机图形学领域中,在经过投影变换后的场景通常会转换为左手坐标系,并且视口方向与正z轴一致。x轴的方向向右、y轴方向向上,并且在定义AABB(Axis-Aligned Bounding Box)时,默认far值小于near值。然而,在这种情况下需要考虑正交投影通常都会伴随一个镜像变换(mirroring transform)的过程。

可见公式4.64给了一个镜像变换,把右手坐标系变成了左手坐标系。
在DirectX中设定z值的范围为0至1,在OpenGL中则设定为-1至1。通过应用一个简单的矩阵可以在正交投影后解决问题。

所以在DirectX中的正交投影矩阵为

由于在DirectX中,默认使用行向量表示矩阵,在实际应用中,经常需要对矩阵进行转置操作。
4.7.2 透视投影
相较于正交投影而言,透视投影更具复杂性。在这里可以看出,在这一过程中这些原本相互平行的直线经过变换后将不再保持原有的平行状态,在远处会汇聚形成一个点。值得注意的是,在这种情况下人们会发现一种有趣的规律性现象:当物体离观察者越远时(即离得远了感觉变小了),它所呈现的大小也会相应减小
首先,将物体投影到平面z=-d上,d > 0。
假设摄像机位于原点,需要将点p投影到平面z=-d上,d>0,新形成的点为

。过程如图4.19所示。从图中的三角形可得出

相应的

,

。组合在一起有投影矩阵

:


如图4.19所示,在推导透视投影矩阵的过程中采用了该方法。p点经过z=-d平面(其中d>0)上的投影后得到q点。 投影操作基于摄像机所在的位置,在本例中该位置被设定为坐标系的原点。
透视投影矩阵如4.69所示,

最后一步是将整个向量除以w分量,本例中是

,让最后一个值为1。
很明显为什么透视投影用的是齐次坐标,几何上的解释是将点

投影到平面w=1上。
和正交投影相仿的是透视投影也能够将视图转换至规范化可视空间。然而实际上它并非直接投向一个平面(这种映射不可逆),而是将视截体(frustum)转换至规范化可视体积(canonical view volume)。这里所涉及的视截体是从观察者视角出发的一个三维几何形状

开始到

结束,

。在z=n所在矩形内有最小点

和最大点

,如图4.20所示。

图4.20 利用矩阵

该系统通过将三维物体从视图锥体映射至单位立方体来实现数据处理,并将其命名为规范化可视空间(canonical view volume)。
参数

平截头体是由摄像机所确定的核心部分。
水平区域则由该几何形状底面与顶面共同确定。
垂直区域则是由该几何形状左右平面所界定。
FOV(field of view)越大,则相机能够捕捉的画面范围越广。
如果某个参数满足特定条件,则会影响最终图像的质量表现。

或

,平截头体会不对称,可用于立体视觉( stereo viewing)和虚拟现实。
对于提供场景感来说, FOV 十分关键。相较于计算机屏幕而言, 在人眼中存在一个物理上的视场角(FOV)。关于 FOV 而言,


表示视场角(Field of View, FOV)。其中w代表垂直于视线方向的物体宽度,d代表物体到观察者的距离。例如,通常情况下,25英寸显示器的实际宽度约为22英寸。当观察者距离屏幕12英寸时,水平视场角约为85度;在距离屏幕约20英寸时,则视场角减少至约58度。在30英寸外观看屏时,水平视场角进一步缩小至40度左右。此外,同样的数学公式可用于将镜头尺寸转换为相应的视场角。例如,35毫米的相机镜头(具有36毫米宽的底片尺寸)对应标准50毫米镜头时,其视场角是多少呢?

度。
采用120mm广角镜头相比物理FOV(35mm固定镜头)会导致空间变形减少。而设置更广角度拍摄时会引入透视失真现象,在图像边缘区域物体会显得被过度拉伸。相反地,在使用超广角镜头时虽然视野范围扩大但可能会使图像中的主体发生形变。
将平截头体转换到单位立方体所使用的透视变换矩阵为

点p转换后为点

,w分量为

,通常不为0也不等于1。为了拿到正确的投影点p,需要除以w分量

,有

超出视口范围的物体将不会出现在屏幕上,在透视投影中,默认将远处的平面视为无限远处,并按照图4.73所示的矩阵运算方法进行处理以实现成像效果

综上所述,经过透视投影

接着进行裁剪操作和齐次除法(通过将坐标值除以w来实现),最终获得规格化的设备坐标(NDC)。
为了得到OpenGL中的透视投影,首先需要乘以

基于同样的原理,在应用镜像变换后(经过镜像变换后),公式4.71中的第三列数值将被取反(将被取反)。经过镜像变换后(经过镜像操作后),近平面与远平面的数值将变为正值(会变成正数)。

然而,在观察者的视线方向上(即世界坐标系中的负z轴方向),它们仍表示沿着世界坐标系的方向延伸的距离。OpenGL对此进行了详细的数学描述

还有一个更简单的方法是用FOV(

),屏幕宽高比

(w和h是屏幕分辨率),

及

。结果如下

其中,

。
在许多编程接口中(如 DirectX),通常会设置一个视口来定义观察体。该视口决定了观察体中的场景元素会被裁剪并投射到屏幕上。具体来说,在 DirectX 中,默认情况下会将近 clip 平面设于 Z 值等于零的位置(即 z=0),而远 clip 平面则设于 Z 值等于一的位置(即 z=1)。此外,在 DirectX 中,默认采用的是左手坐标系来进行投影变换。这种设计使得其沿着 Z 轴的正方向延伸至远 clip 平面,并且其对应的 near clip 平面和 far clip 平面具有正值。

透视投影可用来计算深度值, 不随输入

值进行线性变化。通过公式4.74-4.76乘以点p,会得到如下结果

在其中,在x和y的值被简略处理的情况下,在常数d和f基于所采用的矩阵进行计算时。若采用第4.74式,则…

,

,

,为得到NDC中的深度值,需要除以w分量,结果有

其中对OpenGL有

。可以看到,输出的深度值

和输入

成反比。
图4.21揭示了调整近平面与原点间距所带来的结果。事实上无论是近平面还是远平面,在Zbuffer中都会影响到其精度。

图4.21 改变近平面和原点之间距离。

为了维持深度值为100不变,在NDC坐标系下,
离原点越近的位置使用较小的深度值范围;
而远离原点的位置则使用较大的深度值范围。
这种设置会导致Z缓冲区在远处的空间分辨率降低。
有几种方法可以提高深度值的精度。常用的是 reversed z ,用

表示深度。可以在图4.22中看到对比效果。

图4.22 上图展示了在DirectX中创建深度缓冲区的不同方法,

_。左上:典型的整数深度缓冲区配置,在4bit的精度范围内(即数值范围从0到15),可以在Y轴方向观察到16个刻度标记点。右上:将远平面设定至无限远处(即Z=∞),与左上方对比时发现精度损失并不显著(约5%)。左下:采用3位指数和3位小数来表示浮点深度值(即阶码占用了高位的前三位),观察发现Y轴方向的分布呈现非线性特征(即刻度间距不均匀),这会导至X轴方向的分布状况进一步恶化(即空间分辨率下降明显)。右下:应用反向浮点深度映射技术,

,可以得到一个更好的分布。
该方法采用了深度值的对数以提升阴影贴图精度 。**该研究团队基于前一帧的Zbuffer计算出近平面与远平面范围。**针对屏幕空间深度坐标变换问题,Kemen采用了以下数学表达式来进行顶点重映射运算

其中,w是经过透视投影后w分量的值,z是顶点着色后的z值。常数

,其中

注

,然后进行插值,然后在片元着色中修改每个片元的深度值为

,其中

属于指数插值的一种,在GPU无法处理浮点数深度的情况下,并且在需要计算具有较大范围深度的情况下这一方法具有较高的适用性
该方法由Cozzi提出,并通过分段使用多个平行六面体制作显著提升精度。随后将整个视锥分解为几个互不重叠的小平行六面体,在开始渲染之前,请确保先清空颜色缓存并调整深度缓存,并按层次归类所有待绘制对象至相应的平行六面体内。针对每个小块设定相应的投影矩阵参数,并依次处理它们。针对每个小块设定相应的投影矩阵参数,并依次完成所有小块的绘制操作即可完成整个场景的显示过程。
