3.1 为什么需要多个坐标空间

  • 事实上,只需要选定一个坐标系,然后称之为 “世界” 坐标系,就可以使用这个坐标系描述所有的点了,但不同的情况下使用不同的坐标系更加方便。
  • 某些信息只能在特定的上下文环境中获得:理论上,确实所有点都能只用一个 “世界” 坐标系描述。但是对于一个特殊点,也许不知道它在世界坐标系中的坐标,但可能知道它在其他坐标系中的坐标。
  • 在计算机创建虚拟世界时,应该选择较为简单的坐标系,而不是较复杂的。
  • 没有哪一个坐标系能被认为优于另一个,所有坐标系都是平等的,但某些可能比其他的更合适。

3.2 一些有用的坐标空间

3.2.1 坐标空间

世界坐标系(World Coordinate System)是一个特殊的坐标系,它为所有其他要指定的坐标系建立了一个”全局“的参考系。换句话来说,我们可以用世界坐标空间来表达其他坐标空间的位置,但是我们不能用任何更大的外部坐标空间来表示世界坐标空间。世界坐标系建立我们关心的”最大“坐标系,在大多数情况下,它实际上并不是整个世界。

世界坐标空间也称为全局(Global)坐标空间或通用(Universal)坐标空间。

3.2.2 物体空间

物体空间(Object Space)是与特定物体关联的坐标空间。每个物体都有自己独立的物体空间。当这个物体移动或改变方向时,与该物体关联的坐标空间被随之移动或改变方向。

在图形的上下文中,物体空间也称为模型(Model)空间,因为模型顶点的坐标以模型空间表示。物体空间也称为体(Body)空间,特别时物理环境中。

向"前、后、左、右"是物体空间的概念。向”东、南、西、北“是世界空间的概念。

3.2.3 相机空间

物体空间的一个特别的重要的实例时相机空间(Camera Space),其时与用于渲染的视点相关联的物体空间。

从相机空间坐标到屏幕空间坐标的映射涉及的操作称为投影(Projection)。

image-20230312163444307

3.2.4 直立空间

将每个物体与一个新的坐标空间关联在一起,这个新坐标空间就称其为直立(Upright)坐标空间。物体的直立空间是世界空间与其物体之间的”中间过渡“,因为直立空间的轴线与世界空间的轴线平行,而直立空间的原点则与物体空间的原点重合。

物体空间和直立空间之间的转换点只需要旋转;而直立空间和世界空间之间的转换点只需要更改位置,这通常称为平移(Translation)。

image-20230312164134305

3.3 基向量和坐标空间转换

将一个坐标系下的坐标转换为另一个坐标系下的坐标称为坐标系转换(coordinate space transformation)。

3.3.1 双重视角

  • 主动转换(Active Transformation):两个坐标系保持不动,物体的坐标进行转换。

  • 被动转换(Pasison Transformation):物体保持不动,坐标系进行转换。

转换一般都应该先旋转,再平移。

当我们先旋转物体时,旋转的中心就是原点。如果在平移之后旋转,那么旋转将发生在一个不是原点的点上。围绕原点的旋转时线性变换,而围绕任何其他点的旋转时仿射(Affine)变换。

image-20230312170001869

3.3.2 指定坐标空间

坐标系又其原点和轴定义。原点定义坐标空间的位置(Position),轴描述其方向(Orientation)。指定坐标空间要做的就是指定原点的位置,和轴的方向。

3.3.3 基向量

如果在物体坐标系下一个点的位置是(−1,5),那么它在世界坐标系下的位置可以按以下公式进行计算:

w=o+bxp+byq\textbf{w}=\textbf{o}+b_x\textbf{p}+b_y\textbf{q}

其中b\textbf{b}为点在物体坐标系下的位置,即(−1,5),w\textbf{w}为点在世界坐标系下的位置,o\textbf{o}为物体坐标系的原点在世界坐标系中的位置,在上例中为(4.5,1.5),p\textbf{p}为物体坐标系X轴在世界坐标系中的表示,在上例中为(0.87,0.5),q\textbf{q}为物体坐标系Y轴在世界坐标系中的表示,在上例中为(−0.5,0.87)。

将所有数据带入上式,可以算出该点在世界坐标系下的坐标为(−1.13,5.35)。计算如下:

w=(4.5,1.5)+(1)(0.87,0.5)+5(0.5,0.87)=(1.13,5.35)\textbf{w}=(4.5,1.5)+(−1)∗(0.87,0.5)+5∗(−0.5,0.87)=(−1.13,5.35)

可以将上述公式简化,即不再将“点”作为考虑的物体,而是描述向量。因为是向量所以也就不需要考虑位移。

如果上述公式不考虑位移(可以假象为两个坐标系的原点是重叠的),且推广至三维空间,可表示为:

v=xp+yq+zr(v表示为基向量的线性组合)\textbf{v}=x\textbf{p}+y\textbf{q}+z\textbf{r}\quad(\textbf{v}表示为基向量的线性组合)

