0

我对根据运动方程飞行的球的动画有疑问

x = speed*cos(angle) * time;
y = speed*sin(angle) * time - (g*pow(time,2)) / 2;

我用 QGraphicsEllipseItem 创建了一个 QGraphicsScene

QGraphicsScenescene = new QGraphicsScene;
QGraphicsEllipseItemball = new QGraphicsEllipseItem(0,scene);

然后我尝试为球设置动画

scene->setSceneRect( 0.0, 0.0, 640.0, 480.0 );

ball->setRect(15,450,2*RADIUS,2*RADIUS);


setScene(scene);

QTimeLine *timer = new QTimeLine(5000);
timer->setFrameRange(0, 100);

QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
animation->setItem(ball);
animation->setTimeLine(timer);


animation->setPosAt(0.1, QPointF(10, -10));

timer->start();

但我无法理解 setPosAt 的工作原理以及在这种情况下如何使用计算出的 x,y 。

setPosAt 的官方 Qt 文档非常简短且难以理解。

4

1 回答 1

1

您需要使用 0.0 到 1.0 之间的 (step) 的各种值多次调用 setPosAt()。然后当您播放动画时,Qt 将使用线性插值在您设置的点之间平滑动画,因为 Qt 将其“当前步长”值从 0.0 增加到 1.0。

例如,要使球沿直线移动,您可以执行以下操作:

animation->setPosAt(0.0, QPointF(0,0));
animation->setPosAt(1.0, QPointF(10,0));

...或者让球上升,然后下降,你可以这样做:

animation->setPosAt(0.0, QPointF(0,0));
animation->setPosAt(0.5, QPointF(0,10));
animation->setPosAt(1.0, QPointF(0,0));

...所以要获得您想要的弧线,您可以执行以下操作:

for (qreal step=0.0; step<1.0; step += 0.1)
{
   qreal time = step*10.0;  // or whatever the relationship should be between step and time
   animation->setPosAt(step, QPointF(speed*cos(angle) * time, speed*sin(angle) * time - (g*pow(time,2)) / 2);
}
于 2013-09-15T06:12:19.163 回答