Android。 LibGDX。如何沿样条线移动和定向 3D 对象

Android. LibGDX. How to move and orient 3D-object along a spline

我正在为我的 Android 应用程序使用 LibGDX。我需要沿着 spline.In 移动和定向 3D 对象 (ModelInstance) 我的例子是 CatmullRomSpline。我的运动正常,但在沿样条曲线定位 ModelInstance 时遇到问题。

我的代码:

public void update() {
    float t = SPEED * Gdx.graphics.getDeltaTime();
    elapsedTime = elapsedTime + SPEED *  Gdx.graphics.getDeltaTime();       

    //Movement
    catmull.valueAt(value, elapsedTime);
    myObject3d.transform.setTranslation(value);

    //Rotation
    derivative = catmull.derivativeAt(derivative, t);
    derivative = derivative.nor();

    //Tried to bring object into default position before rotating
    //Vector.X - is the default direction of my Object - facing right
    //myObject3d.transform.rotate(Vector3.X, Vector3.X);

    myObject3d.transform.rotate(derivative, Vector3.X);             
}

改为 Matrix4#rotate method has two arguments, base and target. In your case the base vector should be Vector3.X, while the target is derivative. You need to swap the arguments for this. Also, the Matrix4#rotate method post-multiplies the rotation on top the existing rotation. Or in other words: this will accumulate the absolute rotation on every call. You probably want to use the Matrix4#setToRotation 方法,它会在每次调用时重置旋转(清除矩阵)。

myObject3d.transform.setToRotation(Vector3.X, derivative);
myObject3d.transform.setTranslation(value);

虽然这可能在大多数情况下都有效,但根据路径的不同,您可能会得到意想不到的结果。就像说的那样,有无限可能的旋转会导致这个方向。因此,最好使用两个额外的向量来指定向上 (Y) 和向右 (Z) 向量。

right.set(Vector3.Y).crs(derivative).nor();
up.set(right).crs(derivative).nor();
myObject3d.transform.set(derivative, up, right, position).rotate(Vector3.X, 180);

这里用叉积计算右向量和上向量,这里假设Vector3.Y通常接近上向量。然后 Matrix4#set 方法用于设置矩阵以反映这些值。第一个参数指定 "new" X 轴,第二个参数指定 "new" Y 轴,第三个参数 "new" Z 轴,最后一个参数指定平移(位置)。

这是一个工作示例:https://gist.github.com/xoppa/7558c0c75e9534795e9f

虽然不相关,但请记住 path.valueAt 方法使用 0 <= t <= 1。或者换句话说,t(代码中的 elapsedTime)不应低于 0 或高于 1。