gpt4 book ai didi

java - 对 3D 动画的 libgdx 值的疑问

转载 作者:行者123 更新时间:2023-12-01 10:37:14 24 4
gpt4 key购买 nike

使用 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) 中,所以我在最后一行应用了翻译。

这是它的样子(我添加了一组图 block 以提供一些引用):

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

这里出了什么问题?预先感谢您的帮助!

最佳答案

您想要将立方体从角度 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;
}
}

关于java - 对 3D 动画的 libgdx 值的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34598951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com