2017-01-24 3 views
0

これは愚かな質問かもしれませんが、私はどこでも答えを見つけることはできません。Qtは即座にアニメーションを回転させます

QPolygonF triangle; 

    triangle.append(QPointF(0., -15)); 
    triangle.append(QPointF(30., 0)); 
    triangle.append(QPointF(0., 15)); 
    triangle.append(QPointF(15., 0)); 

この三角形は、マップ上の車を表すもので、アニメーション化する必要があります。それはそれはそれはそれは次の起こっている道路に直面するように回転させる必要がある交差点(道路クロス)に達すると

QGraphicsItemAnimation *animation; 
    QGraphicsPolygonItem *clientCar; 
    QTimeLine *timer; 

    animation = new QGraphicsItemAnimation; 

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

    clientCar = scene->addPolygon(triangle, myPen, myBrush) 

    animation->setItem(clientCar); 
    animation->setTimeLine(10000); 

    animation->setPosAt(0.f/200.f, map.street1); 
    animation->setRotationAt(10.f/200.f, 90.f); 
    animation->setPosAt(10.f/200.f, map.street2); 
    animation->setRotationAt(20.f/200.f, 180.f); 
    animation->setPosAt(20.f/200.f, map.street3); 

    scene->addItem(clientCar); 
    ui->graphicsView->setScene(scene); 
    timer->start(); 

問題は、次のとおりですので、私は次のようでした。上記のように、私はsetRotationAt()を使ってみましたが、次の交差点に到達するまで交差点間をゆっくりと回転しています。それは瞬時に変わっているはずです。変化しているときだけです。どんな助け?ドキュメントから

答えて

0

QGraphicsItemAnimationが行列を計算する 最も近い隣接のスケジュール変更の間の単純な線形補間を行います。 インスタンスの場合、アイテムの位置を0.0と1.0の値に設定すると、 には、 の間の直線で移動するアイテムがアニメーションに表示されます。スケーリングと回転についても同様です。

直線補間部はトリックを行います。 これを試してみませんか:

//animation->setPosAt(0.f/200.f, map.street1); 
//animation->setRotationAt(10.f/200.f, 90.f); 
//animation->setPosAt(10.f/200.f, map.street2); 
//animation->setRotationAt(20.f/200.f, 180.f); 
//animation->setPosAt(20.f/200.f, map.street3); 

static float const eps = 1.f/200.f; 
QVector<float> steps = {0.f, 10.f/200.f, 20.f/200.f}; 
QVector<QPointF> points = {map.street1, map.street2, map.street3}; 
QVector<float> angles = {0, 90.f, 180.f}; 

// initial conditions 
animation->setPosAt(steps[0], points[0]); 
animation->setRotationAt(steps[0], angles[0]); 

// for each intersection 
for(size_t inters = 1; inters < points.size(); ++inters) 
{ 
    animation->setRotationAt(steps[inters] - eps, angles[inters - 1]); 
    animation->setPosAt(steps[inters], points[inters]); 
    animation->setRotationAt(steps[inters] + eps, angles[inters]); 
} 
+0

どうもありがとうございました! –

+0

@ R.Andreiあなたが気にしないなら、私の答えを受け入れてください;) – 0Tech

関連する問題