沿矢量方向旋转矩阵

Rotating a matrix in the direction of a vector?

本文关键字:旋转 方向      更新时间:2023-10-16

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

m_position += m_speed;

我还有一个旋转矩阵,我想按照玩家移动的方向旋转(想象一下,如果球在地板上滚动,它会如何旋转)。下面是一个简短的视频,可帮助直观地了解问题: https://i.stack.imgur.com/8vzV3.jpg

请注意,在视频中,当我开始上下移动 (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)));
}

感谢帮助

你的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;
如果我

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

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