2015-09-12 45 views
-1

我不知道爲什麼,但似乎我的z軸竊聽(現在看來,這是加倍的價值或東西)投影在OpenGL(臭蟲以Z軸)

這應該是一個立方體

https://scontent-mad1-1.xx.fbcdn.net/hphotos-xtp1/v/t34.0-12/11998230_879538255460372_61658668_n.jpg?oh=dd08fee0a66e37bf8f3aae2fba107fa1&oe=55F6170C

但是現在看來似乎是 「深」 說的什麼似乎是錯誤的

我pr_Matrix:

mat4 mat4::prespective(float fov, float aspectRatio, float near, float far){ 
     mat4 result; 

     float yScale = 1.0f/tan(toRadians(fov/2.0f)); 
     float xScale = yScale/aspectRatio; 

     float frustumLength = far - near; 

     result.elements[0 + 0 * 4] = xScale; 
     result.elements[1 + 1 * 4] = yScale; 
     result.elements[2 + 2 * 4] = -(far + near)/frustumLength; 
     result.elements[3 + 2 * 4] = -1.0f; 
     result.elements[2 + 3 * 4] = -(2.0f * far * near)/frustumLength; 

     return result; 
    } 

我ml_Matrix:

 maths::mat4 &ProjectionMatrix(){ 

      maths::mat4 m_ProjM = maths::mat4::identity(); 

      m_ProjM *= maths::mat4::translation(m_Position); 

      m_ProjM *= maths::mat4::rotation(m_Rotation.x, maths::vec3(1, 0, 0)); 
      m_ProjM *= maths::mat4::rotation(m_Rotation.y, maths::vec3(0, 1, 0)); 
      m_ProjM *= maths::mat4::rotation(m_Rotation.z, maths::vec3(0, 0, 1)); 

      maths::mat4 scale_matrix = maths::mat4(m_Scale); 
      scale_matrix.elements[3 + 3 * 4] = 1.0f; 

      m_ProjM *= scale_matrix; 
      return m_ProjM; 
     } 

我vw_matrix(相機)

 void update(){ 
      maths::mat4 newMatrix = maths::mat4::identity(); 
      newMatrix *= maths::mat4::rotation(m_Pitch, maths::vec3(1, 0, 0)); 
      newMatrix *= maths::mat4::rotation(m_Yaw, maths::vec3(0, 1, 0)); 
      newMatrix *= maths::mat4::translation(maths::vec3(-m_Pos.x, -m_Pos.y, -m_Pos.z)); 
      m_ViewMatrix = newMatrix; 
     } 

我的矩陣乘法在GLSL代碼:

vec4 worldPosition = ml_matrix * vec4(position, 1.0); 
vec4 positionRelativeToCamera = vw_matrix * worldPosition; 
gl_Position = pr_matrix * positionRelativeToCamera; 

編輯:我想我明白了! (一旦我獲得時間,會仔細檢查數學)大多數教程(所以,我的代碼的來源)使用mat4 :: prespective(float fov,float aspectRatio,float near,float far),他們沒有說的是「視野」是指「fovy」(所以「垂直視場」),結果似乎複製「通常FOV遊戲」現在有了這個簡單的變化:

 float xScale = 1.0f/tan(toRadians(fov/2.0f)); 
     float yScale = xScale * aspectRatio; 

感謝您指出它作爲一個FOV問題Henk De Boer

+0

你在預期函數中通過了什麼「fov」。 –

+0

這是我的函數調用「mat4 proj = mat4 :: prespective(80.0f,16.0f/9.0f,0.1f,100.0f);」所以80.0f –

+0

嘗試把它放在更低的位置,應該有所幫助。說45-60。 –

回答

1

這只是FOV的結果,您提供的FOV會極大地改變圖像的外觀。這是一個個人品味你選擇什麼的問題。要獲得自然的感覺場景,45-60之間的任何事物都是好的,但是您可以加強這一點,讓場景更加直接,或者節奏更快。觀察以下圖像具有兩倍完全相同的幾何圖形,但右側的底座向90度FOV處的視口突出得更遠。

enter image description here

+0

非常感謝這個例子,並給我一個解決方案! –

+0

@PedroDavid沒問題,請接受答案,以便您的問題被標記爲已解決 –

+0

哦,我試圖標記它是有用的,但仍然不能,甚至沒有注意到,再次感謝 :) –

0

我的猜測是,在宣佈:

mat4 result; 

你」重新調用將矩陣初始化爲標識的默認構造函數。

然後在設置的矩陣隨後的代碼,你需要一個電話:

result.elements[3 + 3 * 4] = 0.0f; 

而且,它的價值,在我的代碼行:

result.elements[3 + 2 * 4] = -1.0f; 
result.elements[2 + 3 * 4] = -(2.0f * far * near)/frustumLength; 

是不是否定。 TBH,我不確定是否有什麼需要擔心的。

+0

我的mat4構造函數把每個元素都設置爲0(除非我把float作爲參數,那麼除了對角線的每個元素之外,一切都是0那就變成了那個浮點數)所以我不需要調用「result.elements [3 + 3 * 4] = 0.0f;」。我試圖用這些「 - 」來玩,但它只能這樣工作 –