2011-11-04 108 views
1

有人可以解釋我以下幾行是什麼嗎?一些opengl和glm的解釋

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 
angle = (GLfloat) (i % 360); 
glm::mat4 View = glm::mat4(1.); 
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f)); 
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f)); 
glm::mat4 Model = glm::mat4(1.0); 
glm::mat4 MVP = Projection * View * Model; 
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE, glm::value_ptr(MVP)); 

他們將單位轉換爲像素,但我不確定是否他們這樣做。另一個問題,更一般的問題是,我如何表示一個數字,即sin(90)= 1,到10個像素,還是40或任何數字?我如何指定(0,0)將在屏幕中間?以上所有都由glm庫保管好了嗎?

回答

7

第一行創建等價於調用gluPerspective(45.0f,1.0f,0.1f,100.0f)的透視投影。如果你不知道該怎麼做gluPerspective,看看這個link

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 

下一行剛模旋轉角度360,以確保我們的投射角度小於360度。

angle = (GLfloat) (i % 360); 

接下來的幾行定義了我們的視圖矩陣。這基本上是您的相機視圖端口,即您在顯示器上看到的內容。該平移和旋轉功能的調用都轉換功能調用我們的攝像機移動到位置

glm::mat4 View = glm::mat4(1.); 
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f)); 
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f)); 

下一行定義我們模型的位置。在這種情況下,它將是(1.0f,1.0f,1.0f,1.0f)。如果你想知道爲什麼有4個參數,而不是3,閱讀OpenGL的橙皮書或檢查維基百科上homogeneous coordinates

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

最後兩行完成的計算模型視圖投影矩陣建立我們的場景,並把它傳遞給OpenGL的。

glm::mat4 MVP = Projection * View * Model; 
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE,  glm::value_ptr(MVP)); 

總的來說你的代碼塊確實是從翻譯模型模擬的OpenGL繪圖管線座標轉換爲視圖座標。

關於你問的第二個問題。我不明白第一部分,將數字轉換爲像素意味着什麼?您是否試圖將1D矩陣中的點映射到2D矩陣?如果是這種情況,只要做標準映射,就像像素[index/rows] [index%rows],其中pixel是你的屏幕像素對象,index是你的數組索引,row是你的屏幕寬度。對於第二部分(如何將(0,0)設置爲屏幕中間),我認爲您需要做的只是爲屏幕原點添加一個偏移量,因爲OpenGL使用左手座標系,屏幕原點即(0,0)點將位於屏幕的左下角。所以如果你想讓你的系統在屏幕中間,只需添加一個(-width/2, - 高度/ 2)的偏移量來將你的點轉換爲OpenGL空間或者(寬度/ 2,高度/ 2)投影。但不建議使用自己建立的標準。

0

設置的立體照相機變換:

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 

移動相機回落Z軸的位:

View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f)); 

旋轉攝像機周圍向後X軸:

View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f)); 

圍繞Y軸和Z軸旋轉相機的速度爲X軸的一半:

View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));