【问题标题】:Applying Camera Transformations to OpenGL将相机变换应用于 OpenGL
【发布时间】:2012-11-27 10:41:04
【问题描述】:

我正在尝试为 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(我认为它应用了相机变换?)对我来说毫无意义。它总是与着色器有关,而我没有。我目前只有一个线框测试网格。有人可以为我提供这个问题的代码 sn-p 吗?

【问题讨论】:

    标签: c++ opengl matrix glm-math


    【解决方案1】:

    如果您不使用着色器,请使用 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)

    【讨论】:

    • 好的,这将应用我的投影矩阵...我将如何应用视图矩阵?
    • glMatrixMode 自 OpenGL 3.0 起已弃用。由于听起来 OP 才刚刚开始,因此明智的做法是不要将它们指向折旧的功能。
    • 已弃用?那不是什么东西。据我了解,我猜想变换和现在几乎所有东西都通过着色器处理?
    【解决方案2】:

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

    glUniformMatrix4fv 在特定着色器程序中由 MatrixID 指定的位置更新 4x4 统一矩阵。

    我建议使用Learning Modern 3D Graphics Programming,它既可以作为参考,也可以作为指南。

    有关如何在 GLSL 着色器程序中使用这些制服的讨论,请参阅: Learning Modern 3D Graphics Programming - Chapter 3

    【讨论】:

    • 这是一个很棒的资源。谢谢。
    • 如果有人有兴趣在 OS X 上运行学习现代 3D 图形编程教程,我在这里有一个 Xcode+GLFW3 端口:github.com/rsanchezsaez/gltut-glfw (wip)
    【解决方案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 内置方法来计算 eye、dir、up 并将它们组合成最终矩阵。

    【讨论】:

    • 不幸的是,我没有像 MatrixID 这样的变量。我目前没有实现着色器。
    • 但是如果你使用固定管道来做,那么你根本不需要手动计算你的矩阵。搜索教程。我从来没有做过固定的东西,所以在这里真的不能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多