Android系统。如何沿对象方向移动对象(使用Vector3和Quaternion)

时间:2013-08-28 10:50:50

标签: java android opengl-es libgdx

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

1 个答案:

答案 0 :(得分:9)

四元数用于指定旋转。首先需要在未应用旋转时指定方向。例如,如果要在未应用旋转时沿X轴移动:

Vector3 baseDirection = new Vector3(1,0,0);

确保基准方向标准化(长度= 1),您可以使用nor()方法保证安全:

Vector3 baseDirection = new Vector3(1,0,0).nor();

接下来,您需要使用Quaternion旋转方向:

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)