2011-10-11 79 views
0

我正在寫一個3D OpenGL應用程序,我的頂點轉換矩陣有問題。OpenGL左手座標系

這裏是我的頂點着色器:

attribute vec4  vInPos; 

uniform mat4 kWorld; 
uniform mat4 kProj; 

void main(void) 
{ 
    vec4 world_pos = kWorld * vInPos; 
    gl_Position = kProj * world_pos; 
} 

我所有的矩陣存儲行重大,我用左手投影矩陣作爲我的投影矩陣。

問題是,當我通過矩陣轉換頂點時,它在X軸和Y軸上都沿錯誤的方向移動,並被翻轉。因此,通過(100.0f,100.0f,100.0f)進行平移可以在Z軸上(遠離相機)以正確的方式移動我的頂點,但在X軸(向後)的左側和Y軸(向後)向下移動我的頂點。

下面是它目前的樣子:而不是倒在左邊screenshot

的FPS計數器應該是向上和向右。它顯然也不應該被鏡像。根據我讀過的內容,這是因爲OpenGL默認使用右手座標系,但我不確定我能做些什麼來解決這個問題。

我發現一些文章試圖解釋它,但我找不到任何解決方案。 This question提到OpenGL規範顯示了座標系預期的內容,但看了之後,我沒有看到這對我有什麼幫助。編號: 作爲參考,我的投影矩陣代碼是基於DirectX SDK

編輯: 根據Nicol Bolas的建議,我現在使用gluPerspective的矩陣,但我得到了相同的結果。


下面是我使用的設置我的矩陣代碼:

/* Vertex data for reference 
float vertices[] = 
{ 
    {0.0f,0.0f,0.0f}, 
    {5.0f,0.0f,0.0f}, 
    {0.0f,5.0f,0.0f}, 
    {5.0f,5.0f,0.0f}, 
}; */  
float worldf[16]; 
float projf[16]; 
float fov  = 60.0f; 
float aspect = 1280.0f/720.0f; 
float near  = 1.0f; 
float far  = 1000.0f; 
float f   = 1.0f/tanf((fov*6.2831f/360.0f)/2.0f); 

/* Build world matrix */ 
memset(worldf, 0, sizeof(worldf)); 
worldf[0] = worldf[5] = worldf[10] = worldf[15] = 1.0f; 
worldf[12] = 100.0f; 
worldf[13] = 100.0f; 
worldf[14] = -100.0f; 

/* Build perspective matrix */ 
memset(projf, 0, sizeof(projf)); 
projf[0] = f/aspect; 
projf[5] = f; 
projf[10] = (far+near)/(near-far); 
projf[14] = (2.0f*far*near)/(near-far); 
projf[11] = -1.0f; 

glUniformMatrix4fv(proj_uniform, 1, GL_FALSE, projf); 
glUniformMatrix4fv(world_uniform, 1, GL_FALSE, worldf); 

使用此代碼,我的文字顯示不出來的。

編輯:不知道它是否相關,但我在OS X Snow Leopard上使用OpenGL 2.0。

+0

我曾經聽到類似的東西,從左手轉右手座標系統,只需翻轉軸線之一。 (即:而不是(1,1,1),你可能會有(1,1,-1)。)他們說,你翻轉哪一個並不重要,但顯然有一些比給定的期望結果更好其他。 – cHao

+0

我試過每次反轉每個軸。翻轉X或Y軸不會影響結果,翻轉Z將完全消除我的渲染。我已經關閉撲殺,所以並不是我的平局被剔除。 – Kyle

回答

1

我用左手投影矩陣

停止這樣做。

同樣重要的是,對於OpenGL和D3D,投影矩陣(剪輯空間)的輸出是不同的。您不能僅僅採用D3D投影矩陣,將其轉置,並期望GLSL能夠很好地接受輸出。

再次,查找gluPerspective並使用該矩陣。


每尼科爾流星錘的建議,我現在使用從gluPerspective矩陣,但我得到了相同的結果。

你很可能還使用了一堆其他的左手矩陣。你的模型到相機矩陣需要是右手的。另外,你的頂點數據也需要是右手的。或者,您可以嘗試將左手空間轉換爲右手空間,但除非您沒有其他選擇,否則我不會提供建議。


float f = 1.0f/tanf(fov/2.0f); 

fov是在度的角度。 tanf需要在角度弧度tanf30.0f是負數,這意味着您的透視矩陣中的平截球比例是負值。這有效地反轉了您視圖的X和Y軸。

你真正需要的是這樣的:

float f = 1.0f/tanf((fov * 6.2831f/360.0f)/2.0f); 
+0

我的歉意,我意外地輸入正確,而不是左側。我使用左手透視矩陣。我更新了我原來的問題。 – Kyle

+0

我不再使用任何左撇子的東西。我的矩陣是使用gluPerspective的數學基礎構建的,我的世界矩陣只是一個具有'worldMatrix [12] = 100,worldMatrix [13] = 100,worldMatrix [14] = 100'的單位矩陣。我的4個頂點是頂點[] = {{0,0},{50,0},{0,50},{50,50}}'。爲了確保在我嘗試進行更改時不會被剔除,我關閉了剔除過程,並且我有兩個索引緩衝區,一個順時針旋轉,一個逆時針旋轉,我測試了兩者。似乎沒有什麼改變結果。 – Kyle

+0

@Kyle:標準OpenGL透視矩陣設置的攝像機空間在攝像機前有-Z,在它後面有+ Z。所以如果你將頂點翻譯了100,而你仍然看到它們,那麼你在某個地方仍然有一些不好的矩陣。你可以在你的答案中加入你正在使用的實際矩陣,以及你用來渲染的glUniformMatrix代碼嗎? –