怀疑3D动画的libgdx值

时间:2016-01-04 20:05:34

标签: java animation libgdx

在使用libGDX创建一个非常简单的动画之后,我想澄清一些问题,以确保在开始任何其他更复杂的开发之前我了解所有内容。

我有一个像这样的盒子:

public  void createBaseCube(Model modelCube) {

        ModelBuilder modelBuilder = new ModelBuilder();
        modelCube = modelBuilder.createBox(1f, 1f, 1f,
                new Material(ColorAttribute.createDiffuse(Color.GREEN)),
                VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);

        this.cubeInstance.transform.translate(0.5f, 0.5f, 0.5f);

    }

因为它位于位置(0,0,0)的中心,并希望它的角分配在(0,0,0)中,所以我在最后一行应用了翻译。

这是它的样子(我添加了一组瓷砖以供参考):

first box status

之后,我创建动画。我想推翻这个盒子,所以它将被放置在白色瓷砖上,并在其右下边缘上旋转

public class CubeAnimation {
    ...
    <<definition of attributes>>
    ...
    public CubeAnimation (ModelInstance cubeModel, float fromAngle, float toAngle, float speed, float alpha){

        this.cubeInstance = cubeModel;
        this.fromAngle = fromAngle; //value set to 0
        this.toAngle = toAngle;     //value set to 90f
        this.speed = speed;         //value set to 1f
        this.alpha = alpha;         //value set to 0
    }

    public void update(float delta) {
            alpha += delta * speed;
            if (alpha >= 1f) {
                finished =true;
                return;
            }
            float angle = alpha * (toAngle - fromAngle);
            fromAngle = angle;

            Vector3 t = new Vector3(0.5f, -0.5f, 0);
            cubeInstance.transform.idt().translate(t).rotate(Vector3.Z, -angle).translate(t.scl(-1));
        }

一切似乎都很好,而且代码非常简单,但是在应用动画时,问题(这里是问题),盒子再次被翻译到中心(因此首先在创建框时翻译),并且 - 惊喜 - 虽然我将90f作为参数传递给动画,但立方体只旋转了45度(当我设置180时,它按预期旋转:90)。

这是动画后的样子:

enter image description here

这里有什么问题?在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您想要将立方体从角度fromAngle旋转到角度toAngle

您尝试通过计算存储在alpha变量中的一段时间内完成的百分比来逐步执行此操作。

alpha += delta * speed;
if (alpha >= 1f) {
    finished =true;
    return;
}

此部分可用于计算角速度乘以时间的百分比。即

angle_percentage/seconds * seconds_passed

然后,您可以获得此行中起始和终止角度之间的距离

float angle = alpha * (toAngle - fromAngle);

此代码适用于起始角度0,但对于非零起点将失败。一行的等式为y = mx + b,因此要更正此问题,您应该包含b值:

float angle = fromAngle + alpha * (toAngle - fromAngle);

这将在fromAngle处启动动画并将其推到所需的距离。

额外的行fromAngle = angle;会在每次迭代时更改您的起始位置,因此您最终会得到一个不可预测的动画,根据您选择的速度,动画会有所不同......我相当肯定是因为只是巧合;)

最后,当该值设置为100%时,此循环结束,但实际上从未实际更新为100%。试试这个。

public void update(float delta) {
    alpha += delta * speed;
    if (alpha <= 1f) {  
        float angle = fromAngle + alpha * (toAngle - fromAngle);

        Vector3 t = new Vector3(0.5f, -0.5f, 0);
        cubeInstance.transform.idt().translate(t).rotate(Vector3.Z, -angle).translate(t.scl(-1));
    } else {
        finished = true;
    }
}