📌
Foundations of 3D CG
  • 前言
  • I 基础入门
    • 第一章 简介
    • 第二章 线性
    • 第三章 仿射
    • 第四章 坐标系相关性(Respect)
    • 第五章 图形学中的坐标系
    • (WIP) 第六章 Hello World 3D
  • II 旋转与插值
    • 第七章 四元数(有点技术性)
    • (WIP) 第八章 球形:轨迹与弧
    • (WIP) 第九章 平滑插值
  • III 相机与光栅化
    • 第十章 投影
    • 第十一章 深度
    • 第十二章 从顶点到像素
    • 第十三章 变化变量
  • IV 像素及其相关内容
    • 第十四章 材质
    • 第十五章 纹理映射
    • 第十六章 采样
    • 第十七章 重建
    • 第十八章 重采样
  • V 高级话题
    • 第十九章 色彩
    • 第二十章 什么是光线追踪
    • 第二十一章 光(偏技术)
    • 第二十二章 几何建模:基础简介
    • 第二十三章 动画:甚至不能称之为简介
  • 附录
    • A Hello World 2D
    • B 仿射函数
Powered by GitBook
On this page
  • 4.1 坐标系的重要性
  • 4.2 多重变换
  • 练习

Was this helpful?

  1. I 基础入门

第四章 坐标系相关性(Respect)

Previous第三章 仿射Next第五章 图形学中的坐标系

Last updated 4 years ago

Was this helpful?

4.1 坐标系的重要性

在计算机图形学中,我们同时记录许多不同的坐标系。例如,我们也许对场景中的每一个物体都有一个不同的坐标系与之相关联。我们如何使用和组织这些坐标系的细节在第 5 章中描述。因为有如此多的坐标系,当使用矩阵来定义变换时,我们需要非常小心。

假设我们指定一个点和一个变换矩阵;这并不能完全表示实际的映射。我们必须也指定我们所使用的坐标系。这里有一个简单的例子。假设我们开始于某一点p~\tilde{p}p~​以及矩阵

S=[2000010000100001] \mathbf{S} = \left[ \begin{matrix} 2 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right]S=​2000​0100​0010​0001​​

现在我们来确定一个坐标系f⃗t\vec{\mathbf{f}}^tft。有了这个向量基,我们想要表示的点可以由对应合适的坐标系向量表示为p~=f⃗tc\tilde{p}=\vec{\mathbf{f}}^t\mathbf{c}p~​=ftc。如果我们现在使用上面的矩阵来变换该点,如同第 3 章中描述的,我们得到f⃗tc⇒f⃗tSc\vec{\mathbf{f}}^t\mathbf{c}\Rightarrow\vec{\mathbf{f}}^tS\mathbf{c}ftc⇒ftSc。在这个情况下,该矩阵的作用是从坐标系f⃗t\vec{\mathbf{f}}^tft的原点开始,用缩放系数 2 来变换该点,缩放方向为f⃗t\vec{\mathbf{f}}^tft的第一个轴向(xxx)。

假设我们重新选择另一个坐标系a⃗t\vec{\mathbf{a}}^tat,并且假设这个坐标系与原先的坐标系通过矩阵可以建立相关关系a⃗t=f⃗tA\vec{\mathbf{a}}^t=\vec{\mathbf{f}}^tAat=ftA。我们可以用一个新的坐标系向量在新的坐标系内表示原点p~=f⃗tc=a⃗td\tilde{p}=\vec{\mathbf{f}}^t\mathbf{c}=\vec{\mathbf{a}}^t\mathbf{d}p~​=ftc=atd,其中d=A−1c\mathbf{d}=A^{-1}\mathbf{c}d=A−1c。

现在如果我们使用SSS来对相关于a⃗t\vec{\mathbf{a}}^tat的点进行变换,我们得到a⃗td⇒a⃗tSd\vec{\mathbf{a}}^t\mathbf{d}\Rightarrow\vec{\mathbf{a}}^tS\mathbf{d}atd⇒atSd。此时,我们对同一个点p~\tilde{p}p~​进行了缩放,但这一次,它是从a⃗t\vec{\mathbf{a}}^tat的原点,沿着a⃗t\vec{\mathbf{a}}^tat的第一个轴向(xxx)进行缩放。它是一个与之前不同的变换(图4.1)。图 4.2 展示了当使用一个固定的矩阵RRR旋转一个点时遇到同样对坐标系的依赖性。

