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 に答える