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

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

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