沿矢量方向旋转矩阵
Rotating a matrix in the direction of a vector?
我有一个球体形状的玩家,可以在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.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);
rollSpeed
应该是速度矢量的大小。
float rollSpeed = glm::length(m_Speed);
矩阵变换需要一个角度。旋转角度将取决于球的大小。但是假设它是半径r
那么您需要的角度(以弧度为单位)是
angle = rollSpeed/r;
如果我
理解正确,您需要一个可以在任何轴方向(x,y,z)上工作的矩阵旋转。
我认为你应该为每个轴(x,y,z)编写一个rotate()
方法,你还应该指向你的方向指向哪个轴的方向,你应该写direction.x
或direction.y
或direction.z
和旋转矩阵将理解方向矢量指向的位置。
相关文章:
- 使用Unreal C++获取VR耳机的世界位置/方向
- 与互斥锁相比,旋转锁可以保证上下文切换
- 绘制旋转的三角形
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 在C++中向零方向近似的最佳方法
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 发布旋转矩阵(openGL/glm)
- 顺时针迭代旋转 3 位数字
- OpenGL:在那个方向上旋转和移动
- 给定方向和位置如何使用 GLM 计算旋转矩阵
- 相机的旋转方向在一段时间后反转
- 我如何仅使用一个Arduino uno才能在同一时间和同一方向上旋转两个步进电动机
- 给定的3D旋转矩阵和3D方向矢量发现角差
- 从围绕xyz的旋转中找到xyz方向
- 沿矢量方向旋转矩阵
- GLM矩阵的旋转方向,使用四元数
- 如何计算基于方向向量的旋转矩阵
- 如何通过在for循环中旋转方向来获得采样点
- 摄像机在可变重力下的旋转和方向