图 4.1: 缩放矩阵SSS将点p~\tilde{p}p~​相关于两个不同的坐标系下缩放。得到了两个不同的结果。

图 4.2: 旋转矩阵RRR将点p~\tilde{p}p~​相关于两个不同的坐标系下缩放。得到了两个不同的结果。

在这里需要关注的重点是,对点的变换(在本例中是非均匀缩放)在表达式中与变换矩阵左侧的首先出现的坐标系相关。因此我们称之为左侧原则(left-of-rule)。我们将

p~=f⃗tc⇒f⃗tSc \tilde{p}=\vec{\mathbf{f}}^t\mathbf{c} \Rightarrow\vec{\mathbf{f}}^tS\mathbf{c} p~​=ftc⇒ftSc

读作"p~\tilde{p}p~​由SSS相关于f⃗t\vec{\mathbf{f}}^tft进行变换。"我们将

p~=a⃗tA−1c⇒a⃗tSA−1c \tilde{p} =\vec{\mathbf{a}}^tA^{-1}\mathbf{c} \Rightarrow \vec{\mathbf{a}}^tSA^{-1}\mathbf{c}p~​=atA−1c⇒atSA−1c

读作"p~\tilde{p}p~​由SSS相关于a⃗t\vec{\mathbf{a}}^tat进行变换"。

我们可以对坐标系本身的变换也应用同样的逻辑。我们将

f⃗t⇒f⃗tS \vec{\mathbf{f}}^t \Rightarrow \vec{\mathbf{f}}^tS ft⇒ftS

读作"f⃗t\vec{\mathbf{f}}^tft由SSS相关于f⃗t\vec{\mathbf{f}}^tft进行变换。"我们将

f⃗t=a⃗tA−1⇒a⃗tSA−1 \vec{\mathbf{f}}^t = \vec{\mathbf{a}}^tA^{-1} \Rightarrow \vec{\mathbf{a}}^tSA^{-1}ft=atA−1⇒atSA−1

读作"f⃗t\vec{\mathbf{f}}^tft由SSS相关于a⃗t\vec{\mathbf{a}}^tat进行变换"。

4.1.1 使用辅助坐标系进行变换

在很多种情况下,我们希望相关于某一辅助坐标系a⃗t\vec{\mathbf{a}}^tat,以矩阵MMM表示的特定方式将一个坐标系f⃗t\vec{\mathbf{f}}^tft进行变换。例如,我们或许会使用某一坐标系来对地球进行建模,而后我们希望将地球沿着太阳的坐标系来旋转。

这很容易做到,只要我们知道f⃗\vec{\mathbf{f}}f与a⃗t\vec{\mathbf{a}}^tat之间相关的矩阵关系。例如,我们或许知道

a⃗t=f⃗tA \vec{\mathbf{a}}^t = \vec{\mathbf{f}}^tA at=ftA

变换后的矩阵可以被表示为

\begin{eqnarray} &&\vec{\mathbf{f}}^t \\ &=& \vec{\mathbf{a}}^tA^{-1} \\ &\Rightarrow& \vec{\mathbf{a}}^tMA^{-1} \notag\\ &=& \vec{\mathbf{f}}^tAMA^{-1} \end{eqnarray} \tag{4.1}

在等式(4.1)的第一行,我们用a⃗t\vec{\mathbf{a}}^tat重写了f⃗t\vec{\mathbf{f}}^tft。在下一行,我们使用左侧原则对坐标系系统进行了变换;使用了相关于a⃗t\vec{\mathbf{a}}^tat的矩阵MMM。在最后一行,我们简单的重写了表达式,移除了辅助坐标系。

4.2 多重变换

我们可以使用左侧原则来解释一系列多重变换。在这里强调,回想一下,通常,矩阵相乘是不满足互易性的。在随后的 2D 例子中,RRR为一个旋转矩阵而TTT是一个位移矩阵,其中位移矩阵的作用是沿着第一个轴向位移一个单位,而旋转矩阵的作用是沿着坐标系的原点(图4.3)旋转θ\thetaθ角度。

图 4.3: 两种解释表达式f⃗tTR\vec{\mathbf{f}}^tTRftTR的方法

我们现在可以解释以下变换:

f⃗t⇒f⃗tTR \vec{\mathbf{f}}^t \Rightarrow \vec{\mathbf{f}}^tTR ft⇒ftTR

