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;
在 "Update"-方法中,我目前正在执行以下操作:
glm::mat4x4 Camera::GetVPMatrix()
{
m_vpMatrix = glm::translate(m_vpMatrix, m_deltaPos);
return m_vpMatrix;
}
据我所知:
投影矩阵实现了实际的透视图。最初,视图矩阵平移和旋转整个场景,它是居中的?
那么为什么用任何 Z 值转换 VP 矩阵都可以正常工作,但用 X 值转换就不行呢?
我想实现这样的相机行为:
初始凸轮位置为 (0,0,0) 并且 "Center" 例如(0,0,-1)。
然后在 X = 5 的平移之后:凸轮位置为 (5,0,0),中心为 (5,0,-1)。
编辑:附加问题。
为什么Z坐标受VP-Transformation影响?
感谢您的帮助!
最好的问候,克里斯托夫。
矩阵数学不是我的强项所以我无法解释为什么你当前的方法不起作用,尽管我有我的怀疑(翻译投影矩阵似乎不正确)。不过,以下应该允许您移动相机:
// 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;
好的,我终于找到了解决方案...如您所见,我正在使用 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]);
解决了我的问题...
我目前正在研究 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;
在 "Update"-方法中,我目前正在执行以下操作:
glm::mat4x4 Camera::GetVPMatrix()
{
m_vpMatrix = glm::translate(m_vpMatrix, m_deltaPos);
return m_vpMatrix;
}
据我所知: 投影矩阵实现了实际的透视图。最初,视图矩阵平移和旋转整个场景,它是居中的? 那么为什么用任何 Z 值转换 VP 矩阵都可以正常工作,但用 X 值转换就不行呢?
我想实现这样的相机行为: 初始凸轮位置为 (0,0,0) 并且 "Center" 例如(0,0,-1)。 然后在 X = 5 的平移之后:凸轮位置为 (5,0,0),中心为 (5,0,-1)。
编辑:附加问题。 为什么Z坐标受VP-Transformation影响?
感谢您的帮助! 最好的问候,克里斯托夫。
矩阵数学不是我的强项所以我无法解释为什么你当前的方法不起作用,尽管我有我的怀疑(翻译投影矩阵似乎不正确)。不过,以下应该允许您移动相机:
// 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;
好的,我终于找到了解决方案...如您所见,我正在使用 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]);
解决了我的问题...