2011-12-29 83 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