# 第四章 坐标系相关性（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&#x26;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&#x26;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$$。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hine.gitbook.io/foundations-of-3d-cg/xin-shou-ru-men/di-si-zhang-zuo-biao-xi-xiang-guan-xing-respect.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
