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