[英]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 )
我的問題是:
在諸如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上找到該矩陣的一半。
因此,這是右手坐標系的旋轉矩陣。 這與我在“固定管道”下所述的常用功能相匹配。
根據此材料,下面是您編號問題的答案:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.