我在 QML 中使用 Qt3D 有一个小动画。动画的重点是让球沿着贝塞尔曲线从点 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 次迭代后突然停止工作。
有没有好看的方法来做到这一点?我真的希望能够修改步骤...
非常感谢