随着时间的推移翻译模型像演员?

时间:2015-03-03 08:31:01

标签: animation 3d libgdx

我最近学习了LibGDX,并且喜欢移动/褪色/旋转东西时Actor系统的简洁性。很简单!但是,进入3d,我想知道是否有类似的实现方式。

我见过人们说" instance.transform(x,y,z)",但是会立即应用并显示在下一个渲染中。我想知道我是否可以使用一些内置框架来内插转换ala" model.addAction(moveTo(x,y,z),duration(0.4f));"我知道Model不会像scene2d中的大多数元素那样从Actor继承。当谈到骨架动画和导入动画的模型时,我理解当前的动画框架,但是我正在寻找一个解决方案,让我的模型在我的游戏世界中移动,而不需要做大量的依赖逻辑。渲染。

有没有一种方法可以在模型上使用Action框架,而不是使用自定义插值实现来混淆渲染循环?只是翻译,旋转等等(如果没有,我可能会在Model对象上实现动作,池等的路径。)

谢谢!

1 个答案:

答案 0 :(得分:0)

快速而肮脏的技巧是在侧面使用scene2d的动作系统。创建一个没有actor的舞台。您可以将您的操作直接发送到舞台,并每帧调用stage.update(delta);一次,以处理您的所有操作。你不需要画舞台来做这件事。 (无论如何,你可能想要一个2D UI东西的舞台。)

您需要创建自己的操作。由于舞台不适用于3D,因此没有理由尝试使用Actors。您的动作可以直接应用于舞台进行处理,并且不会针对任何Actor。

这是一个例子(未经测试)。由于您主要关注的是随着时间的推移混合内容,您可能会从TemporalAction扩展大部分操作。

public class MoveVector3ToAction extends TemporalAction {

    private Vector3 target;
    private float startX, startY, startZ, endX, endY, endZ;

    protected void begin(){
        startX = target.x;
        startY = target.y;
        startZ = target.z;
    }

    protected void update (float percent) {
        target.set(startX + (endX - startX) * percent, startY + (endY - startY) * percent, startZ + (endZ - startZ) * percent);
    }

    public void reset(){
        super.reset();
        target = null; //must clear reference for pooling purposes
    }

    public void setTarget(Vector3 target){
        this.target = target;
    }

    public void setPosition(float x, float y, float z){
        endX = x;
        endY = y;
        endZ = z;
    }
}

您可以创建一个类似于Actions类的便捷类,以便通过自动池设置生成操作:

public class MyActions {

    public static MoveVector3ToAction moveVector3To (Vector3 target, float x, float y, float z, float duration){
        return moveVector3To(target, x, y, z, duration, null);
    }

    public static MoveVector3ToAction moveVector3To (Vector3 target, float x, float y, float z, float duration, Interpolation interpolation){
        MoveVector3ToAction action = Actions.action(MoveVector3ToAction.class);
        action.setTarget(target);
        action.setPosition(x, y, z);
        action.setDuration(duration);
        action.setInterpolation(interpolation);
        return action;
    }

}

样本用法。模型实例移动有点棘手,因为你必须使用它们的Matrix4变换,但你无法安全地返回位置或旋转或缩小变换。因此,您需要保持单独的Vector3位置和四元数旋转,并将它们应用于每个帧以更新实例的变换。

//Static import MyActions to avoid needing to type "MyActions" over and over.
import static com.mydomain.mygame.MyActions.*;

//To move some ModelInstance
stage.addAction(moveVector3To(myInstancePosition, 10, 10, 10, 1f, Interpolation.pow2));

//In render():
stage.update(delta);
myInstance.transform.set(myInstancePosition, myInstanceRotation);