3D Math Primer for Game Programmers (Coordinate Systems)

\qquad在本文中,我想為想要參與游戲編程的人提供簡(jiǎn)短的數(shù)學(xué)入門。這并不是對(duì)成為一名成功的游戲程序員必須知道的所有數(shù)學(xué)理論的詳盡解釋,但這是在您作為游戲程序員開始之前必須知道的最少量的信息。

\qquad本文假設(shè)您有一個(gè)最小的理解向量和矩陣。我將簡(jiǎn)單地展示向量和矩陣的應(yīng)用以及它們?nèi)绾螒?yīng)用于游戲編程。

Coordinate Systems

\qquad在我們談?wù)撟儞Q之前,我們必須對(duì)我們的坐標(biāo)系是什么做出正式的定義。DirectX 使用的默認(rèn)坐標(biāo)系是左手坐標(biāo)系。OpenGL 使用的默認(rèn)坐標(biāo)系是右手坐標(biāo)系。

\qquad記住你正在使用的坐標(biāo)系的最簡(jiǎn)單方法是用你的雙手。如果您將拇指,食指和中指指向彼此正交,則每個(gè)手指將指向坐標(biāo)空間中正基本軸的方向。使用左手,拇指指向右側(cè)(+X 軸),食指指向上方(+Y 軸),中指指向遠(yuǎn)離您(+Z 軸) 。

\qquad使用右手,拇指(+X 軸)和食指(+Y 軸)仍指向同一方向,但中指(+Z 軸)指向相反的方向。如果我們圍繞食指旋轉(zhuǎn)手(+Y 軸)以使拇指指向右側(cè),那么您的中指(+Z 軸)將指向您。

\qquad要記住的另一個(gè)重要注意事項(xiàng)是<font color=red>旋轉(zhuǎn)方向</font>。如果您將拇指指向旋轉(zhuǎn)軸的正方向并將手指繞著假想軸彎曲,則手指將沿正向旋轉(zhuǎn)方向卷曲。如果你用左手做這個(gè),當(dāng)你的拇指向下看時(shí),你的手指會(huì)順時(shí)針方向卷曲。但是,如果你用右手做這個(gè),當(dāng)你的拇指向下看時(shí),你的手指會(huì)逆時(shí)針方向卷曲。

Screenshot from 2019-12-09 12-43-24.png

下表顯示了正旋轉(zhuǎn)和負(fù)旋轉(zhuǎn)的旋轉(zhuǎn)方向,具體取決于坐標(biāo)系的旋向性。

Screenshot from 2019-12-09 12-44-07.png

Coordinate Spaces

  • 在3D游戲引擎中,我們通常處理幾個(gè)不同的坐標(biāo)空間。最常用的空間包括對(duì)象空間,世界空間,慣性空間和相機(jī)空間。
  • Object space, World space, Inertial space, and Camera space

Object Space

\qquad在對(duì)象空間(也稱為局部空間或建模空間)中,對(duì)象的頂點(diǎn)相對(duì)于它們描述的對(duì)象表示。也就是說,如果你沒有從原點(diǎn)移動(dòng)對(duì)象,那么藝術(shù)家想要顯示它們的方式。

\qquad下圖顯示了對(duì)象空間中對(duì)象的示例。從圖像中可以看出,對(duì)象位于它的相對(duì)原點(diǎn)。

a.png

World Space

\qquad世界坐標(biāo)空間是描述所有其他對(duì)象空間的全局坐標(biāo)空間。下圖顯示了世界空間中描述的對(duì)象。注意對(duì)象的世界變換如何通過一些平移和旋轉(zhuǎn)將它遠(yuǎn)離世界原點(diǎn)。

b.png

Inertial Space

\qquad慣性空間是物體空間和世界空間之間的“中間”空間。慣性空間的原點(diǎn)與物體空間的原點(diǎn)相同,慣性空間的軸與世界空間軸的軸平行。

\qquad將點(diǎn)從物體空間轉(zhuǎn)換為慣性空間僅需要旋轉(zhuǎn),而將點(diǎn)從慣性空間轉(zhuǎn)換為世界空間僅需要平移。

\qquad圖像顯示了慣性空間的一個(gè)例子。

c.png

Camera Space

\qquad相機(jī)空間是與觀察者關(guān)聯(lián)的坐標(biāo)空間。相機(jī)空間被認(rèn)為是我們所看到的內(nèi)容和方向。攝像機(jī)的坐標(biāo)軸通常假設(shè)正 X 軸指向右,正 Y 軸指向上,而在左手坐標(biāo)系中,正 Z 軸指向前方或場(chǎng)景。在右手坐標(biāo)系中,Z 軸反轉(zhuǎn),因此負(fù) -Z 軸指向前方,或指向我們場(chǎng)景中的對(duì)象。 這些攝像機(jī)軸的更常見名稱是 “Right”, “Up”, and “At” 軸。

\qquad相機(jī)空間變換與投影變換一起用于回答以下問題:

  1. 物體完全是在相機(jī)的視野中,部分在視野中,還是完全不在視野中,
  2. 一個(gè)物體比另一個(gè)物體更靠近相機(jī),
  3. 物體是直接位于相機(jī)前方,上方,下方,左側(cè)還是右側(cè)的物體。

Combining Coordinate Spaces

\qquad在3D計(jì)算機(jī)圖形中,使用 齊次坐標(biāo)系(homogeneous coordinate system) 描述坐標(biāo)空間。齊次坐標(biāo)系允許我們以相似的方式表示所有仿射變換(平移,旋轉(zhuǎn),縮放和透視投影),因此可以輕松地將它們組合為單個(gè)表示。

\qquad可以使用矩陣乘法來組合任何數(shù)字坐標(biāo)空間,從而產(chǎn)生可以應(yīng)用于對(duì)象所有頂點(diǎn)的單個(gè)矩陣。

\qquad甚至可以組合多個(gè)世界坐標(biāo)空間,以得出描述對(duì)象中所有頂點(diǎn)位置的最終坐標(biāo)空間。這對(duì)于嵌套的坐標(biāo)空間很有用,在該坐標(biāo)空間中,對(duì)象相對(duì)于“父”對(duì)象的位置被表達(dá)。更改父對(duì)象的世界變換后,子對(duì)象的變換也會(huì)隱式更改。使用此方法,可以從幾個(gè)較小的場(chǎng)景構(gòu)建復(fù)雜的場(chǎng)景,然后將其放置在較大的場(chǎng)景中以創(chuàng)建完整的世界。

References

Fletcher Dunn and Ian Parberry (2002). 3D Math Primer for Graphics and Game Development. Wordware Publishing.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容