【问题标题】:Doubts about libgdx values for 3D animation对 3D 动画的 libgdx 值的怀疑
【发布时间】:2016-01-05 23:24:24
【问题描述】:

在使用 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) 中,因此我在最后一行应用了平移。

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

然后,我创建动画。我想翻转盒子,所以它会被定位在白色瓷砖上,并在它的右下角旋转

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)。

动画后的样子:

这里有什么问题?提前感谢您的帮助!

【问题讨论】:

  • 尝试删除行 fromAngle = angle; 我怀疑只有 alpha 需要更改才能正常旋转。
  • 点赞!!这解决了设置 90f 的问题,但只能旋转 45f!谢谢!! :D
  • 关于未完成的翻译还有待解决... :_(
  • 同时进行平移和旋转可能非常棘手,而且难以理解!不要太沮丧哈哈

标签: java animation libgdx


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多