四元数用于指定旋转。您首先需要指定不应用旋转时的方向。例如,如果您想在不应用旋转时沿 X 轴移动:
Vector3 baseDirection = new Vector3(1,0,0);
确保基本方向已标准化(长度= 1),您可以使用nor()
确保安全的方法:
Vector3 baseDirection = new Vector3(1,0,0).nor();
接下来,您需要使用四元数旋转方向:
Vector3 direction = new Vector3();
Quaternion rotation = your_quaternion;
direction.set(baseDirection);
direction.mul(rotation);
现在您已经有了方向,您可以根据想要移动的量来缩放它。您可能希望每一帧都执行此操作,具体取决于自上一帧以来经过的时间。
final float speed = 5f; // 5 units per second
Vector3 translation = new Vector3();
translation.set(direction);
translation.scl(speed * Gdx.graphics.getDeltaTime());
最后你需要将翻译添加到该位置
position.add(translation);
当然,根据您的实际实现,您可以批处理多个操作,例如:
translation.set(baseDirection).mul(rotation).scl(speed * Gdx.graphics.getDeltaTime());
position.add(translation);
Update:从 Xoppa 的评论中添加工作代码:
translation.set(baseDirection).rot(modelInstance.transform).nor().scl(speed * delta)