我正在尝试为3D OpenGL项目创建一个Camera类。但是我无法弄清楚如何将相机实际应用到我的场景中。我有这些相机功能(以及其他):
void Camera::update(){
glm::vec3 direction(cos(_verticalAngle) * sin(_horizontalAngle), sin(_verticalAngle), cos(_verticalAngle) * cos(_horizontalAngle));
glm::vec3 right = glm::vec3(sin(_horizontalAngle - 3.14f/2.0f), 0, cos(_horizontalAngle - 3.14f/2.0f));
glm::vec3 up = glm::cross(right, direction);
_projectionMatrix = glm::perspective(_FoV, float(VIEWPORT_X) / float(VIEWPORT_Y), 0.1f, 250.0f);
_viewMatrix = glm::lookAt(_position, _position + direction, up);
}
glm::mat4 Camera::getProjectionMatrix(){
return _projectionMatrix;
}
glm::mat4 Camera::getViewMatrix(){
return _viewMatrix;
}
它们是从教程创建的,我不确定它们是否有效,因为我无法测试它们。我想要做的是让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(我觉得应用相机转换?)对我来说毫无意义。它总是与着色器有关,我没有。我目前只有一个线框测试网格。有人可以为我提供此问题的代码段吗?
答案 0 :(得分:2)
如果你不使用着色器,请使用glLoadMatrixf(),如果你只想使用当前矩阵使用glMultMatrixf(),当前矩阵模式可以切换使用glMatrixMode(GL_PROJECTION或GL_MODELVIEW);例如(这是你的代码):
lm::mat4 ProjectionMatrix = getProjectionMatrix();
//setup projection matrix for opengl
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMultMatrixf(glm::value_ptr(ProjectionMatrix));
or:
glMultMatrixf(&ProjectionMatrix[0][0]);
编辑:
如果要将变换应用于模型:( model_view组合在固定函数中)
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(&viewMatrix[0][0]);
glMultMatrixf(&modelTransform[0][0]); //model * view
Draw_your_model();
您可能需要像这样设置转换: GLM ::翻译(modelTransform,-10,-10,-10);所以你的模型将在(10,10,10)
答案 1 :(得分:1)
我不知道如何使用GLM,但我可以帮助使用常规的OpenGL部分。
glUniformMatrix4fv在特定着色器程序中的MatrixID指定的位置更新4x4统一矩阵。
我建议使用Learning Modern 3D Graphics Programming,这是一个很好的参考和指南。
有关如何在GLSL着色器程序中使用这些制服的讨论,请参阅: Learning Modern 3D Graphics Programming - Chapter 3
答案 2 :(得分:0)
根据您的代码,您应该执行以下操作:
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并将它们组合成最终矩阵。