我有一个球体形状的球员,可以在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)));
}
感谢您的帮助
答案 0 :(得分:1)
您的rollSpeed
计算错误 - 例如,如果m_Speed.x
和m_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
和旋转矩阵将理解方向向量的位置。