4

我正在使用 libGDX(实际上对它来说很新)和 Android。我想将 3d 对象朝它所面对的方向移动(使用一些速度)。我认为这是一个基本问题,但找不到直接的答案。我有一个表示对象旋转(方向)的四元数,我有一个表示对象位置的 Vector3。问题是如何使用来自四元数的信息更新位置 Vector3,以便在四元数表示的方向上移动对象。(另一种方法是从四元数中提取滚动俯仰和偏航,并通过应用三角计算获得新的坐标。但我认为必须有一种方法可以使用 Vector3 和 Quat 来实现这一点。)

4

1 回答 1

10

四元数用于指定旋转。您首先需要指定不应用旋转时的方向。例如,如果您想在未应用旋转时沿 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);

更新: 从 Xoppa 的评论中添加工作代码:

translation.set(baseDirection).rot(modelInstance.transform).nor().scl(speed * delta)
于 2013-08-28T13:17:26.047 回答