在使用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)。
这是动画后的样子:
这里有什么问题?在此先感谢您的帮助!
答案 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;
}
}