1

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 回の反復後に突然動作しなくなります。

これを行う見栄えの良い方法はありますか?私は本当にステップを変更できるようにしたい...

どうもありがとう

4

1 に答える 1

0

私はついにそれを機能させました。

incr() 関数の最後に anim.restart() を追加するだけで、完全に機能するようになりました。

于 2014-06-20T05:19:03.933 に答える