沿向量方向旋转矩阵?

Rotating a matrix in the direction of a vector?

我有一个球体形状的播放器,可以在 x 和 z 方向上自由移动。 玩家当前速度存储在一个矢量中,该矢量在每一帧上都添加到玩家位置:

m_position += m_speed;

我还有一个旋转矩阵,我想在玩家移动的方向上旋转(想象一下如果球在地板上滚动会如何旋转)。 这是一个帮助形象化问题的简短视频:http://imgur.com/YrTG2al

请注意视频中当我开始上下移动 (Z) 而不是左右移动 (X) 时,旋转轴不再与玩家的移动相匹配。

用于生成结果的代码:

glm::vec3 UP = glm::vec3(0, 1, 0);
float rollSpeed = fabs(m_Speed.x + m_Speed.z);
if (rollSpeed > 0.0f) {
    m_RotationMatrix = glm::rotate(m_RotationMatrix, rollSpeed, glm::cross(UP, glm::normalize(m_Speed)));
}

感谢帮助

如果我理解正确的话,你需要一个可以在任何轴方向(x、y、z)上工作的矩阵旋转。

我认为你应该为每个轴(x,y,z)写一个rotate()方法,你也应该指向你的方向指向哪个轴的方向,你应该写direction.xdirection.ydirection.z 和旋转矩阵将理解方向向量指向的位置。

您的 rollSpeed 计算错误 -- 例如,如果 m_Speed.xm_Speed.z 速度的符号不同,它们将 减去 .您需要使用飞机速度的标准:

float rollSpeed = sqrt(m_Speed.x * m_Speed.x + m_Speed.y * m_Speed.y);

更笼统地说,您可以重新使用您的叉积。这样,您的数学就不太可能不同步——类似于:

glm::vec3 rollAxis = glm::cross(UP, m_speed);
float rollSpeed = glm::length(rollAxis);
m_RotationMatrix = glm::rotate(m_RotationMatrix, rollSpeed, rollAxis);

rollSpeed应该是速度向量的大小。

float rollSpeed = glm::length(m_Speed);

矩阵变换需要一个角度。旋转角度取决于球的大小。但是说它的半径 r 那么你需要的角度(以弧度为单位)是

angle = rollSpeed/r;