Opengl顶点摄影机方向

Opengl顶点摄影机方向,opengl,rotation,vertices,Opengl,Rotation,Vertices,我正在使用顶点进行一个3D项目,我从一个简单的gluLookAt开始,为了让第一人称相机在环境中移动,我这样使用它: gluLookAt(_position.x,_position.y,_position.z, _target.x,_target.y,_target.z, 0,0,1); glm::mat4 Projection = glm::perspective(90.0f, 800.0f / 600.0f, 0.1f, 100.f); glm::mat4 V

我正在使用顶点进行一个3D项目,我从一个简单的gluLookAt开始,为了让第一人称相机在环境中移动,我这样使用它:

   gluLookAt(_position.x,_position.y,_position.z,
      _target.x,_target.y,_target.z,
      0,0,1);
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");
一切正常,我根据鼠标位置和角度(θ和φ)计算我的目标,我的项目开始使用顶点来解决性能问题,因此我必须对这些新对象使用相同的相机,为了做到这一点,我以这种方式使用GLM库:

   gluLookAt(_position.x,_position.y,_position.z,
      _target.x,_target.y,_target.z,
      0,0,1);
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平面上它应该面向相机。

从我的角度来看,您似乎误解了OpenGL中的翻译是如何工作的

glm::lookAt返回一个modelview矩阵。->场景中的对象如何根据摄影机进行平移。在openGL中,您不“移动”摄影机,而是移动摄影机周围的所有对象。 因此,如果在0(世界摄影机系统的原点)中有2个对象,并且您的摄影机位于 眼睛(0,0,-3),中心(0,0,0),向上(0,1,0),如果要向左移动一个对象,向右移动一个对象,则需要从glm获得矩阵堆栈

std::stack<glm::mat4> glm_ProjectionMatrix; 
这将根据给定的翻译相应地更新两个对象

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

我希望你能理解我的答案

OpenGL中运动(rot和trans)的基础是矩阵多重化。不需要在着色器中向modelview添加一些平移向量。GLM可以完成C++代码< /P>中的所有内容 数学:

Modelview是一个4*4矩阵 如果不应旋转或平移对象,则modelview等于标识

如果要旋转对象,请使用正确的4*4旋转矩阵(请参见同质坐标)来混合modelview矩阵

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

假设X=(X,y,z,w)是顶点吗

T是平移,R是旋转

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

模型视图*旋转*平移*v=v'

v'是点在三维坐标系中的新位置

您可以在这里找到一些示例代码:参见“Teil 13”或更高版本。如果你能理解德语,你可以在YouTube上用C++的“CengkViababs/< P>”的名字在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);
顶点是一个属性(vec3表示位置)


这段代码将上传modelview和投影后绘制的所有顶点以相同的平移方式移动到着色器。

修改代码后,似乎相机很好,只是我的对象绘制在它的顶部,我不知道为什么如果有人能为我照亮它,那太好了。我的顶点的坐标参考似乎与glLookAt不一样,我的立方体绘制的位置与我的相机相同,但不是我的顶点数组……我知道modelview是关于相机的,在我的代码中,我不会混合对象的平移和“相机的平移”,在我的着色器中,“平移”和“旋转”这两个词对应于对象,MVP用于摄影机(位置=摄影机的位置),透视图和模型视图已经由CPU在MVP中计算,我只想应用着色器中所有顶点的平移和旋转以获得更好的性能,我想我可以把旋转和平移放在MVP中,但这不会改变任何事情,是吗?我还是做错了什么吗?那么你想对场景中的所有顶点进行相同的平移/旋转吗?我试图根据你所说的更改代码,我只是用MVP进行了尝试,没有对对象进行任何旋转/平移,问题仍然存在,因此我的问题似乎不是来自这一点。如果我对所有顶点都有相同的平移/旋转,这并不重要,这件事实际上不起作用,但你是对的,如果我有几个顶点要显示,我可能会在稍后更改它。我解决了我的问题,它不是来自顶点/Opengl矩阵,而是因为我没有正确初始化我的相机目标,它考虑了空间的一部分作为初始值,因此Opengl世界的轴参考位于它上面。。。谢谢你的解释反正我还有一些代码要优化。