2012-05-14 5 views
0

アニメーションフレームワークでGraphicsScene(例えば、クラスを使用し、サブクラス化されたqPixmapItemおよびQObject)を回転させるために、GraphicsSceneで3Dアニメーションを実行しようとしています。QgraphicsItemでQTransformをアニメートできない

私は垂直軸の周りの画像を回転させるまで、すべてうまく動作します。 item.rotate()を使用する方法はありません。したがって、QTranformを使用しています。

問題は、何かをアニメーション化しないことです。何が間違っているのですか?

P.S.私はこれにOpenGlを使いたくない。

ここで私はそれをやっている方法です。このように私のコード(rotationsetRotation経由)回転、posのような単純なプロパティをアニメーション化するため

に動作します:

//setup scene 
//Unrelated stuff, loading pictures, etc. 
      scene = new QGraphicsScene(this); 
     foreach(const QPixmap& image, images) 
     { 
      ScenePixmap* item = new ScenePixmap(image); 
      item->moveBy(70*i, 0); 
      i++; 
      this->images.append(item); 
      scene->addItem(item); 
     } 
    } 

    ui->graphicsView->setBackgroundBrush(QBrush(Qt::black, Qt::SolidPattern)); 
    ui->graphicsView->setScene(scene); 

    //setup animation 
QTransform getTransform() 
{ 
    QTransform transform; 
    transform.rotate(-30, Qt::ZAxis);//also tried transform = transform.rotate(...) 

    return transform; 
} 

QAbstractAnimation* SetupRotationAnimation(ScenePixmap* pixmapItem) 
{ 
    QPropertyAnimation* animation = new QPropertyAnimation(pixmapItem, "transform"); 
    animation->setDuration(1400); 
    animation->setStartValue(pixmapItem->transform()); 
    animation->setEndValue(getTransform());//here i tried to multiply with default transform , this does not work either 
    return animation; 
} 

ここにある:ここで

// hybrid graphicsSceneItem, supporting animation 
class ScenePixmap : public QObject, public QGraphicsPixmapItem 
{ 
    Q_OBJECT 
    Q_PROPERTY(QTransform transform READ transform WRITE setTransform) 
public: 
    ScenePixmap(const QPixmap &pixmap, QObject* parent = NULL, QGraphicsItem* parentItem = NULL): 
     QObject(parent), 
     QGraphicsPixmapItem(pixmap, parentItem) 

    {} 
}; 

はIセットアップシーンとアニメーション方法です私はアニメーションを開始する方法:

void MainWindow::keyPressEvent (QKeyEvent * event) 
{ 

    if((event->modifiers() & Qt::ControlModifier)) 
    { 
     QAnimationGroup* groupAnimation = new QParallelAnimationGroup(); 


     foreach(ScenePixmap* image, images) 
     { 
      groupAnimation->addAnimation(SetupRotationAnimation(image)); 

     } 

     groupAnimation->start(QAbstractAnimation::DeleteWhenStopped); 

    } 
} 

EDITダルコMaksimovicに[解決] THX:

ここでは私のために働いたコードです:

QGraphicsRotation* getGraphicRotation() 
{ 
    QGraphicsRotation* transform = new QGraphicsRotation(this); 

    transform->setAxis(Qt::YAxis); 

    return transform; 
} 

QAbstractAnimation* SetupRotationAnimation(ScenePixmap* pixmapItem) 
{ 
    QGraphicsRotation* rotation = getGraphicRotation(); 

    QPropertyAnimation* animation = new QPropertyAnimation(rotation, "angle"); 
    animation->setDuration(1400); 
    animation->setStartValue(0); 
    animation->setEndValue(45); 

    pixmapItem->setTransformOriginPoint(pixmapItem->boundingRect().center()); 

    QList<QGraphicsTransform*> transfromations = pixmapItem->transformations(); 
    transfromations.append(rotation); 
    pixmapItem->setTransformations(transfromations); 

    return animation; 
} 
+0

あなたは 'SetupRotationAnimation'をどこで呼びますか? –

+0

コードを追加しました。 – undefined

答えて

2

私はあなたがQTransformを使用して参照してください。 1回転だけで回転が簡単な場合は、setRotation [setTransformOriginPoint]を忘れないでください。

あなたは、しかし、その後、あなたは上setTransformationsを呼び出すことによって適用される、その特殊な派生クラス、QGraphicsRotationすなわち、QGraphicsTransformを使用する必要があり、異なるの周りに例えばポイントを変換、多くの回転を覚えておきたい場合グラフィックスオブジェクト(o.transformations()を呼び出すことによって既存の変換を最初にフェッチし、これに追加してからsetTransformationsを呼び出す必要があります。

あなたが投稿したコードから、私はあなたのエラーがどこから来ているのか分かりませんが、特殊な機能を使用することで、頻繁に起こる問題のいくつかを避けることができます。

P.S.私もあなたが投稿したコードにprepareGeometryChangeを使用していないのを見ていますので、オブジェクトを変換する際にはこれが必要です。

+0

それは働いて、ありがとう!解決策を指す質問を更新します – undefined

+0

回転をアニメーション化するのが「より良い」というわけではありません。 –

0

問題は非常に簡単です。 QVariantAnimationQPropertyAnimationQTransformをサポートしていません。ちょっと、彼らは今も署名されていない整数をサポートしていません。それがすべてです。 Per Qtドキュメント:

カスタムタイプを含む他のバリアントタイプを補間する必要がある場合は、これらのタイプの補間を実装する必要があります。これを行うには、特定のタイプの補間関数を登録できます。この関数は、開始値、終了値、および現在の進捗の3つのパラメータをとります。

このような補間器を生成するのは簡単ではないかもしれません。行列の正規直交性と視覚効果を維持しながら、2つの行列を「ブレンド」する必要があることに注意してください。行列を独立した回転軸、スケーリング、スキューなどの部分行列に分解し、それぞれを別々に補間する必要があります。 Qtの人々がそれをしなかったのも不思議ではありません。必要な回転、平行移動などをすべてtの関数として構成することによって、いくつかのパラメータtの関数として必要な変換行列を生成することが、逆問題をはるかに簡単にするでしょう。

QVariantがタイプを保持できるとは、デフォルトのインターポレータでサポートされているとは限りません。おそらく実行時の警告が発行されるはずです。

関連する問題