使用 QTimeline 制作动画

Posted

技术标签:

【中文标题】使用 QTimeline 制作动画【英文标题】:Animation with QTimeline 【发布时间】:2009-05-06 23:26:31 【问题描述】:

我正在使用 QGraphics 对象来显示带有箭头的框。我想要那些从一端开始并到达另一端的箭头/线条上的动画。

当箭头的开始和结束位置在 QTimeLine 执行期间没有改变时,动画效果很好,即我让视图保持静态。 但是由于用户可以拖动框(因此我重新绘制了要跟随的箭头),我需要重置 QGraphicsItemAnimation 内的开始和结束位置,以便动画与新的箭头线匹配。

我尝试在箭头对象的绘制方法中更新开始和结束位置,但这只会让动画变得疯狂(它在整个地方随机翻转)。我认为这是因为我在 QTimeLine 对象处于 RUNNING 状态时更改了动画位置。

void Arrow::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)

   ...
    ///update the arrow to have a new source and destination, draw arrow, etc
   ...

    if (mAnimate)
    
        mAnimationObj->setPosAt(0, mSourcePoint);
        mAnimationObj->setPosAt(1, mDestPoint);   
    

我应该如何动态改变 QGraphicsItemAnimation 的开始和结束位置(0 和 1)?

对于最终产品,我希望用户能够拖动框,让箭头跟随(目前有效)以及让动画沿着新的箭头路线继续。

如果这不可能,那么我需要想出一些方法来捕捉拖动并停止箭头动画,直到用户释放然后我猜重置它......?

【问题讨论】:

【参考方案1】:

我猜你只需要制作一个通用动画,即使用 QTimeLine 在 0.0 和 1.0 之间制作动画。从它的currentValue,执行interpolation(自己)找出需要放置动画对象的位置。例如,对于 0.5 的值,对象应位于开始位置和结束位置的中间。

请注意,如果开始位置和结束位置之间的距离不断变化,则此补间技巧不起作用。您可能会导致动画对象在动画中间反弹和向前反弹。做到这一点的一个技巧是保持动画对象位置和开始位置之间的距离,然后如果当前时间的插值距离小于前一个距离,则不要推回对象。移动起点和终点的中间有更复杂的技术,但我不会在这里详细说明,除非有必要。

【讨论】:

以上是关于使用 QTimeline 制作动画的主要内容,如果未能解决你的问题,请参考以下文章

Unity-Timeline制作动画(快来制作属于你的动画吧)

QT:QTimeLine时间轴处理(动画显示)。

Qt 之 QTimeLine

Qt 之 QTimeLine

QTimeLine 控制动画(一步一步的往前变化,并在每次变化时都会发出一个frameChanged信号)

3D软件视频制作:unity timeline cinemachine, blender 视频制作编辑器