c++ - OpenGL Camera Strafing 不起作用

标签 c++ opengl matrix camera transformation

我目前正在研究 OpenGL 框架/引擎,就 OpenGL 部分而言,我对我的结果非常满意。 另一方面,我在让相机工作时遇到了严重的问题。 沿 Z 轴移动效果很好,但是一旦我开始扫射(沿 X 轴移动),整个场景就搞砸了。 您可以在下图中看到扫射的结果。 左侧部分显示了实际场景,右侧部分显示了扫射运动产生的场景。

enter image description here

我的代码如下。 在构造函数中:

    //Info is a Struct with Default values
    m_projectionMatrix = glm::perspective(
    info.fieldOfView, width / height,   //info.fov = 90
    info.nearPlane, info.farPlane       // info.near = 0.1f, info.far = 1000
    );

    //m_pos = glm::vec3(0.0f,0.0f,0.0f), info.target = glm::vec3(0.0f, 0.0f, -1.0f)
    m_viewMatrix = glm::lookAt(m_pos, m_pos + info.target, Camera::UP);

    //combine projection and view
    m_vpMatrix = m_projectionMatrix * m_viewMatrix;

在“更新”方法中,我目前正在执行以下操作:

glm::mat4x4 Camera::GetVPMatrix()
{
    m_vpMatrix = glm::translate(m_vpMatrix, m_deltaPos);
    return m_vpMatrix;
}

据我所知: 投影矩阵实现了实际的透视图。最初, View 矩阵平移和旋转整个场景,它是居中的? 那么为什么用任何 Z 值转换 VP 矩阵都可以正常工作,但用 X 值转换就不行呢?

我想实现这样的相机行为: 初始凸轮位置为 (0,0,0),“中心”为例如(0,0,-1)。 然后 X = 5 平移后:Cam Pos 为 (5,0,0),Center 为 (5,0,-1)。

编辑:附加问题。 为什么 Z 坐标会受到 VP 变换的影响?

感谢您的帮助! 最好的问候,克里斯托夫。

最佳答案

好吧,我终于找到了解决方案...如您所见,我正在使用 GLM 进行矩阵数学运算。 GLM 以列主要顺序存储其矩阵值。 Open GL 也需要列主要有序矩阵。 C/C++ 原生 2d Array 布局主要是行,因此大多数可用的 OpenGL/C++ 教程都说明应该使用

    glUniformMatrix4fv(location, 1, GL_TRUE, &mat[0][0]);

GL_TRUE 意味着矩阵应该从行主序转换(转置?)到列主序。因为我的矩阵已经采用列主要格式,所以这完全没有意义......

将上面的改成

    glUniformMatrix4fv(location, 1, GL_FALSE, &mat[0][0]);

解决了我的问题...

关于c++ - OpenGL Camera Strafing 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968348/

相关文章:

python - 不同版本的 OpenFace

c++ - 如何检查2D vector 元素是否在某个索引范围内

c++ - sql参数的最佳STL容器

c++ - OpenGL - 平截头体不剔除远平面之外的多边形

qt - Qt 和 JavaFX 等硬件加速工具包如何实现高质量字体渲染?

c++ - 在分块矩阵中查找一个值

c++ - 如何不关心类成员模板

matlab - 如何给矩阵添加边界

c - 用随机数填充矩阵时出现段错误(核心转储)

haskell - Haskell Opengl 的光泽度