> For the complete documentation index, see [llms.txt](https://hine.gitbook.io/foundations-of-3d-cg/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hine.gitbook.io/foundations-of-3d-cg/xin-shou-ru-men/di-si-zhang-zuo-biao-xi-xiang-guan-xing-respect.md).

# 第四章 坐标系相关性（Respect）

## 4.1 坐标系的重要性

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

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

$$\mathbf{S} =  	\left\[ \begin{matrix} 	2 & 0 & 0 & 0 \ 	0 & 1 & 0 & 0 \ 	0 & 0 & 1 & 0 \ 	0 & 0 & 0 & 1 	\end{matrix} \right]$$

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

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

现在如果我们使用$$S$$来对相关于$$\vec{\mathbf{a}}^t$$的点进行变换，我们得到$$\vec{\mathbf{a}}^t\mathbf{d}\Rightarrow\vec{\mathbf{a}}^tS\mathbf{d}$$。此时，我们对同一个点$$\tilde{p}$$进行了缩放，但这一次，它是从$$\vec{\mathbf{a}}^t$$的原点，沿着$$\vec{\mathbf{a}}^t$$的第一个轴向（$$x$$）进行缩放。它是一个与之前不同的变换（图4.1）。图 4.2 展示了当使用一个固定的矩阵$$R$$旋转一个点时遇到同样对坐标系的依赖性。

![](https://3079340014-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9b16cwt_hvqTAbEF_%2F-MRBRjQlbcScnlLAIWD0%2F-MRE2KklVRu2NVl18nBT%2FFigure_4-1.jpg?alt=media\&token=0bafd514-1f19-411e-9cec-927137dba570)

**图 4.1**： 缩放矩阵$$S$$将点$$\tilde{p}$$相关于两个不同的坐标系下缩放。得到了两个不同的结果。

![](https://3079340014-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9b16cwt_hvqTAbEF_%2F-MRBRjQlbcScnlLAIWD0%2F-MRE2TcSBRFf2f9S2B3w%2FFigure_4-2.jpg?alt=media\&token=8e8b7f8f-7fb2-45f9-a8dd-032883eac4d6)

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

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

$$\tilde{p}=\vec{\mathbf{f}}^t\mathbf{c} 	\Rightarrow\vec{\mathbf{f}}^tS\mathbf{c}$$

读作"$$\tilde{p}$$由$$S$$相关于$$\vec{\mathbf{f}}^t$$进行变换。"我们将

$$\tilde{p} 	=\vec{\mathbf{a}}^tA^{-1}\mathbf{c} 	\Rightarrow 	\vec{\mathbf{a}}^tSA^{-1}\mathbf{c}$$

读作"$$\tilde{p}$$由$$S$$相关于$$\vec{\mathbf{a}}^t$$进行变换"。

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

$$\vec{\mathbf{f}}^t 	\Rightarrow 	\vec{\mathbf{f}}^tS$$

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

$$\vec{\mathbf{f}}^t 	= \vec{\mathbf{a}}^tA^{-1} 	\Rightarrow 	\vec{\mathbf{a}}^tSA^{-1}$$

读作"$$\vec{\mathbf{f}}^t$$由$$S$$相关于$$\vec{\mathbf{a}}^t$$进行变换"。

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

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

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

$$\vec{\mathbf{a}}^t 	= \vec{\mathbf{f}}^tA$$

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

$$\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）的第一行，我们用$$\vec{\mathbf{a}}^t$$重写了$$\vec{\mathbf{f}}^t$$。在下一行，我们使用左侧原则对坐标系系统进行了变换；使用了相关于$$\vec{\mathbf{a}}^t$$的矩阵$$M$$。在最后一行，我们简单的重写了表达式，移除了辅助坐标系。

## 4.2 多重变换

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

![](https://3079340014-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9b16cwt_hvqTAbEF_%2F-MRBRjQlbcScnlLAIWD0%2F-MRE2_HsByJKoy5oHsqo%2FFigure_4-3.jpg?alt=media\&token=96298792-d532-4524-a316-f3c935ed434f)

**图 4.3**： 两种解释表达式$$\vec{\mathbf{f}}^tTR$$的方法

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

$$\vec{\mathbf{f}}^t 	\Rightarrow \vec{\mathbf{f}}^tTR$$

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

$$\vec{\mathbf{f}}^t 	\Rightarrow \vec{\mathbf{f}}^tT  	= \vec{\mathbf{f}^\prime}^t$$

它可以被解释为：$$\vec{\mathbf{f}}^t$$被相关于$$\vec{\mathbf{f}}^t$$的$$T$$变换，我们将结果称为坐标系$$\vec{\mathbf{f}^\prime}^t$$。

在第二步中，

$$\vec{\mathbf{f}}^tT 	\Rightarrow  	\vec{\mathbf{f}}^tTR$$，

或者相等的

$$\vec{\mathbf{f}^\prime}^t \Rightarrow \vec{\mathbf{f}^\prime}^tR$$

它可以被解释为：$$\vec{\mathbf{f}^\prime}^t$$被相关于$$\vec{\mathbf{f}^\prime}^t$$的$$R$$变换。

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

$$\vec{\mathbf{f}}^t 	\Rightarrow  	\vec{\mathbf{f}}^tR 	= \vec{\mathbf{f}^\circ}^t$$，

$$\vec{\mathbf{f}}^t$$被相关于$$\vec{\mathbf{f}}^t$$的$$R$$变换，我们将结果称为坐标系$$\vec{\mathbf{f}^\circ}^t$$。在第二步中，

$$\vec{\mathbf{f}}^tR \Rightarrow \vec{\mathbf{f}}^tTR$$，

$$\vec{\mathbf{f}^\circ}^t$$被相关于$$\vec{\mathbf{f}}^t$$的$$T$$变换。

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

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

## 练习

**4.1** 使用4.2节中的定义，画出两种不同的草图来表达变换：$$\vec{\mathbf{f}}^t \Rightarrow \vec{\mathbf{f}}^tRT$$（与图 4.3 比较）。

**4.2** 假设$$\vec{\mathbf{f}}^t$$是一个正交坐标系，并且我们进行变换$$\vec{\mathbf{f}}^t\Rightarrow\vec{\mathbf{f}}^tST$$，其中$$S$$是一个以系数 2 进行均匀缩放的矩阵，而$$T$$沿着$$x$$轴位移 1。以$$\vec{\mathbf{f}}^t$$的原始单位来衡量，则坐标系的远点移动了多远？

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

<div align="left"><img src="https://3079340014-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9b16cwt_hvqTAbEF_%2F-MRBRjQlbcScnlLAIWD0%2F-MRE2df6caK3Y8rB18hZ%2FFigure_4-4.jpg?alt=media&amp;token=73c5d84c-336e-4c06-9cd8-0750ccb07ed8" alt=""></div>

距离由正数$$d\_i$$表示。怎样的矩阵$$R$$和$$T$$可以得到$$\vec{\mathbf{b}}^t=\vec{\mathbf{a}}^tTR$$？怎样的矩阵$$R$$和$$T$$可以得到$$\vec{\mathbf{b}}^t=\vec{\mathbf{a}}^tRT$$？（注意：不要使用矩阵$$T$$的三角变换。）

**4.4** 给定以下 3 个坐标系

<div align="left"><img src="https://3079340014-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9b16cwt_hvqTAbEF_%2F-MRBRjQlbcScnlLAIWD0%2F-MRE2fYz0xcQXykqTxh1%2FFigure_4-5.jpg?alt=media&amp;token=7e2f7015-19ba-4072-8361-7247047fb70b" alt=""></div>

假设$$\vec{\mathbf{b}}^t=\vec{\mathbf{a}}^tN$$且$$\vec{\mathbf{c}}^t=\vec{\mathbf{a}}^tM$$。只用$$N$$和$$\theta$$来表示矩阵$$M$$。