式中的v\textbf{v}是目标坐标系下的坐标,x,y,zx,y,z是当前坐标系下的选取的三条基本向量上的分量,p,q,r\textbf{p,q,r}是三维空间的基向量(Basis Vector)。

如上例中,因为是二维空间,只有两条基本向量,选取的分别是X轴和Y轴,对应的P为(0.87,0.5),对应的q为,(−0.5,0.87)。

b=[bx,by,bz]\textbf{b}=[b_x,b_y,b_z]是物体空间中某个任意向量的坐标,u=[ux,uy,uz]\textbf{u}=[u_x,u_y,u_z]是直立空间中同一向量的坐标,p、q和r\textbf{p、q和r}是在世界空间中已知坐标的基向量。则有u\textbf{u}b\textbf{b}之间的关系如下:

ux=bxpx+byqx+bzrx,u=bxp+byq+bzr,或者等效地,uy=bxpy+bypy+bzry,uz=bxpz+byqz+bzrz\begin{align*} u_x &= b_xp_x+b_yq_x+b_zr_x, \\ \textbf{u}=b_x\textbf{p}+b_y\textbf{q}+b_z\textbf{r},\quad或者等效地,\quad u_y&= b_xp_y+b_yp_y+b_zr_y, \\ u_z &= b_xp_z+b_yq_z+b_zr_z \end{align*}

如果知道了向量b\textbf{b},求向量u\textbf{u}只需要套用公式即可。但如果知道了向量u\textbf{u}想求向量b\textbf{b},则需要解一个三元方程(bx,by,bzb_x,b_y,b_z都是未知量)。

如果一系列向量满足,向量互相垂直,即正交(orthogonal)向量的长度都为1,则称这些向量为标准正交基(orthonormal),如果基本向量是标准正交基,则求b\textbf{b}的过程可以从解三元方程简化为以下公式:

bx=up,by=uq,bz=urb_x=\textbf{u}\cdot\textbf{p},\quad b_y=\textbf{u}\cdot\textbf{q}, \quad b_z=\textbf{u}\cdot\textbf{r}

使用标准基p=[1,0,0],q=[0,1,0],r=[0,0,1]\textbf{p}=[1,0,0],\textbf{q}=[0,1,0],\textbf{r}=[0,0,1],则有

bx=up=u[100]=ux,by=uq=u[010]=uy,bz=ur=u[000]=uzb_x=\textbf{u}\cdot\textbf{p}=\textbf{u}\cdot[1\quad0\quad0]=u_x, \\ b_y=\textbf{u}\cdot\textbf{q}=\textbf{u}\cdot[0\quad1\quad0]=u_y, \\ b_z=\textbf{u}\cdot\textbf{r}=\textbf{u}\cdot[0\quad0\quad0]=u_z

  1. 点乘的物理意义有求在某个分量上的长度,所以可以通过点乘来计算。
  2. 如果三条基本向量不是相互垂直的,那么在一条基本向量上值增加,会导致另一条基本向量上的值也增加。 如基本向量选取为(1,0)和(1,1),如果点从(1,1)位移到(2,2)点上,虽然是在基本向量(1,1)上移动的,但同样会增加在(1,0)上的值。 这样的话在上述公式中,则会出现bxb_x的值不仅与p\textbf{p}有关,还可能与q\textbf{q}有关。
  3. ab\textbf{a}\cdot\textbf{b}的结果还与b\textbf{b}的长度有关,为了避免这个影响,所以取p,q,r\textbf{p,q,r}都为1。

选取的基本向量通常都需要是线性无关的(Linearly Independent),即任意一个向量不能通过其他向量的线性组合表示出来。否则的话,n个向量无法描述n维空间中的所有向量,在线性代数中,将通过基本向量能表述的空间维度称为秩(rank)

3.4 嵌套坐标空间

三维虚拟世界中的每个物体都有自己的坐标空间——它自己的原点和轴。

因为通常而言,物体坐标系最后都要基于世界坐标系进行计算,如把不同的物体放在世界中的过程。因此可以称世界坐标系是父空间,物体坐标系是子空间。还可以很方便地将物体分解为子物体并单独为其设置动画。

而物体坐标系可以进一步划分,如将一只羊作为物体坐标系,可以再进一步将其头作为物体坐标系的子坐标系,称为头坐标系。同理头坐标系下还可以耳朵坐标系等。这种将不同部分层层划分的模型称为关节模型(articulated model)。

一些运动在各自的坐标系下计算是很简单的,但是放在世界坐标系下将会很复杂。如羊一边走,一边摇头,一边上下翻动耳朵。对于耳朵坐标系而言,这只是Y轴的变化,但是对于世界坐标系而言,就是耳朵的运动轨迹就非常复杂了。

嵌套坐标空间的层次结构是动态的,并且可以按信息的重要程度进行排列。

