簡體   English   中英

XNA / OpenGL是否使用左手矩陣?

[英]Does XNA/OpenGL use left handed matrices?

據我了解,OpenGL和XNA默認都使用右手坐標系。

但是,看起來這兩個庫生成的旋轉矩陣都是左撇子。

我認為這是因為任一方向上的正Z旋轉都會產生這樣計算的矩陣(此表示中的行為大數):

cos  |  sin  |  0
-sin |  cos  |  0
  0  |   0   |  1

根據我發現的來源,這是一個左撇子Z旋轉矩陣( http://www.cprogramming.com/tutorial/3d/rotationMatrices.html

我的問題是:

  1. 我對么? 矩陣是左手使用的,但坐標系是正確的嗎?
  2. 這對XNA / OpenGL的所有矩陣方法都適用嗎?
  3. 如果我是正確的,那有什么關系? 為什么不讓一切都用右手呢?

在諸如OpenGL的圖形API中,沒有一個單一的坐標系。 在通過管道進行操作時,可以多次轉換頂點。 由於線性變換與更改坐標系確實是一回事,因此您可以描繪出每次變換都會引入一個新的坐標系。

基於此,應用程序可以在很大程度上決定他們要使用的坐標系。對於當前版本的OpenGL中使用的可編程管線,尤其如此,但在一定程度上也可以使用傳統的固定管線。

讓我詳細介紹一下這方面,其中應涵蓋您在OpenGL情況下的問題。

規范化的設備坐標

歸一化設備坐標(NDC)是頂點處理完成后頂點位於的坐標系。 您可以將其視為OpenGL的“本機” 3D坐標系。 對於所有3個坐標,其范圍均為[-1.0,1.0],並且是左手的

固定管道

在舊式固定管道中,頂點最初是在對象坐標中指定的(請參見http://www.glprogramming.com/red/chapter03.html )。 Modelview矩陣將其轉換為眼睛坐標 ,投影矩陣將其轉換為剪輯坐標 透視分割后,他們成為NDC。

對於對象坐標,通常使用右手坐標系。 使用保留慣用性的Modelview矩陣,這會導致慣用右手的眼睛坐標。 投影矩陣會翻轉z軸的方向,從而產生左手的剪輯坐標和NDC。

如果選擇這種方式,則可以輕松使用左手對象坐標,並使用可翻轉慣性的模型視圖矩陣,這樣您就可以再次獲得右手眼睛的坐標。

可編程管線

使用可編程管線,您完全可以在頂點着色器中使用所需的任何坐標系。 假設您的原始頂點是在球坐標中指定的,那完全沒問題。 您只需要在着色器代碼中進行相應處理即可。 頂點着色器需要生成剪輯坐標(如前所述,為左手坐標)作為輸出,但是之前的所有內容都是完全開放的。

輪換

當前版本的OpenGL沒有任何旋轉概念,也沒有內置功能來創建旋轉矩陣。

對於與舊式固定管道一起使用的glRotatef()函數,矩陣不是您要解決的問題。 圍繞z軸的旋轉由以下矩陣定義:

[ cos(a)  -sin(a)  0  0 ]
[ sin(a)  cos(a)   0  0 ]
[ 0       0        1  0 ]
[ 0       0        0  1 ]

您可以在http://www.glprogramming.com/red/appendixf.html上找到該矩陣的一半。

因此,這是右手坐標系的旋轉矩陣。 這與我在“固定管道”下所述的常用功能相匹配。

編號問題的答案

根據此材料,下面是您編號問題的答案:

  1. 不可以。旋轉矩陣(至少由不贊成使用的固定功能API調用構建)可以與右手坐標系一起使用。 而“本機”坐標系(NDC)是左手的。
  2. 對於模型變換,它僅對旋轉有所不同,假定旋轉在右手坐標系中進行。 投影矩陣從慣用右手切換到慣用左手。
  3. 例如,如果您正在查看三角形的纏繞順序,或者正在使用叉積來計算法線,則左撇子與右撇子很重要。 為什么NDC是左撇子...我不知道。 一開始就這樣定義(我懷疑它甚至可能已經從GL繼承到OpenGL)。 一旦定義了一種方法,就無法在不破壞兼容性的情況下對其進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM