坐标种类里头的更换美学原理

概要

那篇小说中,大家来聊天 OpenGL 中的坐标种类以及它们中间的更换。

(⚠️阅读本文需求有线性代数基础。)

坐标变换原理

第一,大家须要运用一点线性代数的文化,精晓分化坐标种类转换的法则。
出于本文针对的是三维坐标,所以切磋的上空是 \(R^3\) 空间。

在规范三维坐标系中,大家平常用一个向量 v=[x, y, z]
来代表一个点的岗位。这里的 x、y、z 分别对应 x 轴、y 轴以及 z
轴五个趋势的撼动,而专业三维坐标空间的基接纳的是七个相互垂直的向量 \(\mathbf e_1=[1,0,0]\), \(\mathbf e_2=[0,1,0]\), \(\mathbf
e_3=[0,0,1]\)。但根据线性无关等知识,我们全然可以找出此外多少个向量作为三维空间的基,只要这七个向量线性非亲非故,同样可以张成
\(R^3\) 空间。

现今,若是坐标系 A 选用的基向量是 {\(\mathbf
v_1, \mathbf v_2, \mathbf v_3\)},坐标系 B 选取的是{\(\mathbf u_1\), \(\mathbf u_2\), \(\mathbf u_3\)}。
那么,根据线性无关性,我们可以获取线性方程组:
\[ {\mathbf u_1 = \gamma_{11}\mathbf
v1+\gamma_{12}\mathbf v2+\gamma_{13}\mathbf v_3} \]

\[ \mathbf u_2 = \gamma_{21}\mathbf
v1+\gamma_{22}\mathbf v2+\gamma_{23}\mathbf v_3 \]

\[ \mathbf u_3 = \gamma_{31}\mathbf
v1+\gamma_{32}\mathbf v2+\gamma_{33}\mathbf v_3 \]

用矩阵方程的样式表示为:

\[\mathbf u = \mathbf M \mathbf
v\]
由于 \(\mathbf u\), \(\mathbf v\)
都是三维空间的基,由此,对于三维空间内擅自一个向量 \(\mathbf w\),\(\mathbf u\)、\(\mathbf
v\)都得以经过线性组合的不二法门意味着出 \(\mathbf w\):
\(\mathbf w = \mathbf a^T \mathbf v =
\mathbf b^T \mathbf u\)(这里的\(\mathbf a^T\), \(\mathbf
b^T\)分别代表不一致坐标空间的标量)。
构成前边 \(\mathbf u = \mathbf M \mathbf
v\),进一步得到:\(\mathbf w =
\mathbf b^T \mathbf u = \mathbf b^T \mathbf M \mathbf v=\mathbf
a^T \mathbf v\),
继而 :\(\mathbf a = \mathbf M^T \mathbf
b\),\(\mathbf b = (\mathbf
M^T)^{-1} \mathbf a\)。

好了,到此地,关键的事物就讲完了。所以坐标种类的转移很简单有木有!若是你在B坐标系(基向量为{\(\mathbf u_1\), \(\mathbf u_2\), \(\mathbf u_3\)})中有个向量 \(\mathbf w\),沿用上面的假如,\(\mathbf w\) 的坐标为 \(\mathbf b\)(即 \(\mathbf w = \mathbf b^T \mathbf
u\)),那一个时候,大家想求出它在 A 坐标系(基向量为{\(\mathbf v_1, \mathbf v_2, \mathbf
v_3\)})的坐标表示(如若为\(\mathbf
a\)),大家只需需求出矩阵 \(\mathbf
M\),则:\(\mathbf a = \mathbf M^T
\mathbf b\)。
反之同理。

这么些时候,有同学也许会问矩阵 \(\mathbf
M\) 怎么求?
假定一个坐标连串的基向量为{\(\mathbf
u_1\), \(\mathbf u_2\),
\(\mathbf
u_3\)},而另一个连串应用规范向量{\(\mathbf e_1\), \(\mathbf e_2\), \(\mathbf e_3\)},要是存在涉嫌:\(\mathbf u = \mathbf M^T \mathbf
e\)(那一个姿势的精通是:如果 \(\mathbf M\)
是三个坐标连串的转换矩阵,那么多个连串内的即兴向量可以由此那么些矩阵互相转换,基向量只不过是与众区其余向量,一样可以经过
\(\mathbf M\) 进行转换),那矩阵
\(\mathbf M\) 其实可以表示为 [\(\mathbf u_1, \mathbf u_2, \mathbf
u_3\)]。这些结果其实很好了然,只要换种写法:
\(\mathbf u = \begin{bmatrix} \mathbf u_1
\\ \mathbf u_2 \\ \mathbf u_3 \\
\end{bmatrix}\),\(\mathbf e =
\begin{bmatrix} \mathbf e_1 \\ \mathbf e_2 \\ \mathbf e_3
\\ \end{bmatrix}\),能够窥见,\(\mathbf e\)其实是一个单位矩阵。
而倘使是非标准坐标连串里头的更换,则须要解一个线性方程组:\(\mathbf u = \mathbf M^T \mathbf
v\),而且可以一定,那么些解存在且唯一。

固然从上边的推测中大家得以汲取,分裂坐标连串能够通过一个唯一的 3*3 矩阵
\(\mathbf M\)
来转换,但都是基于坐标原点相同的前提。假如原点也爆发变化,这时就必须引入第七个维度来代表平移的偏移量,也就是常说的齐次坐标。
引入第四维后,\(\mathbf u=[\mathbf
u_1,\mathbf u_2,\mathbf u_3,\mathbf p]\),\(\mathbf v=[\mathbf v_1,\mathbf v_2,\mathbf
v_3,\mathbf q]\),大家再次用一个矩阵 \(\mathbf M\)
来转换那八个坐标系列,分歧的是,这里的 \(\mathbf M\) 是一个 4*4 的矩阵:
\[ \mathbf M= \begin{bmatrix}
\gamma_{11} & \gamma_{12} & \gamma_{13} & 0 \\ \gamma_{21} &
\gamma_{22} & \gamma_{23} & 0 \\ \gamma_{31} & \gamma_{32} &
\gamma_{33} & 0 \\ \gamma_{41} & \gamma_{42} & \gamma_{43} & 1
\\ \end{bmatrix} \]
\[ \mathbf u = \mathbf M^T * \mathbf v
\]
除却多出一维外,齐次坐标与地点运用的三维坐标本质上尚未分别,总括情势也基本一致,在对应到三维坐标系时,只要求放弃第七个维度即可。

OpenGL中的坐标体系

OpenGL 的坐标种类有三种:

  1. Object (or model) coordinates
  2. World coordinates
  3. Eye (or camera) coordinates
  4. Clip coordinates
  5. Normalized device coordinates
  6. Window (or screen) coordinates

模型坐标系 (Object coordinates)
是各种模型在创建时故意的,假设要把模型放入世界,就需求将拥有模型的坐标系转换成世界坐标系
(World
coordinates)。世界中的场景须求经过相机被人眼观察,须要将世界坐标系转换成相机坐标系
(Eye
coordinates)。从模型坐标系,到世界坐标系,再到相机坐标系的转换,日常称为
model-view transformation,通过 model-view matrix 来贯彻。
前两种坐标种类常常是由用户指定的,而后二种坐标连串一般都是在 OpenGL
管道中,由程序自己达成的。
而 OpenGL
中坐标种类转换的规律,其实就是地方所讲的那个,只可是在运用时,大家可以运用一些
API 来简化不少做事。

参考

  • Interactive Computer Graphics – A Top-Down Approach 6e By Edward
    Angel and Dave Shreiner (Pearson, 2012)