3.5 针对直立空间的再解释

当将点从物体坐标系转换到世界坐标系时,不仅需要进行旋转操作,还需要进行位移操作。

当将向量从物体坐标系转换到世界坐标系时,仅需要旋转操作。

但物体和点在代码中通常都是用同一个类型来表示的,如flaot3。因此需要一个方法来区分操作究竟是针对点还是向量,有的人将flaot3取别名,如变成pointvector,有的人则是通过计算过程,如将旋转操作和位移操作分开,在处理点的时候,使用位移操作。

作者在这里提出的直立坐标系(Upright Space)则是另一种表达,设想是,当使用世界坐标系时,则表示这个操作是需要进行位移的,而使用直立坐标系时,则是不需要位移。

扩展:空间坐标之间的想换转换

从物体空间到直立空间

v\mathbf{v}是相对于空间(物体空间)表示/测量的某个向量,其基向量 p,q,r\mathbf{p}, \mathbf{q}, \mathbf{r} (它们本身是相对于包装器空间来表示/测量的), 则向量v\mathbf{v}相对于包装器空间表示/测量的为;

vupright=vxp+vyq+vzr=vx[pxpypz]+vy[qxqyqz]+vz[rxryrz]=[vxpx+vyqx+vzrxvxpy+vyqy+vzryvxpz+vyqz+vzrz]\begin{align} \mathbf{v}_{upright} &= v_x \mathbf{p} + v_y \mathbf{q} + v_z \mathbf{r} \\ &= v_x \begin{bmatrix} p_x & p_y & p_z \end{bmatrix} + v_y \begin{bmatrix} q_x & q_y & q_z \end{bmatrix} + v_z \begin{bmatrix} r_x & r_y & r_z \end{bmatrix} \nonumber \\ &= \begin{bmatrix} v_x p_x + v_y q_x + v_z r_x & v_x p_y + v_y q_y + v_z r_y & v_x p_z + v_y q_z + v_z r_z \end{bmatrix} \nonumber \end{align}

注意:如果 p,q,r\mathbf{p}, \mathbf{q}, \mathbf{r} 不是正交的,那么vupright\mathbf{v}_{upright} 就不能唯一确定。

pqr\mathbf{p}, \mathbf{q}, \mathbf{r}的坐标总是分别等于[1,0,0][0,1,0][1,0,0],[0,1,0][0,0,1][0,0,1]当使用以它们为基的坐标系表示时,相对于其他包装器坐标系,它们将具有任意坐标。

从直立空间到世界空间

由于直立空间的轴与世界空间的轴平行,因此这些空间之间的唯一区别是这些轴相对于世界空间轴的原点的平移,那么让o\mathbf{o}作为竖直基轴的平移。

vworld=o+vupright\mathbf{v}_{world} = \mathbf{o} + \mathbf{v}_{upright}

从世界空间到直立空间

我们只需要平移整个空间,使原点恰好位于垂直空间的原点上,如果o\mathbf{o}是世界空间中表示的垂直空间的原点,那么

vupright=vworldo\mathbf{v}_{upright} = \mathbf{v}_{world} - \mathbf{o}

从直立空间到物体空间

如果v_upright\mathbf{v}\_{upright}是已知的,我们该如何知道 v\mathbf{v}? 点积是用来测量特定方向上距离的关键,因为我们知道基向量pqr\mathbf{p}, \mathbf{q}, \mathbf{r}是正交空间表示的,我们只需要计算v_upright\mathbf{v}\_{upright}在每个pqr\mathbf{p}, \mathbf{q}, \mathbf{r}方向上的投影

vx=vuprightpvy=vuprightqvz=vuprightr\begin{align*} v_x = \mathbf{v}_{upright} \cdot \mathbf{p} \\ v_y = \mathbf{v}_{upright} \cdot \mathbf{q} \\ v_z = \mathbf{v}_{upright} \cdot \mathbf{r} \end{align*}

如果我们使用从物体空间到直立空间公式,这也是可以的,因为与p\mathbf{p} 的点积将获得vxv_x 的坐标值。

vuprightp=vx(pp)+vy(qp)+vz(rp)=vx(1)+vy(0)+vz(0)=vx\begin{align*} \mathbf{v}_{upright} \cdot \mathbf{p} &= v_x (\mathbf{p} \cdot \mathbf{p}) + v_y (\mathbf{q} \cdot \mathbf{p}) + v_z (\mathbf{r} \cdot \mathbf{p}) \\ &= v_x (1) + v_y (0) + v_z (0) \\ &= v_x \end{align*}

注意: 这只适用于pqr\mathbf{p}, \mathbf{q}, \mathbf{r}是标准正交的,对于一般情况,我们必须使用线性代数来解决这个问题。

原文链接:Coordinate systems | Mauricio Poppe


引用:

  1. Dunn, F. and Parberry, I. (2011). 3D math primer for graphics and game development 2nd2^{nd}.