我在QML中使用Qt3D进行了一些动画制作。 动画的一点是在Bezier曲线之后有一个球从点p0到达点p2,给定一个点p1,我以某种方式计算(与问题无关),这样我得到一个四次贝塞尔曲线。 由于没有BezierAnimation这样的东西,我做的是我有一个Vector3DAnimation形式p0到曲线的0.1点,然后从0.1到02,依此类推,直到0.9到1(这是p2)。
这给了我这个可怕的代码:
SequentialAnimation{
loops: Animation.Infinite
Vector3DAnimation{
from: bezierAt(0)
to: bezierAt(0.1)
duration: durationFromSpeed(0,0.1,500)
}
Vector3DAnimation{
from: bezierAt(0.1)
to: bezierAt(0.2)
duration: durationFromSpeed(0.1,0.2,500)
}
Vector3DAnimation{
from: bezierAt(0.2)
to: bezierAt(0.3)
duration: durationFromSpeed(0.2,0.3,500)
}
....
Vector3DAnimation{
from: bezierAt(0.9)
to: bezierAt(1)
duration: durationFromSpeed(0.9,1,500)
}
}
正如您所看到的,代码非常简单,因为我将大部分代码封装在函数中,但是它太重复并且具有非常糟糕的可伸缩性(如果我想要步长为0.01,我会手动编写100个动画)。
所以,我的问题是,有没有办法让这更好?
我尝试使用ScriptAction,如下所示:
SequentialAnimation{
id: anim
loops: Animation.Infinite
property real current:0.0
function incr() {
current+=0.1
current = current > 1? 0.0 : current
}
Vector3DAnimation{
from: bezierAt(anim.current)
to: bezierAt(anim.current+0.1)
duration: durationFromSpeed(anim.current,anim.current+0.1,500)
}
ScriptAction: {script: incr();}
}
但是,奇怪的是,只有动画的第一部分(即使我检查并正确更改了当前的更改),并且在4或5次迭代后突然停止工作。
这样做有好看的方法吗?我真的希望能够修改这个步骤......
非常感谢
答案 0 :(得分:0)
我终于成功了。
只需在incr()函数的末尾添加anim.restart(),它现在就可以正常工作。