将相机变换应用于 OpenGL
Applying Camera Transformations to OpenGL
我正在尝试为3D OpenGL项目创建一个相机类。但是,我不知道如何将相机实际应用于我的场景。我有这些相机功能(除其他外):
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(我认为应用了相机转换?)对我来说毫无意义。它总是与着色器有关,我没有。我目前只有一个线框测试网格。有人可以为我提供此问题的代码片段吗?
如果你不使用着色器,请使用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::translate(modelTransform,-10,-10,-10); 所以你的模型将在 (10,10,10)
我不知道如何使用 GLM,但我可以帮助解决常规的 OpenGL 部分。
glUniformMatrix4fv 在特定着色器程序中由 MatrixID 指定的位置更新 4x4 均匀矩阵。
我建议通过学习现代3D图形编程,这既是参考又是指南。
有关如何在 GLSL 着色器程序中使用这些制服的讨论,请参阅:学习现代 3D 图形编程 - 第 3 章
根据您的代码,您应该执行以下操作:
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内置方法来计算眼睛,目录,向上并将其组合成最终矩阵。
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 使用 std::应用于 std::bind
- 如何将Affine3d应用于Vector3d
- 运算符 += 应用于 std::valarray<int*>
- 函数可以应用于 std::optional,并返回一个可选值吗?
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 当正斜杠运算符应用于C++中的字符串类型时,它会做什么
- 将MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE应用于IMFSinkWriter
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 在运行时将更改的环境变量应用于 QApplication
- Strcmp 类行为应用于C++中的对象列表
- 如何将 ItemDelegate 设置为仅应用于 QTreeView 中的父列
- 什么是应用于C 和CMAKE的定义
- 将对象方法从向量应用于C 的第二个向量中的对象
- STL:将功能应用于Adchacent_difference的结果,而无需额外的容器
- WXWIDGETS应用于WXStaticBitMap时,屏幕截图将大部分图像留为空白
- 如何将垂直纹理应用于QT Surface3D
- 如何将[[nodiscard]]属性应用于lambda
- 将相机变换应用于 OpenGL
- 如何将片段着色器应用于OpenGL中的一个对象