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 回の反復後に突然動作しなくなります。
これを行う見栄えの良い方法はありますか?私は本当にステップを変更できるようにしたい...
どうもありがとう