我有一个问题,我的相机似乎在原点上运行。这让我觉得我的矩阵乘法向后。然而,这似乎对我来说是正确的,如果我反过来它会解决轨道问题,但我得到另一个问题,我认为我的翻译是倒退的。
glm::mat4 Camera::updateDelta(const float *positionVec3, const float *rotationVec3)
{
// Rotation Axis
const glm::vec3 xAxis(1.0f, 0.0f, 0.0f);
const glm::vec3 yAxis(0.0f, 1.0f, 0.0f);
const glm::vec3 zAxis(0.0f, 0.0f, 1.0f); // Should this be -1?
// Accumulate Rotations
m_rotation.x += rotationVec3[0]; // pitch
m_rotation.y += rotationVec3[1]; // yaw
m_rotation.z += rotationVec3[2]; // roll
// Calculate Rotation
glm::mat4 rotViewMat;
rotViewMat = glm::rotate(rotViewMat, m_rotation.x, xAxis);
rotViewMat = glm::rotate(rotViewMat, m_rotation.y, yAxis);
rotViewMat = glm::rotate(rotViewMat, m_rotation.z, zAxis);
// Updated direction vectors
m_forward = glm::vec3(rotViewMat[0][2], rotViewMat[1][2], rotViewMat[2][2]);
m_up = glm::vec3(rotViewMat[0][1], rotViewMat[1][1], rotViewMat[2][1]);
m_right = glm::vec3(rotViewMat[0][0], rotViewMat[1][0], rotViewMat[2][0]);
m_forward = glm::normalize(m_forward);
m_up = glm::normalize(m_up);
m_right = glm::normalize(m_right);
// Calculate Position
m_position += (m_forward * positionVec3[2]);
m_position += (m_up * positionVec3[1]);
m_position += (m_right * positionVec3[0]);
m_position += glm::vec3(positionVec3[0], positionVec3[1], positionVec3[2]);
glm::mat4 translateViewMat;
translateViewMat = glm::translate(translateViewMat, m_position);
// Calculate view matrix.
//m_viewMat = rotViewMat * translateViewMat;
m_viewMat = translateViewMat * rotViewMat;
// Return View Proj
return m_projMat * m_viewMat;
}
在其他地方我反向进行矩阵乘法,这给了我正确的答案,但是这个函数似乎想要反过来。
在3D空间中计算物体位置时,我这样做
m_worldMat = transMat * rotMat * scale;
按预期工作。
答案 0 :(得分:0)
代码似乎有些不对劲。
一:rotViewMat在初始化之前用于第一次旋转调用。它最初有什么价值?它是单位矩阵吗?
二:旋转没有你似乎假设的数学属性。围绕x旋转,然后绕y旋转,然后围绕z(每个以恒定速度旋转)与围绕任何轴旋转(“轨道运行”)不同,这是一个奇怪的摆动。由于随后的旋转,例如,您累积的x旋转(“俯仰”)实际上可能导致在完全不同的方向上移动(考虑当累积的y旋转接近90度时x会发生什么)。另一种说法是轮换是不可交换的,参见: https://physics.stackexchange.com/questions/48345/non-commutative-property-of-rotation和 https://physics.stackexchange.com/questions/10362/how-does-non-commutativity-lead-to-uncertainty/10368#10368。
另请参阅:http://en.wikipedia.org/wiki/Rotation_matrix#Sequential_angles和http://en.wikipedia.org/wiki/Euler_angles。由于欧拉角(roll-pitch-yaw)不是矢量,因此向它们添加速度矢量是没有意义的。
你可能想要的是:
glm::mat4 Camera::updateDelta(const float *positionVec3, const float *axisVec3, const float angularVelocity)
{
...
glm::mat4 rotViewMat; // initialize to unit matrix
rotViewMat = glm::rotate(rotViewMat, angularVelocity, axisVec3);
...