Opengl顶点摄影机方向
我正在使用顶点进行一个3D项目,我从一个简单的gluLookAt开始,为了让第一人称相机在环境中移动,我这样使用它: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
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世界的轴参考位于它上面。。。谢谢你的解释反正我还有一些代码要优化。