繁体   English   中英

OpenGL Camera Strafing不起作用

[英]OpenGL Camera Strafing doesnt work

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

在此处输入图片说明

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

    //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;
}

据我所知:投影矩阵实现了实际的透视图。 最初,视图矩阵会平移和旋转整个场景,使其居中吗? 那么,为什么通过任何Z值转换VP-Matrix效果很好,而对于X值却不能呢?

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

编辑:附加问题。 为什么Z坐标被VP-Transformation修饰?

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

好的,我终于找到了解决方案……如您所见,我在矩阵数学中使用了GLM。 GLM以列主要顺序存储其矩阵值。 Open GL也需要列主要有序矩阵。 C / C ++本机2d数组布局主要是行式的,因此大多数可用的OpenGL / C ++教程都指出,应该使用

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

具有GL_TRUE的含义,应将矩阵从行主顺序转换为列主顺序(转置?)。 由于我的矩阵已经以列主格式出现,这绝对没有意义...

将以上内容更改为

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

解决了我的问题...

矩阵数学不是我的强项,因此尽管我有怀疑(翻译投影矩阵似乎不正确),但我无法解释为什么您当前的方法不起作用。 以下内容应允许您移动摄像机:

// update your camera position
m_pos = new_pos;
// update the view matrix
m_viewMatrix = glm::lookAt(m_pos, m_pos + info.target, Camera::UP);
// update the view-projection matrix, projection matrix never changes
m_vpMatrix = m_projectionMatrix * m_viewMatrix;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM