Qt3D のエンティティ オブジェクトにステート マシンを使用し、状態間の遷移アニメーションを作成したいと考えています。
QML の 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
すべての状態に対してリバースアニメーションを再宣言せずに、プロパティまたはリバーシブルアニメーションを作成する方法を持つトランジションまたはその他の要素を使用する方法はありますか?