我们将变换分解为两步来看,在第一步中,

f⃗t⇒f⃗tT=f′⃗t \vec{\mathbf{f}}^t \Rightarrow \vec{\mathbf{f}}^tT = \vec{\mathbf{f}^\prime}^tft⇒ftT=f′t

它可以被解释为:f⃗t\vec{\mathbf{f}}^tft被相关于f⃗t\vec{\mathbf{f}}^tft的TTT变换,我们将结果称为坐标系f′⃗t\vec{\mathbf{f}^\prime}^tf′t。

在第二步中,

f⃗tT⇒f⃗tTR \vec{\mathbf{f}}^tT \Rightarrow \vec{\mathbf{f}}^tTRftT⇒ftTR,

或者相等的

f′⃗t⇒f′⃗tR \vec{\mathbf{f}^\prime}^t \Rightarrow \vec{\mathbf{f}^\prime}^tRf′t⇒f′tR

它可以被解释为:f′⃗t\vec{\mathbf{f}^\prime}^tf′t被相关于f′⃗t\vec{\mathbf{f}^\prime}^tf′t的RRR变换。

我们也可以将整体变换解释为另一种有效的方式。将旋转和位移以另一种顺序来应用。在第一步中,

f⃗t⇒f⃗tR=f∘⃗t \vec{\mathbf{f}}^t \Rightarrow \vec{\mathbf{f}}^tR = \vec{\mathbf{f}^\circ}^tft⇒ftR=f∘t,

f⃗t\vec{\mathbf{f}}^tft被相关于f⃗t\vec{\mathbf{f}}^tft的RRR变换,我们将结果称为坐标系f∘⃗t\vec{\mathbf{f}^\circ}^tf∘t。在第二步中,

f⃗tR⇒f⃗tTR \vec{\mathbf{f}}^tR \Rightarrow \vec{\mathbf{f}}^tTRftR⇒ftTR,

f∘⃗t\vec{\mathbf{f}^\circ}^tf∘t被相关于f⃗t\vec{\mathbf{f}}^tft的TTT变换。

这些是对最终整体变换的两种不同的解释。(1)相关于f⃗t\vec{\mathbf{f}}^tft位移,之后再相关于一个中介坐标系旋转。(2)相关于f⃗t\vec{\mathbf{f}}^tft旋转,再沿着原始的f⃗t\vec{\mathbf{f}}^tft位移。有时,使用第一种解释更方便,而有时更适合使用第二种。

这些类型的解释常常总结如下:如果我们从左到右解读变换,那么每个变化都相关于一个新产生的"局部"坐标系。如果我们从右向左解读,那么每个变化都相关于原始的"全局"坐标系。

练习

4.1 使用4.2节中的定义,画出两种不同的草图来表达变换:f⃗t⇒f⃗tRT\vec{\mathbf{f}}^t \Rightarrow \vec{\mathbf{f}}^tRTft⇒ftRT(与图 4.3 比较)。

4.2 假设f⃗t\vec{\mathbf{f}}^tft是一个正交坐标系,并且我们进行变换f⃗t⇒f⃗tST\vec{\mathbf{f}}^t\Rightarrow\vec{\mathbf{f}}^tSTft⇒ftST,其中SSS是一个以系数 2 进行均匀缩放的矩阵,而TTT沿着xxx轴位移 1。以f⃗t\vec{\mathbf{f}}^tft的原始单位来衡量,则坐标系的远点移动了多远?

4.3 给定两个正交坐标系a⃗t\vec{\mathbf{a}}^tat和b⃗t\vec{\mathbf{b}}^tbt

距离由正数did_idi​表示。怎样的矩阵RRR和TTT可以得到b⃗t=a⃗tTR\vec{\mathbf{b}}^t=\vec{\mathbf{a}}^tTRbt=atTR?怎样的矩阵RRR和TTT可以得到b⃗t=a⃗tRT\vec{\mathbf{b}}^t=\vec{\mathbf{a}}^tRTbt=atRT?(注意:不要使用矩阵TTT的三角变换。)

4.4 给定以下 3 个坐标系

假设b⃗t=a⃗tN\vec{\mathbf{b}}^t=\vec{\mathbf{a}}^tNbt=atN且c⃗t=a⃗tM\vec{\mathbf{c}}^t=\vec{\mathbf{a}}^tMct=atM。只用NNN和θ\thetaθ来表示矩阵MMM。