假設我在OpenGL ES 2.0程序上爲我的modelViewTransformation矩陣使用了標識矩陣。這種情況下的座標系統是從(-1,-1,-1)延伸到(1,1,1)的規範OpenGL座標系統。OpenGL座標系是右手還是左手?
這個座標系是右手還是左手?
一個更廣泛的問題:是否有與OpenGL的一份文件,其中可以列出所有的數學約定其次是API?
假設我在OpenGL ES 2.0程序上爲我的modelViewTransformation矩陣使用了標識矩陣。這種情況下的座標系統是從(-1,-1,-1)延伸到(1,1,1)的規範OpenGL座標系統。OpenGL座標系是右手還是左手?
這個座標系是右手還是左手?
一個更廣泛的問題:是否有與OpenGL的一份文件,其中可以列出所有的數學約定其次是API?
我的問題是,這是座標 系統右手還是左手?
默認情況下,OpenGL是永遠右手。您可以通過自動正常創建來觀察這一點。您可以通過指定每個點來強制左手常規創建,但總體來說,右手規則始終適用。有關OpenGL的右手特性的更多討論,請參閱9.150 in the OpenGL FAQ。
...所有數學約定 後跟API?
目前還不清楚你問什麼。數學是基本的線性代數,主要集中在matrix math and linear transformations。
編輯迴應發表評論的問題:
記住,但是,如果您使用的是統一的矩陣調用,而不是舊的glRotates,等等,你必須指定您是否使用按行主要或列主要矩陣。在這種情況下(從在註釋中提到的代碼):
glUniformMatrix4fv(uniforms[UNIFORM_MVP], 16, GL_FALSE, mvpMatrixZRotation);
在這個調用中,GL_FALSE
告訴呼叫,這是一個列優先矩陣,並且這樣,旋轉的結果將是轉置的意圖。因此,旋轉將被倒置,看起來像一個左手座標系統。
改變,要GL_TRUE
和一切都會好的。
下面是OpenGL的討論板這是有關這一特定主題的一個very simple example。
對OpenGL中矩陣流水線的評論請求:Here is another detailed explanation做出響應的又一次編輯。請注意帶有三個軸的GL_MODELVIEW
圖:它們說明了右手座標系。常見問題解答中的上述引用仍然適用。
的OpenGL ES座標系統確實是右撇子的系統包括(-1,-1,-1)到(1,1,1)的典型量。我通過代碼驗證了這一點。
規範視圖體積(也稱爲標準化設備座標)是左撇子。這是很容易測試通過將單位矩陣和繪圖2個三角形說
float points[] = { -1, 1, -0.5,
-1, -1, -0.5,
1, -1, -0.5,
1, 1, 0.5,
-1, -1, 0.5,
1, -1, 0.5 };
並查看結果(glEnable(GL_DEPTH_TEST))
所以你的頂點着色器看起來就像這樣:
uniform mat4 mvp_mat;
// Incoming per vertex... position (fills in 1 for w if from vec3 buf)
layout (location = 0) in vec4 v_vertex;
void main(void)
{
// multiplying by identity doesn't transform the geometry
gl_Position = mvp_mat * v_vertex;
}
,或者你甚至可以測試它更簡單地像這樣因爲單位矩陣什麼都不做
layout (location = 0) in vec4 v_vertex;
void main(void)
{
//no transformation, no confusion, just straight to OpenGL
gl_Position = v_vertex;
}
顯然你必須使三角形的顏色不同,這樣你才能看到它們是如何重疊的。
也看到這個帖子,我的意見/問題在它: plus.google.com/114825651948330685771/posts/AmnfvYssvSe
我不知道,所有的不正確的信息來自於所有在互聯網上,甚至在教科書中。如果您正在討論用於確定正面的三角形卷繞(默認CCW =右手),則OpenGL默認爲右手。世界空間,物體空間和眼睛空間不存在於OpenGL中,只存在於圖形程序員。 OpenGL只需要點,剪切規範視圖volume [-1,-1,-1] x [1,1,1]以外的任何東西並將它們轉換爲默認爲[0,w)x [ 0,h)x [0,1]。如果啓用了深度測試,則默認行爲是左手的,向下看+ z。
有幾種方法可以解釋OpenGL的左手習慣。大多數人在他們的矩陣中處理它(儘管他們沒有意識到)。我想你也可以使用glDepthFunc並將其設置爲GL_GREATER來更改它。
http://www.opengl.org/sdk/docs/man3/xhtml/glDepthFunc.xml
進一步證明了它是左撇子在這裏 http://www.opengl.org/sdk/docs/man3/xhtml/glDepthRange.xml
「W剪裁和除以後,深度座標範圍從-1到1,對應於近及遠剪切面」即正z進入屏幕=左手。您也可以使用DepthRange更改爲右手行爲。
編輯:在迴應鮑勃克羅斯的堅持,我錯了,這是一個單一的源文件程序,表明我是對的。 https://github.com/rswinkle/opengl_reference/blob/master/src/left_handed.c
哇!這是一個非常好的解釋。所以我的東西仍然是錯誤的,儘管一些矩陣數學可能已經補償了錯誤的假設。 – praveen 2014-03-27 10:07:11
謝謝。那麼你知道我們的程序員,如果它看起來好像運行正常,那麼怎麼做並不重要。哈。但是,我真的添加了Google+線索的鏈接以顯示混淆的另一方面。整個行列與列列的主要崩潰進一步模糊了這個問題。 – rswinkle 2014-03-29 03:09:12
當然很抱歉,這是第一次真正使用StackOverflow。我的意思是更多的上述評論,但打回來,顯然5分鐘後我不能編輯它。無論如何,我會讓它休息,但是這整個OpenGL的手性和矩陣行與col-major老鼠巢是我的寵物peeve。 – rswinkle 2014-03-29 03:20:53
ALWAYS REMEMBER!! OPENGL ONLY KNOWS NDC ,AND IT IS LEFT_HANDED!
錯覺OpenGL是右撇子,因爲在固定的管道,固定功能是右撇子,像glOrtho(...),glFrustrum(..),所有這些函數已被棄用在可編程管道時間。
OpenGL並不關心你用於中間矩陣過程的什麼手指座標系。如果需要,您可以使用軸座標系,只要您將其鏡像到NDC即可。
忘了相機!
,因爲我們的畫面是2D plane.Imagine此,視口是一個黃色橡膠plane.pine這四個角落NDC。是這樣的:
在NDC所有頂點碰到上沿-z axis.That`s你實際畫面上看到黃色的橡膠面。
可以說OpenGL是右撇子。比方說,我在屏幕上繪製變換矩陣爲Identity的x,y軸,然後圍繞z軸旋轉角度theta = 30 Degrees。所以如果系統是右手的,那麼應該逆時針旋轉。然而,旋轉恰好是順時針指示左手系統。所以這讓我很困惑。 – praveen 2011-03-03 07:44:37
@praveen,我認爲你誤解了操作的順序。如果您發佈實際代碼,原因將變得更加清晰。在OpenGL FAQ中檢查9.070:http://www.opengl.org/resources/faq/technical/transformations.htm – 2011-03-03 13:21:30
@BobCross Hi Bob。我正在嘗試在iOS上學習OpenGL ES。我相信規範的視圖體積有一個左手座標系統。我的程序代碼可以在這裏找到:[鏈接](http://pastie.org/1628587)。 [要嘗試這個代碼,只需用這個代碼替換XCode生成的iOS OpenGL模板項目中的渲染函數]。假設角度爲正,系統是右手的,則旋轉應該以逆時針方向進行。與此相反,旋轉發生在順時針方向。 – praveen 2011-03-03 13:55:53