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 回答