2011-03-02 135 views
4

假設我在OpenGL ES 2.0程序上爲我的modelViewTransformation矩陣使用了標識矩陣。這種情況下的座標系統是從(-1,-1,-1)延伸到(1,1,1)的規範OpenGL座標系統。OpenGL座標系是右手還是左手?

這個座標系是右手還是左手?

一個更廣泛的問題:是否有與OpenGL的一份文件,其中可以列出所有的數學約定其次是API?

回答

7

我的問題是,這是座標 系統右手還是左手?

默認情況下,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圖:它們說明了右手座標系。常見問題解答中的上述引用仍然適用。

+0

可以說OpenGL是右撇子。比方說,我在屏幕上繪製變換矩陣爲Identity的x,y軸,然後圍繞z軸旋轉角度theta = 30 Degrees。所以如果系統是右手的,那麼應該逆時針旋轉。然而,旋轉恰好是順時針指示左手系統。所以這讓我很困惑。 – praveen 2011-03-03 07:44:37

+0

@praveen,我認爲你誤解了操作的順序。如果您發佈實際代碼,原因將變得更加清晰。在OpenGL FAQ中檢查9.070:http://www.opengl.org/resources/faq/technical/transformations.htm – 2011-03-03 13:21:30

+0

@BobCross Hi Bob。我正在嘗試在iOS上學習OpenGL ES。我相信規範的視圖體積有一個左手座標系統。我的程序代碼可以在這裏找到:[鏈接](http://pastie.org/1628587)。 [要嘗試這個代碼,只需用這個代碼替換XCode生成的iOS OpenGL模板項目中的渲染函數]。假設角度爲正,系統是右手的,則旋轉應該以逆時針方向進行。與此相反,旋轉發生在順時針方向。 – praveen 2011-03-03 13:55:53

1

的OpenGL ES座標系統確實是右撇子的系統包括(-1,-1,-1)到(1,1,1)的典型量。我通過代碼驗證了這一點。

3

規範視圖體積(也稱爲標準化設備座標)是左撇子。這是很容易測試通過將單位矩陣和繪圖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

你可以看到截圖自述 https://github.com/rswinkle/opengl_reference

+0

哇!這是一個非常好的解釋。所以我的東西仍然是錯誤的,儘管一些矩陣數學可能已經補償了錯誤的假設。 – praveen 2014-03-27 10:07:11

+0

謝謝。那麼你知道我們的程序員,如果它看起來好像運行正常,那麼怎麼做並不重要。哈。但是,我真的添加了Google+線索的鏈接以顯示混淆的另一方面。整個行列與列列的主要崩潰進一步模糊了這個問題。 – rswinkle 2014-03-29 03:09:12

+0

當然很抱歉,這是第一次真正使用StackOverflow。我的意思是更多的上述評論,但打回來,顯然5分鐘後我不能編輯它。無論如何,我會讓它休息,但是這整個OpenGL的手性和矩陣行與col-major老鼠巢是我的寵物peeve。 – rswinkle 2014-03-29 03:20:53

4

ALWAYS REMEMBER!! OPENGL ONLY KNOWS NDC ,AND IT IS LEFT_HANDED!

錯覺OpenGL是右撇子,因爲在固定的管道,固定功能是右撇子,像glOrtho(...),glFrustrum(..),所有這些函數已被棄用在可編程管道時間。

OpenGL並不關心你用於中間矩陣過程的什麼手指座標系。如果需要,您可以使用軸座標系,只要您將其鏡像到NDC即可。

忘了相機!

,因爲我們的畫面是2D plane.Imagine此,視口是一個黃色橡膠plane.pine這四個角落NDC。是這樣的: enter image description here

在NDC所有頂點碰到上沿-z axis.That`s你實際畫面上看到黃色的橡膠面。

相關問題