在向量的方向上旋转矩阵?

时间:2016-03-10 16:35:32

标签: c++ opengl matrix 3d glm-math

我有一个球体形状的球员,可以在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)));
}

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

您的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);

答案 1 :(得分:0)

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

float rollSpeed = glm::length(m_Speed);

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

angle = rollSpeed/r;

答案 2 :(得分:-1)

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

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