1

Qt3D のエンティティ オブジェクトにステート マシンを使用し、状態間の遷移アニメーションを作成したいと考えています。

QML の 2 つのステート マシン フレームワークについて知っています。

  1. Qtクイックステート
  2. 宣言型ステート マシン フレームワーク

最初のフレームワークは、QtQuick のすべてのビジュアル アイテムの基本クラスである QQuickItem に組み込まれています。したがって、これらの要素には、状態、遷移などのステート マシンのプロパティがあります。Entity は QQuickItem を継承していないため、2 つ目のフレームワークしか使用できません。

エンティティに可視と非表示の 2 つの状態を持たせたい。状態が「非表示」の場合、エンティティは 0 に縮小されます。表示されている場合は、1 に拡大されます。これが、Declarative State Machine Framework を使用したエンティティ状態の現在の実装です。

import Qt3D 2.0
import Qt3D.Renderer 2.0
import QtQml.StateMachine 1.0 as DSM

Entity {
    id: root

    property bool show: true

    components: [
        Transform {
            id: transform
            Scale { id: scale; scale: 1 }
            Translate { ... }
        }
        Mesh { ... },
        Material { ... },

    ]

    DSM.StateMachine {
        id: stateMachine
        initialState: visible
        running: true

        DSM.State {
            id: visible
            DSM.SignalTransition {
                targetState: hidden
                signal: showChanged
                guard: show == false
            }
            onEntered: scale.scale: 1
        }

        DSM.State {
            id: hidden
            DSM.SignalTransition {
                targetState: visible
                signal: showChanged
                guard: show == true
            }
            onEntered: scale.scale: 0
        }
    }
}

動作しますが、トランジション間にアニメーションを追加したいです。Qt Quick States を使用すると、次のような Transition 要素を使用できます。

import QtQuick 2.5 as QQ2

Entity {
    ...
    transitions: QQ2.Transition {
            id: tr
            from: "visible"; to: "hidden"; reversible: true
            QQ2.NumberAnimation {
                target: scale
                property: "scale"
                duration: 500
                from: 1; to: 0
            }
        }
}

しかし、エンティティもDSM.StateMachineもDSMフレームワークの他の部分もtransitionsプロパティを含まないため、使用できません。

私は迅速で汚い解決策しか見ていません-すべての状態の onEntered スロットに NumberAnimation 要素を追加します:

    DSM.State {
        id: visible
        onEntered: QQ2.NumberAnimation {
            target: scale; property: "scale"
            to: 1; duration: 1000
        }
    }

    DSM.State {
        id: hidden
        onEntered: QQ2.NumberAnimation {
            target: scale; property: "scale"
            to: 0; duration: 1000
        }
    }

reversibleすべての状態に対してリバースアニメーションを再宣言せずに、プロパティまたはリバーシブルアニメーションを作成する方法を持つトランジションまたはその他の要素を使用する方法はありますか?

4

0 に答える 0