坐标种类之间的调换

概要

这篇小说中,大家来聊聊 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}\爱博体育app手机版,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)

相关文章