Opengl Vertices相机方向

时间:2014-06-18 12:44:05

标签: opengl rotation vertices

我正在使用顶点进行3D项目,我使用简单的gluLookAt启动它,以便让第一人称相机在环境中移动,我用这种方式:

   gluLookAt(_position.x,_position.y,_position.z,
      _target.x,_target.y,_target.z,
      0,0,1);

一切都工作正常,我根据鼠标的位置和角度(theta和phi)计算我的目标,我的项目继续使用顶点来解决性能问题,所以我不得不使用相同的相机来实现这些新功能对象,为了做到这一点,我用这种方式使用了GLM库:

glm::mat4 Projection = glm::perspective(90.0f, 800.0f / 600.0f, 0.1f, 100.f);
glm::mat4 View = glm::lookAt(
glm::vec3(position.x,position.y,position.z),
glm::vec3(target.x,target.y,target.z), 
glm::vec3(0,0,1)  
    );

glm::mat4 Model = glm::mat4(1.0f); !
// Our ModelViewProjection : multiplication of our 3 matrices
glm::mat4 MVP = Projection * View * Model; 

GLuint MatrixID = glGetUniformLocation(this->shaderProgram, "MVP");

这是我使用的着色器:

const GLchar* default_vertexSource =
"#version 150 core\n"
"in vec2 position;"
"in vec3 color;"
"out vec3 Color;"
"uniform vec3 translation;"
"uniform mat4 rotation;"
"uniform mat4 MVP;"
"void main() {"
"   Color = color;"
"   gl_Position = MVP*rotation*vec4(position.x + translation.x, position.y + translation.y, 0.0 + translation.z, 1.0);"
"}";

我的对象的坐标参考与我的相机不同,它在当前的x / z计划上面绘制,而它应该在x / y计划上面向相机。

1 个答案:

答案 0 :(得分:0)

从我的观点来看,您似乎很难理解OpenGL中的翻译是如何工作的。

glm :: lookAt返回一个modelview矩阵。 - >如何根据相机翻译场景中的对象。在openGL中,您不会“移动”相机,而是移动相机周围的所有物体。 因此,如果您在0 0 0(世界相机系统的原点)中有2个物体,并且您的相机处于 eye(0,0,-3),center(0,0,0),up(0,1,0)并且你想要向左移动一个对象,在右边的对象上移动你需要有一个矩阵堆栈来自glm

std::stack<glm::mat4> glm_ProjectionMatrix; 

在这里,您可以将相机中的模型视图作为顶级对象推送。

对于左侧的对象movemtn,您可以使用glm :: translate,将此mat4作为模型视图矩阵上传到着色器。 (这里不渲染场景)

将顶部矩阵重置为modelview(如果您之前复制了top元素,则将eiter pop()重置)或者仅使用glm :: lookAt重置。然后glm ::翻译另一个方向。

在你的顶点着色器中,你现在不需要vec3平移或旋转。

你刚才说

 gl_Position = perspective * modelview *vec4(position,1);

这将根据您的翻译更新两个对象。

如果要移动某些对象,只需更新一个对象的modelview矩阵即可。

http://www.songho.ca/opengl/gl_transform.html

我希望你能理解我的答案。

OpenGL中的移动(rot和trans)基础是矩阵乘法。您无需在着色器中向模型视图添加一些翻译vec。 GLM可以完成你c ++代码中的所有内容

数学:

Modelview是一个4 * 4矩阵 如果您的对象不应旋转或翻译,则模型视图等于标识。

如果你想旋转对象,你需要使用正确的4 * 4旋转矩阵(见同质坐标)模拟视图矩阵

如果要翻译顶点,请将正确的平移乘以矩阵

让我们说 X =(x,y,z,w)是你的顶点

T是平移,R是旋转

有效的操作可能如下所示:

模型视图*轮换*翻译* v = v'

v'是3D坐标系中点的新位置

您可以在此处找到一些示例代码:http://incentivelabs.de/Sourcecode/请参阅“Teil 13”或更高版本。如果您能够理解德语,您可以使用频道名称“incentivelabs”在Youtube上找到有关使用C ++的OpenGL的教程

编辑:

如果我想使用带有GLM的C ++移动对象/旋转对象

glm_ProjectionMatrix.top() = camera.getProjectionMat();
glUniformMatrix4fv(uniformLocations["projection"], 1, false,glm::value_ptr(glm_ProjectionMatrix.top()));
glm_ModelViewMatrix.top() = camera.getModelViewMat();

glm_ModelViewMatrix.top() = glm::translate(
glm_ModelViewMatrix.top(),
glm::vec3(0.0f, 0.0f, -Translate));

glUniformMatrix4fv(uniformLocations["modelview"], 1, false,glm::value_ptr(glm_ModelViewMatrix.top()));

在GLSL顶点着色器中:

gl_Position = projection  * modelview * vec4(vertexPos,1);

vertexPos是一个属性(位置的vec3)

此代码将上传模型视图和投影后绘制的所有顶点移动到具有相同平移的着色器。