2011-12-29 96 views
1

我正在呈現在OpenGL地形。 我的代碼如下:移動的攝像機在OpenGL

void Render_Terrain(int k) 
{ 
    GLfloat angle = (GLfloat) (k/40 % 360); 

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

    //VIEW 
    glm::mat4 View = glm::mat4(1.); 

    //ROTATION 
    //View = glm::rotate(View, angle * -0.1f, glm::vec3(1.f, 0.f, 0.f)); 
    //View = glm::rotate(View, angle * 0.2f, glm::vec3(0.f, 1.f, 0.f)); 
    //View = glm::rotate(View, angle * 0.9f, glm::vec3(0.f, 0.f, 1.f)); 

    View = glm::translate(View, glm::vec3(0.f,0.f, -4.0f)); // x, y, z position ? 

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

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

    //Transfer additional information to the vertex shader 
    glm::mat4 MV = Model * View; 
    glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "MV_matrix"), 1, GL_FALSE, glm::value_ptr(MV)); 

    glClearColor(0.0, 0.0, 0.0, 1.0); 

    glDrawArrays(GL_LINE_STRIP, terrain_start, terrain_end); 

} 

我可以做左右旋轉的X,Y,Z軸,擴大我的地形,但我不能找到一種方法來移動攝像機。我使用的是OpenGL 3+,而且我對圖形還不熟悉。

+0

嘗試在http://gamedev.stackexchange.com/上提問這個問題,您可能會有更好的運氣。 – Cyclonecode 2011-12-29 18:39:25

回答

1

在OpenGL中,相機總是處於(0,0,0)。您需要設置的矩陣模式GL_MODELVIEW,然後修改或設置,使用像glTranslate,glRotate,glLoadMatrix等,以使其出現相機移動的模型/視圖矩陣。如果您使用GLU,則可以使用gluLookAt將攝像機指向特定方向。

+2

好吧,好像他在使用沒有任何廢棄矩陣的GL3內核(或者至少沒有內置矩陣)。 – 2011-12-29 18:53:41

4

移動相機的最佳方法是通過使用gluLookAt(),它可以模擬相機的移動,因爲相機無法移動。該函數需要9個參數。前3個是相機準確定位的眼睛的XYZ座標。第二個3參數是中心的XYZ座標,它是相機從眼睛看的點。它總是會成爲屏幕的中心。第三個3參數是從眼睛垂直向上指向的UP矢量的XYZ座標。通過操縱這3個XYZ座標,您可以模擬任何您想要的相機移動。

看看這個link

進一步瞭解詳細:

- 如果你想例如圍繞對象旋轉,你繞了矢量你的眼睛。 - 如果您想向前或向後移動,則可以對眼睛以及中心點進行加減。 - 如果要傾斜攝像機向左或向右旋轉你的周圍你的樣子矢量矢量在您的注視向量是中心 - 眼。

gluLookAt在不建議使用的固定功能管道上運行,因此應該使用glm :: lookAt代替。

+0

「從字面上看,並沒有讓世界變得模擬攝像機的運動」那**正在推動世界模擬攝像機的運動。這兩個概念是一樣的。 – 2011-12-29 19:06:39

+0

@NicolBolas哈哈,這是真的。相機無法移動。他們都是一樣的。 – Waleed 2011-12-29 19:24:37

+0

'gluLookAt'運行在過時的固定功能的管道,所以你應該建議'GLM :: lookAt'代替。 – 2011-12-29 19:31:25

2

您目前使用的是常向量進行翻譯。在註釋掉的代碼中(我假設你正在用它來測試旋轉),你使用angle來調整旋轉。你應該有一個類似的翻譯變量。然後,您可以將glm::translate呼叫更改爲:

View = glm::translate(View, glm::vec3(x_transform, y_transform, z_transform)); // x, y, z position ? 

並獲得翻譯。

您應該將多個參數傳入Render_Terrain,因爲平移和旋轉至少需要6個參數。

+0

你的意思是我應該改變xy和z,把它們乘以sin或cos函數然後調用上面的? – 2011-12-29 19:36:14

+0

@TestTest,no。讓我們稍微回顧一下。你傳遞給'Render_Terrain'的是什麼? – MSN 2011-12-29 19:55:38