0

私はGraphicsSceneでいくつかの3Dアニメーションを実行しようとしています。たとえば、GraphicsSceneで画像を回転させて(クラスを使用し、重要な場合は、からサブクラス化して)、アニメーションフレームワークをqPixmapItem使用します。QObject

垂直軸を中心に画像を回転させたいまでは、すべて正常に機能します。item.rotate()を介してこれを行う方法はないので、私はを使用してQTranformいます。

問題は、そうしても何もアニメートされないことです。私は何が間違っているのですか?

PS私はこれにOpenGlを使いたくありません。

これが私がやっている方法です。posこの方法は、rotation(via rotationsetRotation)などのより単純なプロパティをアニメーション化するために機能します。

私のコード:

// 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)

    {}
};

シーンとアニメーションを設定する方法は次のとおりです。

//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;
}

これが私がアニメーションを始める方法です:

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);

    }
}

[解決済み]thxをDarkoMaksimovicに編集:

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

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;
}
4

2 に答える 2

2

QTransform を使用しているようです。回転が 1 つだけ必要な場合、つまり単純な回転が必要な場合は、setRotationを使用することをお勧めします [ setTransformOriginPointを忘れないでください]。

ただし、たとえば、さまざまな変換ポイントの周りの多くの回転を覚えておきたい場合は、QGraphicsTransform、つまりその特殊な派生クラスQGraphicsRotationを使用する必要があります。これは、グラフィック オブジェクトでsetTransformationsを呼び出して適用します (最初に既存の変換をフェッチする必要があります)。 o.transformations() を呼び出してこれに追加し、次に setTransformations を呼び出します。追加された変換へのポインターを保持している場合は、後で直接変更することもできます)。

投稿されたコードから、エラーの原因はわかりませんが、特殊な関数を使用することで、頻繁に発生する問題を回避できます。

PS また、投稿したコードでprepareGeometryChangeを使用していないことがわかりました。オブジェクトを変換するときにこれが必要であることに注意してください。

于 2012-05-14T14:31:58.843 に答える
0

問題は非常に単純です。QVariantAnimationおよびQPropertyAnimationサポートしていませんQTransform。現時点では、符号なし整数さえサポートしていません。それだけです。Qt ドキュメントごと:

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

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

QVariantaが型を運ぶことができるからといって、それがデフォルトのインターポレーターでサポートされているとは限りません。おそらく、この効果に対して実行時警告が発行されるはずです。

于 2013-08-30T21:20:15.313 に答える