我想在Qt3D中使用State Machine作为Entity对象,并在其状态之间制作过渡动画。
我了解QML中的两个State Machine框架:
第一个框架内置在QQuickItem中,它是QtQuick中所有可视项目的基类。因此,这些元素具有状态机的属性,如状态,转换等。由于Entity不继承QQuickItem,我只能使用第二个框架。
我希望我的实体有两种状态:可见和隐藏。当它具有状态"隐藏"时,实体将缩小为0.如果它可见,它将被放大到1。 这是我目前使用声明状态机框架实现的实体状态:
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
}
}
有没有办法使用Transition或其他具有reversible
属性的元素或某种方式制作可逆动画而不为每个状态重新定义反向动画?