1
我有一個動畫在QML中使用Qt3D。 動畫的要點是讓一個球從一個點p0到一個點p2,然後是一個給定點p1的貝塞爾曲線,我以某種方式計算(與問題無關),以便得到一個二次貝塞爾曲線。因爲沒有BezierAnimation這樣的東西,我所做的是我有一個Vector3DAnimation形式p0到曲線0.1的點,然後從0.1到02,依此類推,直到0.9到1(這是p2)。QML順序動畫避免代碼複製
這給了我這個可怕的看代碼:
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)
}
}
正如你所看到的代碼是極其簡單的,因爲我封裝大部分的功能,但它太repetitie,具有非常不錯的擴展性(如果我想要有一個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次迭代突然停止工作。
有沒有一個好看的方法來做到這一點?我真的希望能夠修改步驟...
非常感謝