C++ 将摄影机变换应用于OpenGL

C++ 将摄影机变换应用于OpenGL,c++,opengl,matrix,glm-math,C++,Opengl,Matrix,Glm Math,我正在尝试为3D OpenGL项目创建一个Camera类。但是,我不知道如何将摄影机实际应用到场景中。我有以下摄像头功能(除其他功能外): 它们是根据教程创建的,我不确定它们是否有效,因为我无法测试它们。我想做的是让OpenGL使用视图和投影矩阵来模拟相机。我如何确切地告诉OpenGL使用这些投影和视图矩阵,以便它正确地模拟一个独立于模型变换的摄影机?我知道OpenGL默认情况下不会接受glm矩阵,但我在一些教程中看到过这种情况: glm::mat4 ProjectionMatrix = get

我正在尝试为3D OpenGL项目创建一个Camera类。但是,我不知道如何将摄影机实际应用到场景中。我有以下摄像头功能(除其他功能外):

它们是根据教程创建的,我不确定它们是否有效,因为我无法测试它们。我想做的是让OpenGL使用视图和投影矩阵来模拟相机。我如何确切地告诉OpenGL使用这些投影和视图矩阵,以便它正确地模拟一个独立于模型变换的摄影机?我知道OpenGL默认情况下不会接受glm矩阵,但我在一些教程中看到过这种情况:

glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = getViewMatrix();
glm::mat4 ModelMatrix = glm::mat4(1.0);
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

但glUniformMatrix4fv(我认为它适用于摄影机变换?)对我来说毫无意义。它总是与着色器有关,我没有这些着色器。我只是有一个线框测试网格目前。有人能为我提供一个解决这个问题的代码片段吗?

我不知道如何使用GLM,但我可以帮助处理常规OpenGL部分

glUniformMatrix4fv在特定着色器程序中MatrixID指定的位置更新4x4均匀矩阵

我建议您通读,这是一个很好的参考和指南

有关如何在GLSL着色器程序中使用这些制服的讨论,请参见:

我不知道如何使用GLM,但我可以帮助您使用常规OpenGL部件

glUniformMatrix4fv在特定着色器程序中MatrixID指定的位置更新4x4均匀矩阵

我建议您通读,这是一个很好的参考和指南

有关如何在GLSL着色器程序中使用这些制服的讨论,请参见:

使用glLoadMatrixf()如果您不使用着色器,如果您只想使用glMultMatrixf()乘以当前矩阵,则当前矩阵模式可以切换为使用glMatrixMode(GL\U投影或GL\U模型视图);例如(这是您的代码):

编辑:

如果要将变换应用于模型:(模型视图以固定函数组合)

您可能需要如下设置变换: glm::translate(modelTransform,-10,-10);因此,您的模型将处于(10,10,10)

使用glLoadMatrixf()如果您不使用着色器,如果您只想使用glMultMatrixf()乘以当前矩阵,则当前矩阵模式可以切换为使用glMatrixMode(GL_投影或GL_模型视图);例如(这是您的代码):

编辑:

如果要将变换应用于模型:(模型视图以固定函数组合)

您可能需要如下设置变换:
glm::translate(modelTransform,-10,-10);因此,您的模型将处于(10,10,10)

基于您的代码,您应该执行以下操作:

glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = inverse(getViewMatrix());//view(camera) must be inverse(if you don't already do it)
glm::mat4 ModelMatrix = glm::mat4(1.0);
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, value_ptr(MVP));//use value_ptr method to pass matrix pointer

另外,为了设置合适的相机矩阵,我建议使用lookAt()GLM内置方法来计算eye、dir、up,并将它们合成为最终矩阵。

根据您的代码,您应该执行以下操作:

glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = inverse(getViewMatrix());//view(camera) must be inverse(if you don't already do it)
glm::mat4 ModelMatrix = glm::mat4(1.0);
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, value_ptr(MVP));//use value_ptr method to pass matrix pointer

另外,为了设置合适的相机矩阵,我建议使用lookAt()GLM内置方法来计算eye、dir、up,并将它们合成为最终矩阵。

好的,这将应用我的投影矩阵。。。如何应用视图矩阵?glMatrixMode从OpenGL 3.0开始折旧。因为OP听起来才刚刚开始,所以明智的做法是不要将其指向贬值的功能。弃用?这不算什么吗。据我所知,我猜现在变换和几乎所有的事情都是通过着色器处理的?好的,这应用了我的投影矩阵。。。如何应用视图矩阵?glMatrixMode从OpenGL 3.0开始折旧。因为OP听起来才刚刚开始,所以明智的做法是不要将其指向贬值的功能。弃用?这不算什么吗。据我所知,我猜现在变换和几乎所有的事情都是通过着色器处理的?不幸的是,我没有MatrixID这样的变量。我目前没有实现任何着色器。但是如果使用固定管道进行此操作,则根本不需要手动计算矩阵。请搜索教程。我从未做过固定的工作,因此在这里无法\n真正提供帮助。不幸的是,我没有MatrixID这样的变量。我目前没有实现任何着色器。但是如果使用固定管道进行此操作,则根本不需要手动计算矩阵。请搜索教程。我从未执行过固定操作,因此在这里无法真正提供帮助。这是一个很棒的资源。谢谢。如果有人对在OSX上运行学习现代3D图形编程教程感兴趣,我这里有一个Xcode+GLFW3端口:(wip)这是一个很棒的资源。谢谢。如果有人对在OSX上运行学习现代3D图形编程教程感兴趣,我这里有一个Xcode+GLFW3端口:(wip)
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(&viewMatrix[0][0]); 
glMultMatrixf(&modelTransform[0][0]);   //model * view
Draw_your_model();
glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = inverse(getViewMatrix());//view(camera) must be inverse(if you don't already do it)
glm::mat4 ModelMatrix = glm::mat4(1.0);
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, value_ptr(MVP));//use value_ptr method to pass matrix pointer