2016-03-15 80 views
0

我正在使用GLM和GLFW繪製一個正方形。我有以下代碼:Vertex OpenGL LookAt沒有顯示

static const GLfloat g_vertex_buffer_data[] = { 
    // square 

    0, 0, 0, 
    1, 0, 0, 
    0, 0, 1, 

    1, 0, 0, 
    1, 0, 1, 
    0, 0, 1, 

}; 

glm::mat4 Projection = glm::perspective(glm::radians(45.0f), (float)_width/(float)_height, 0.1f, 100.0f); 

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); 

glm::mat4 Model = glm::mat4(1.0f); 

glm::mat4 mvp = Projection * View * Model; 
GLuint MatrixID = glGetUniformLocation(programID, "MVP"); 


glm::mat4 MyModel = glm::mat4(1.0f); 
glm::mat4 MyMVP = Projection * View * MyModel; 

奇怪的是在這裏:

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); 

現在,我什麼也看不見。但是,當我把它改成這樣:

glm::mat4 View = glm::lookAt(glm::vec3(0.f, 5.f, 0.000001f), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); 

然後我居然能看到廣場。 當我將Zcoördinate更改爲零時,爲什麼我無法看到它?爲什麼當它將其更改爲大於0的值時它會工作?我實際上希望它爲零(所以從5個單位直到中心點),但由於某種原因不起作用。

---編輯---

這是glm::vec3(0.f, 5.f, 0.0000000000001f)

http://bit.ly/251TAC7

這是glm::vec3(0.f, 5.f, 0.000000000000f)

http://bit.ly/1QUqBZz

+0

你的向上應該是(0,0,1)而不是(0,1,0)。目前您的觀看方向和向量是相同的,所以跨產品將無法正常工作。當您更改爲0.001f時,向上矢量可以「近似」。 – aslg

+0

@aslg那有用,但是當我像你說的那樣改變向上的東西時它意味着什麼?究竟發生了什麼?我做了一個編輯 – Markinson

回答

2

所以你LOOKAT設置是結果錯誤。您的相機當前指向(0,5,0)至(0,0,0),向上向量爲(0,1,0)。

這意味着您的相機正在尋找在負Y方向

normalize((0,0,0) - (0,5,0)) = (0,-1,0) 

這是相同的方向上向量(倒,但是這無關緊要)。顯然,你的相機不能指向與向上矢量相同的方向。

要解決你的問題,你只需要使用向上的向量(0,0,1)。


OP's scene

這是你的場景看起來像一個正確設置相機。 XYZ是世界參考(你也可以在那裏看到你的四邊形),UVN是相機參考。 N是視圖方向,V是向上矢量,U是與N和V平行的側向矢量。因爲GLM爲您做了這些工作,所以您實際上不必處理相機的UVN座標,您只需提供中心和眼點以及世界座標中的向上矢量。

如果您的向上向量與視圖方向相同,那麼它們不能是正交的,並且攝像機參考沒有很好地定義。

將中心點更改爲使Z = 0.0000001f而不是0,使得向上矢量不完全平行於視圖方向。外觀函數的實現略微接近您向真實向量提供的向上向量。這樣做是爲了在每次想要設置相機時都不必計算精確的向量。

您只需指定向上向量爲(0,0,1),並且如果您的視圖方向恰好與向上向量不正交,則查看計算向上向量的最佳近似值,使得UVN矢量仍然是正交的。除非向上矢量與視圖方向一致,在這種情況下,向上矢量可以是任何東西。

如果您不瞭解相機座標,向上矢量等,請花些時間查看/閱讀它。 SO也有很好的答案。