aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKamil Hajdukiewicz <kaj@spyro-soft.com>2023-12-09 17:21:08 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-12-20 13:46:00 +0000
commit787b57cb794506c213425053b2181ee11b803b1f (patch)
tree2fae2ae7a38080c6dd7c6e4719aaf0b1156f3a78
parent776c3c81969515af5ac3f2ba6b39bb420a562805 (diff)
3D Virtual Assistant Example
Introduce new example that presents interactive 3D virtual assistant model. The model animations are created using Timelines and Keyframes. Change-Id: I21853f2c071b0482d183df05f874a68f10a84173 Reviewed-by: Christian Strømme <christian.stromme@qt.io> (cherry picked from commit 89e00ddbd09f1fec9e981df7de66ad48d7a409e5) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 6875634f1223c4dcbf512959629699e635a302a9)
-rw-r--r--LICENSES/CC0-1.0.txt121
-rw-r--r--examples/quick3d/CMakeLists.txt2
-rw-r--r--examples/quick3d/virtualassistant/CMakeLists.txt38
-rw-r--r--examples/quick3d/virtualassistant/Main.qml9
-rw-r--r--examples/quick3d/virtualassistant/VirtualAssistant.qmlproject114
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/CMakeLists.txt4
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/CMakeLists.txt5
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/CMakeLists.txt13
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/RobotHeart.hints3
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/RobotHeart.qml238
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/meshes/plane.meshbin0 -> 92468 bytes
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/qmldir2
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/CMakeLists.txt16
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.hints3
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.qml5988
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/body.meshbin0 -> 4855184 bytes
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_107.meshbin0 -> 52196 bytes
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_108.meshbin0 -> 42836 bytes
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_109.meshbin0 -> 52196 bytes
-rw-r--r--examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/qmldir2
-rw-r--r--examples/quick3d/virtualassistant/content/App.qml19
-rw-r--r--examples/quick3d/virtualassistant/content/CMakeLists.txt16
-rw-r--r--examples/quick3d/virtualassistant/content/ControlPanel.qml47
-rw-r--r--examples/quick3d/virtualassistant/content/Screen01.ui.qml125
-rw-r--r--examples/quick3d/virtualassistant/content/SettingsPanel.qml121
-rw-r--r--examples/quick3d/virtualassistant/content/colosseum_4k.hdrbin0 -> 5952799 bytes
-rw-r--r--examples/quick3d/virtualassistant/doc/images/VirtualAssistantHome.pngbin0 -> 1443191 bytes
-rw-r--r--examples/quick3d/virtualassistant/doc/src/virtualassistant.qdoc51
-rw-r--r--examples/quick3d/virtualassistant/imports/CMakeLists.txt4
-rw-r--r--examples/quick3d/virtualassistant/imports/Constants/CMakeLists.txt17
-rw-r--r--examples/quick3d/virtualassistant/imports/Constants/Constants.qml15
-rw-r--r--examples/quick3d/virtualassistant/imports/Constants/designer/plugin.metainfo13
-rw-r--r--examples/quick3d/virtualassistant/imports/Constants/qmldir3
-rw-r--r--examples/quick3d/virtualassistant/qmlmodules21
-rw-r--r--examples/quick3d/virtualassistant/qt_attribution.json11
-rw-r--r--examples/quick3d/virtualassistant/qtquickcontrols2.conf8
-rw-r--r--examples/quick3d/virtualassistant/src/main.cpp17
37 files changed, 7046 insertions, 0 deletions
diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/LICENSES/CC0-1.0.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/examples/quick3d/CMakeLists.txt b/examples/quick3d/CMakeLists.txt
index e4709a8c..a5ccb781 100644
--- a/examples/quick3d/CMakeLists.txt
+++ b/examples/quick3d/CMakeLists.txt
@@ -33,3 +33,5 @@ qt_internal_add_example(lodhelper)
qt_internal_add_example(simplefog)
qt_internal_add_example(sceneeffects)
qt_internal_add_example(volumeraycaster)
+qt_internal_add_example(virtualassistant)
+
diff --git a/examples/quick3d/virtualassistant/CMakeLists.txt b/examples/quick3d/virtualassistant/CMakeLists.txt
new file mode 100644
index 00000000..89453396
--- /dev/null
+++ b/examples/quick3d/virtualassistant/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.21.1)
+
+project(QtVirtualAssistant LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTOMOC ON)
+
+find_package(Qt6 6.5 REQUIRED COMPONENTS Core Gui Qml Quick)
+
+qt_standard_project_setup(REQUIRES 6.5)
+
+qt_add_executable(QtVirtualAssistant src/main.cpp)
+
+qt_add_resources(QtVirtualAssistant "configuration"
+ PREFIX "/"
+ FILES
+ qtquickcontrols2.conf
+)
+
+target_link_libraries(QtVirtualAssistant PRIVATE
+ Qt${QT_VERSION_MAJOR}::Core
+ Qt${QT_VERSION_MAJOR}::Gui
+ Qt${QT_VERSION_MAJOR}::Quick
+ Qt${QT_VERSION_MAJOR}::Qml
+)
+
+include(${CMAKE_CURRENT_SOURCE_DIR}/qmlmodules)
+
+include(GNUInstallDirs)
+install(TARGETS QtVirtualAssistant
+ BUNDLE DESTINATION .
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+
diff --git a/examples/quick3d/virtualassistant/Main.qml b/examples/quick3d/virtualassistant/Main.qml
new file mode 100644
index 00000000..41486fb4
--- /dev/null
+++ b/examples/quick3d/virtualassistant/Main.qml
@@ -0,0 +1,9 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import content
+
+App {
+}
+
diff --git a/examples/quick3d/virtualassistant/VirtualAssistant.qmlproject b/examples/quick3d/virtualassistant/VirtualAssistant.qmlproject
new file mode 100644
index 00000000..405c6aa0
--- /dev/null
+++ b/examples/quick3d/virtualassistant/VirtualAssistant.qmlproject
@@ -0,0 +1,114 @@
+import QmlProject
+
+Project {
+ mainFile: "content/App.qml"
+ mainUiFile: "content/Screen01.ui.qml"
+
+ /* Include .qml, .js, and image files from current directory and subdirectories */
+ QmlFiles {
+ directory: "content"
+ }
+
+ QmlFiles {
+ directory: "imports"
+ }
+
+ JavaScriptFiles {
+ directory: "content"
+ }
+
+ JavaScriptFiles {
+ directory: "imports"
+ }
+
+ ImageFiles {
+ directory: "content"
+ }
+
+ ImageFiles {
+ directory: "asset_imports"
+ }
+
+ Files {
+ filter: "*.conf"
+ files: ["qtquickcontrols2.conf"]
+ }
+
+ Files {
+ filter: "qmldir"
+ directory: "."
+ }
+
+ Files {
+ filter: "*.ttf;*.otf"
+ }
+
+ Files {
+ filter: "*.wav;*.mp3"
+ }
+
+ Files {
+ filter: "*.mp4"
+ }
+
+ Files {
+ filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag"
+ }
+
+ Files {
+ filter: "*.qsb"
+ }
+
+ Files {
+ filter: "*.mesh"
+ directory: "asset_imports"
+ }
+
+ Files {
+ filter: "*.qml"
+ directory: "asset_imports"
+ }
+
+ Environment {
+ QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf"
+ QT_AUTO_SCREEN_SCALE_FACTOR: "1"
+ QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT: "1"
+ QT_LOGGING_RULES: "qt.qml.connections=false"
+ QT_ENABLE_HIGHDPI_SCALING: "0"
+ /* Useful for debugging
+ QSG_VISUALIZE=batches
+ QSG_VISUALIZE=clip
+ QSG_VISUALIZE=changes
+ QSG_VISUALIZE=overdraw
+ */
+ }
+
+ qt6Project: true
+
+ /* List of plugin directories passed to QML runtime */
+ importPaths: [ "imports", "asset_imports" ]
+
+ /* Required for deployment */
+ targetDirectory: "/opt/VirtualAssistant"
+
+ qdsVersion: "4.3"
+
+ quickVersion: "6.5"
+
+ /* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */
+ widgetApp: true
+
+ /* args: Specifies command line arguments for qsb tool to generate shaders.
+ files: Specifies target files for qsb tool. If path is included, it must be relative to this file.
+ Wildcard '*' can be used in the file name part of the path.
+ e.g. files: [ "content/shaders/*.vert", "*.frag" ] */
+ ShaderTool {
+ args: "-s --glsl \"100 es,120,150\" --hlsl 50 --msl 12"
+ files: [ "content/shaders/*" ]
+ }
+
+ multilanguageSupport: true
+ supportedLanguages: ["en"]
+ primaryLanguage: "en"
+
+}
diff --git a/examples/quick3d/virtualassistant/asset_imports/CMakeLists.txt b/examples/quick3d/virtualassistant/asset_imports/CMakeLists.txt
new file mode 100644
index 00000000..0ab8a5da
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/CMakeLists.txt
@@ -0,0 +1,4 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+add_subdirectory(Quick3DAssets)
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/CMakeLists.txt b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/CMakeLists.txt
new file mode 100644
index 00000000..345c84aa
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/CMakeLists.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+add_subdirectory(RobotHeart)
+add_subdirectory(VirtualAssistant)
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/CMakeLists.txt b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/CMakeLists.txt
new file mode 100644
index 00000000..ac59f027
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+qt_add_library(RobotHeart STATIC)
+qt_add_qml_module(RobotHeart
+ URI "Quick3DAssets.RobotHeart"
+ VERSION 1.0
+ RESOURCE_PREFIX "/qt/qml"
+ QML_FILES
+ RobotHeart.qml
+ RESOURCES
+ meshes/plane.mesh
+)
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/RobotHeart.hints b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/RobotHeart.hints
new file mode 100644
index 00000000..5ef26ba5
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/RobotHeart.hints
@@ -0,0 +1,3 @@
+visibleInNavigator: true
+canBeDroppedInFormEditor: false
+canBeDroppedInView3D: true
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/RobotHeart.qml b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/RobotHeart.qml
new file mode 100644
index 00000000..7695a60f
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/RobotHeart.qml
@@ -0,0 +1,238 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick3D
+
+import QtQuick.Timeline
+
+Node {
+ id: node
+
+ property alias heartTimeline: heartTimeline
+ property alias heartAnimation: heartAnimation
+
+ scale.x: 0.4
+ scale.y: 0.4
+ scale.z: 0.4
+
+ // Resources
+ Skin {
+ id: skin
+ joints: base
+ inverseBindPoses: Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)
+ }
+
+ // Nodes:
+ Node {
+ id: heart_Arm
+ Model {
+ id: plane
+ source: "meshes/plane.mesh"
+ skin: skin
+ materials: heartMaterial_material
+ }
+ Node {
+ id: base
+ }
+ }
+
+ // Animations:
+ Timeline {
+ id: heartTimeline
+ startFrame: 0
+ endFrame: 1334
+ currentFrame: 0
+ enabled: false
+ animations: TimelineAnimation {
+ id: heartAnimation
+ duration: 1334
+ from: 0
+ to: 1334
+ running: heartTimeline.enabled
+ loops: Animation.Infinite
+ alwaysRunToEnd: true
+ }
+ KeyframeGroup {
+ target: base
+ property: "scale"
+ Keyframe {
+ frame: 0
+ value: Qt.vector3d(0.897612, 0.897612, 0.897612)
+ }
+ Keyframe {
+ frame: 33.3333
+ value: Qt.vector3d(0.898435, 0.898435, 0.898435)
+ }
+ Keyframe {
+ frame: 66.6667
+ value: Qt.vector3d(0.900828, 0.900828, 0.900828)
+ }
+ Keyframe {
+ frame: 100
+ value: Qt.vector3d(0.904679, 0.904679, 0.904679)
+ }
+ Keyframe {
+ frame: 133.333
+ value: Qt.vector3d(0.909876, 0.909876, 0.909876)
+ }
+ Keyframe {
+ frame: 166.667
+ value: Qt.vector3d(0.916307, 0.916307, 0.916307)
+ }
+ Keyframe {
+ frame: 200
+ value: Qt.vector3d(0.92386, 0.92386, 0.92386)
+ }
+ Keyframe {
+ frame: 233.333
+ value: Qt.vector3d(0.932423, 0.932423, 0.932423)
+ }
+ Keyframe {
+ frame: 266.667
+ value: Qt.vector3d(0.941883, 0.941883, 0.941883)
+ }
+ Keyframe {
+ frame: 300
+ value: Qt.vector3d(0.952128, 0.952128, 0.952128)
+ }
+ Keyframe {
+ frame: 333.333
+ value: Qt.vector3d(0.963046, 0.963046, 0.963046)
+ }
+ Keyframe {
+ frame: 366.667
+ value: Qt.vector3d(0.974525, 0.974525, 0.974525)
+ }
+ Keyframe {
+ frame: 400
+ value: Qt.vector3d(0.986453, 0.986453, 0.986453)
+ }
+ Keyframe {
+ frame: 433.333
+ value: Qt.vector3d(0.998717, 0.998717, 0.998717)
+ }
+ Keyframe {
+ frame: 466.667
+ value: Qt.vector3d(1.01121, 1.01121, 1.01121)
+ }
+ Keyframe {
+ frame: 500
+ value: Qt.vector3d(1.02381, 1.02381, 1.02381)
+ }
+ Keyframe {
+ frame: 533.333
+ value: Qt.vector3d(1.03641, 1.03641, 1.03641)
+ }
+ Keyframe {
+ frame: 566.667
+ value: Qt.vector3d(1.0489, 1.0489, 1.0489)
+ }
+ Keyframe {
+ frame: 600
+ value: Qt.vector3d(1.06116, 1.06116, 1.06116)
+ }
+ Keyframe {
+ frame: 633.333
+ value: Qt.vector3d(1.07309, 1.07309, 1.07309)
+ }
+ Keyframe {
+ frame: 666.667
+ value: Qt.vector3d(1.08457, 1.08457, 1.08457)
+ }
+ Keyframe {
+ frame: 700
+ value: Qt.vector3d(1.09548, 1.09548, 1.09548)
+ }
+ Keyframe {
+ frame: 733.333
+ value: Qt.vector3d(1.10573, 1.10573, 1.10573)
+ }
+ Keyframe {
+ frame: 766.667
+ value: Qt.vector3d(1.11519, 1.11519, 1.11519)
+ }
+ Keyframe {
+ frame: 800
+ value: Qt.vector3d(1.12375, 1.12375, 1.12375)
+ }
+ Keyframe {
+ frame: 833.333
+ value: Qt.vector3d(1.1313, 1.1313, 1.1313)
+ }
+ Keyframe {
+ frame: 866.667
+ value: Qt.vector3d(1.13774, 1.13774, 1.13774)
+ }
+ Keyframe {
+ frame: 900
+ value: Qt.vector3d(1.14293, 1.14293, 1.14293)
+ }
+ Keyframe {
+ frame: 933.333
+ value: Qt.vector3d(1.14678, 1.14678, 1.14678)
+ }
+ Keyframe {
+ frame: 966.667
+ value: Qt.vector3d(1.14918, 1.14918, 1.14918)
+ }
+ Keyframe {
+ frame: 1000
+ value: Qt.vector3d(1.15, 1.15, 1.15)
+ }
+ Keyframe {
+ frame: 1033.33
+ value: Qt.vector3d(1.14293, 1.14293, 1.14293)
+ }
+ Keyframe {
+ frame: 1066.67
+ value: Qt.vector3d(1.12375, 1.12375, 1.12375)
+ }
+ Keyframe {
+ frame: 1100
+ value: Qt.vector3d(1.09548, 1.09548, 1.09548)
+ }
+ Keyframe {
+ frame: 1133.33
+ value: Qt.vector3d(1.06116, 1.06116, 1.06116)
+ }
+ Keyframe {
+ frame: 1166.67
+ value: Qt.vector3d(1.02381, 1.02381, 1.02381)
+ }
+ Keyframe {
+ frame: 1200
+ value: Qt.vector3d(0.986453, 0.986453, 0.986453)
+ }
+ Keyframe {
+ frame: 1233.33
+ value: Qt.vector3d(0.952128, 0.952128, 0.952128)
+ }
+ Keyframe {
+ frame: 1266.67
+ value: Qt.vector3d(0.92386, 0.92386, 0.92386)
+ }
+ Keyframe {
+ frame: 1300
+ value: Qt.vector3d(0.904679, 0.904679, 0.904679)
+ }
+ Keyframe {
+ frame: 1333.33
+ value: Qt.vector3d(0.897612, 0.897612, 0.897612)
+ }
+ }
+ }
+
+ Node {
+ id: __materialLibrary__
+
+ PrincipledMaterial {
+ id: heartMaterial_material
+ objectName: "heartMaterial_material"
+ baseColor: "#ff197c1a"
+ roughness: 0.09734514355659485
+ cullMode: PrincipledMaterial.NoCulling
+ alphaMode: PrincipledMaterial.Opaque
+ }
+ }
+}
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/meshes/plane.mesh b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/meshes/plane.mesh
new file mode 100644
index 00000000..c35eb4e4
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/meshes/plane.mesh
Binary files differ
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/qmldir b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/qmldir
new file mode 100644
index 00000000..cdaba5ca
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/RobotHeart/qmldir
@@ -0,0 +1,2 @@
+module Quick3DAssets.RobotHeart
+RobotHeart 1.0 RobotHeart.qml
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/CMakeLists.txt b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/CMakeLists.txt
new file mode 100644
index 00000000..93d521f7
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+qt_add_library(VirtualAssistant STATIC)
+qt_add_qml_module(VirtualAssistant
+ URI "Quick3DAssets.VirtualAssistant"
+ VERSION 1.0
+ RESOURCE_PREFIX "/qt/qml"
+ QML_FILES
+ VirtualAssistant.qml
+ RESOURCES
+ meshes/body.mesh
+ meshes/mesh_107.mesh
+ meshes/mesh_108.mesh
+ meshes/mesh_109.mesh
+)
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.hints b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.hints
new file mode 100644
index 00000000..5ef26ba5
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.hints
@@ -0,0 +1,3 @@
+visibleInNavigator: true
+canBeDroppedInFormEditor: false
+canBeDroppedInView3D: true
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.qml b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.qml
new file mode 100644
index 00000000..33f3191d
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.qml
@@ -0,0 +1,5988 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick3D
+import QtQuick.Timeline 1.0
+import Quick3DAssets.RobotHeart 1.0
+
+Node {
+ id: node
+
+ enum ANIMATION {
+ ENTRY,
+ BACKFLIP,
+ BOUNCING,
+ RIGHTHAND,
+ LEFTHAND,
+ EXPLORE,
+ EXIT,
+ FACE,
+ HEART
+ }
+
+ property int currentAnim: -1
+
+ property var timelineList: [entryTimeline, backflipTimeline, bouncingTimeline,
+ rightHandWavingTimeline, leftHandWavingTimeline, exitTimeline, exploreTimeline,
+ faceTimeline, heart.heartTimeline]
+
+ function restoreDefaults() {
+ base.x = 0;
+ base.z = 0;
+ base.y = 0;
+ base.eulerRotation.x = 0.12;
+ base.eulerRotation.y = 0;
+ base.eulerRotation.z = 0;
+
+ loweBody.y = -0.73;
+ loweBody.z = -0.25;
+ loweBody.eulerRotation.x = -6;
+ loweBody.eulerRotation.y = -144;
+ loweBody.eulerRotation.z = 175;
+
+ hand_l.x = 1.89;
+ hand_l.y = 0.5;
+ hand_l.z = 0;
+ hand_l.eulerRotation.x = -0.18;
+ hand_l.eulerRotation.y = -145;
+ hand_l.eulerRotation.z = -178.92;
+
+ hand_r.x = -1.89;
+ hand_r.y = 0.5;
+ hand_r.z = 0;
+ hand_r.eulerRotation.x = 10;
+ hand_r.eulerRotation.y = 210;
+ hand_r.eulerRotation.z = 185;
+
+ node.state = "";
+ node.currentAnim = -1;
+ }
+
+ function stopAnimation(timeline) {
+ timeline.currentFrame = 0;
+ timeline.enabled = false;
+ }
+
+ function stopAnimations() {
+ node.timelineList.forEach((timeline) => node.stopAnimation(timeline))
+ node.restoreDefaults();
+ }
+
+ function runAnimation(index: int) {
+ stopAnimations();
+ currentAnim = index;
+ }
+
+ function animateObject(pickedObject: string) {
+ node.stopAnimations();
+ switch (pickedObject) {
+ case "rightHand":
+ currentAnim = VirtualAssistant.ANIMATION.RIGHTHAND;
+ break;
+ case "leftHand":
+ currentAnim = VirtualAssistant.ANIMATION.LEFTHAND;
+ break;
+ case "lowerBody":
+ currentAnim = VirtualAssistant.ANIMATION.BOUNCING;
+ break;
+ case "face":
+ currentAnim = VirtualAssistant.ANIMATION.FACE;
+ break;
+ case "chest":
+ currentAnim = VirtualAssistant.ANIMATION.HEART;
+ break;
+ default:
+ break;
+ }
+ }
+
+ Skin {
+ id: skin
+ joints: [
+ base,
+ chest,
+ loweBody,
+ head,
+ face,
+ hand_l,
+ hand_l_thumb1,
+ hand_l_thumb2,
+ hand_l_index1,
+ hand_l_index2,
+ hand_l_middle1,
+ hand_l_middle2,
+ hand_l_pinky1,
+ hand_l_pinky2,
+ hand_r,
+ hand_r_thumb1,
+ hand_r_thumb2,
+ hand_r_index1,
+ hand_r_index2,
+ hand_r_middle1,
+ hand_r_middle2,
+ hand_r_pinky1,
+ hand_r_pinky2
+ ]
+ inverseBindPoses: [
+ Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, -1.61245, 0, 0, 1, 0, 0, 0, 0, 1),
+ Qt.matrix4x4(0.813694, 0.0862685, -0.574857, -0.218272, 0.0100981, -0.990875, -0.134407, 0.844787, -0.581196, 0.103562, -0.807129, -0.29807, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 1.1016e-07, -3.48602e-07, 1.04242e-06, -1.10184e-07, 1, -6.87816e-05, -3.40188, 3.48594e-07, 6.87816e-05, 1, 0.302907, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 3.89414e-07, 0, -4.74221e-07, -2.75972e-14, -2.1173e-09, 1, 0.303307, 3.89414e-07, -1, 0, 5.80965, 0, 0, 0, 1),
+ Qt.matrix4x4(0.807687, 0.0365695, -0.588477, -1.58809, -0.00161026, -0.997934, -0.0642243, 1.59698, -0.589607, 0.0528207, -0.805956, 1.03229, 0, 0, 0, 1),
+ Qt.matrix4x4(0.471935, -0.631058, -0.615665, -0.244144, -0.802655, -0.59643, -0.0039282, 2.15297, -0.364719, 0.496022, -0.787995, 0.136329, 0, 0, 0, 1),
+ Qt.matrix4x4(0.36442, -0.489526, -0.792187, -0.198617, -0.802136, -0.59714, 3.03982e-06, 1.54657, -0.473046, 0.635443, -0.610273, 0.197515, 0, 0, 0, 1),
+ Qt.matrix4x4(0.80901, 0.00417731, -0.58778, -1.55616, 0.00231045, -0.99999, -0.00392679, 1.05789, -0.587788, 0.0018186, -0.809008, 1.08293, 0, 0, 0, 1),
+ Qt.matrix4x4(0.809015, 6.30314e-07, -0.587788, -1.55427, 4.87695e-07, -1, -4.01388e-07, 0.455413, -0.587785, -1.46701e-07, -0.809012, 1.08375, 0, 0, 0, 1),
+ Qt.matrix4x4(0.727117, 0.374232, -0.575545, -1.79386, 0.455163, -0.890399, -0.00392529, 0.0841881, -0.513931, -0.259114, -0.817758, 1.22003, 0, 0, 0, 1),
+ Qt.matrix4x4(0.652225, 0.330656, -0.682106, -1.61257, 0.452176, -0.891928, -2.05635e-06, -0.515896, -0.608389, -0.308432, -0.731249, 1.45386, 0, 0, 0, 1),
+ Qt.matrix4x4(0.468741, 0.681976, -0.561418, -1.6312, 0.822592, -0.568617, -0.00392005, -0.953233, -0.321902, -0.459983, -0.827519, 1.06958, 0, 0, 0, 1),
+ Qt.matrix4x4(0.24794, 0.355874, -0.901042, -0.881577, 0.820497, -0.571648, -3.36765e-06, -1.55446, -0.515079, -0.739305, -0.433726, 1.74657, 0, 0, 0, 1),
+ Qt.matrix4x4(0.812441, 0.0011587, -0.583043, 1.54508, 0.00957059, -0.99989, 0.011349, 1.60009, -0.582965, -0.0148005, -0.812362, -1.11435, 0, 0, 0, 1),
+ Qt.matrix4x4(0.474129, 0.644705, -0.59963, 0.22274, 0.808336, -0.588689, 0.00621243, 2.16486, -0.34899, -0.487648, -0.800253, -0.170718, 0, 0, 0, 1),
+ Qt.matrix4x4(0.370615, 0.494446, -0.786237, 0.176631, 0.807807, -0.58936, 0.010149, 1.5583, -0.458358, -0.638889, -0.617842, -0.219792, 0, 0, 0, 1),
+ Qt.matrix4x4(0.829668, 0.0243892, -0.557723, 1.55416, 0.0343586, -0.999382, 0.00740889, 1.11285, -0.557198, -0.0253095, -0.829994, -1.05429, 0, 0, 0, 1),
+ Qt.matrix4x4(0.814631, 0.00121515, -0.579979, 1.53562, 0.00957154, -0.99989, 0.0113491, 0.458829, -0.579901, -0.0147966, -0.814552, -1.10174, 0, 0, 0, 1),
+ Qt.matrix4x4(0.733453, -0.368831, -0.570973, 1.7816, -0.446605, -0.894721, 0.00426911, 0.0820569, -0.512437, 0.251868, -0.820958, -1.25878, 0, 0, 0, 1),
+ Qt.matrix4x4(0.658706, -0.332259, -0.675064, 1.59829, -0.443617, -0.896179, 0.00822179, -0.518127, -0.60771, 0.294054, -0.737714, -1.48719, 0, 0, 0, 1),
+ Qt.matrix4x4(0.476947, -0.675082, -0.562837, 1.61132, -0.817091, -0.576508, -0.000921175, -0.960906, -0.323859, 0.460329, -0.826567, -1.1161, 0, 0, 0, 1),
+ Qt.matrix4x4(0.254105, -0.362079, -0.896844, 0.849964, -0.814982, -0.579478, 0.00303894, -1.56224, -0.520802, 0.73014, -0.442337, -1.77263, 0, 0, 0, 1)
+ ]
+ }
+ Skin {
+ id: skin15
+ joints: [
+ base,
+ chest,
+ loweBody,
+ head,
+ face,
+ hand_l,
+ hand_l_thumb1,
+ hand_l_thumb2,
+ hand_l_index1,
+ hand_l_index2,
+ hand_l_middle1,
+ hand_l_middle2,
+ hand_l_pinky1,
+ hand_l_pinky2,
+ hand_r,
+ hand_r_thumb1,
+ hand_r_thumb2,
+ hand_r_index1,
+ hand_r_index2,
+ hand_r_middle1,
+ hand_r_middle2,
+ hand_r_pinky1,
+ hand_r_pinky2
+ ]
+ inverseBindPoses: [
+ Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, -1.61245, 0, 0, 1, 0, 0, 0, 0, 1),
+ Qt.matrix4x4(0.813694, 0.0862685, -0.574857, -0.218272, 0.0100981, -0.990875, -0.134407, 0.844787, -0.581196, 0.103562, -0.807129, -0.29807, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 1.1016e-07, -3.48602e-07, 1.04242e-06, -1.10184e-07, 1, -6.87816e-05, -3.40188, 3.48594e-07, 6.87816e-05, 1, 0.302907, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 3.89414e-07, 0, -4.74221e-07, -2.75972e-14, -2.1173e-09, 1, 0.303307, 3.89414e-07, -1, 0, 5.80965, 0, 0, 0, 1),
+ Qt.matrix4x4(0.807687, 0.0365695, -0.588477, -1.58809, -0.00161026, -0.997934, -0.0642243, 1.59698, -0.589607, 0.0528207, -0.805956, 1.03229, 0, 0, 0, 1),
+ Qt.matrix4x4(0.471935, -0.631058, -0.615665, -0.244144, -0.802655, -0.59643, -0.0039282, 2.15297, -0.364719, 0.496022, -0.787995, 0.136329, 0, 0, 0, 1),
+ Qt.matrix4x4(0.36442, -0.489526, -0.792187, -0.198617, -0.802136, -0.59714, 3.03982e-06, 1.54657, -0.473046, 0.635443, -0.610273, 0.197515, 0, 0, 0, 1),
+ Qt.matrix4x4(0.80901, 0.00417731, -0.58778, -1.55616, 0.00231045, -0.99999, -0.00392679, 1.05789, -0.587788, 0.0018186, -0.809008, 1.08293, 0, 0, 0, 1),
+ Qt.matrix4x4(0.809015, 6.30314e-07, -0.587788, -1.55427, 4.87695e-07, -1, -4.01388e-07, 0.455413, -0.587785, -1.46701e-07, -0.809012, 1.08375, 0, 0, 0, 1),
+ Qt.matrix4x4(0.727117, 0.374232, -0.575545, -1.79386, 0.455163, -0.890399, -0.00392529, 0.0841881, -0.513931, -0.259114, -0.817758, 1.22003, 0, 0, 0, 1),
+ Qt.matrix4x4(0.652225, 0.330656, -0.682106, -1.61257, 0.452176, -0.891928, -2.05635e-06, -0.515896, -0.608389, -0.308432, -0.731249, 1.45386, 0, 0, 0, 1),
+ Qt.matrix4x4(0.468741, 0.681976, -0.561418, -1.6312, 0.822592, -0.568617, -0.00392005, -0.953233, -0.321902, -0.459983, -0.827519, 1.06958, 0, 0, 0, 1),
+ Qt.matrix4x4(0.24794, 0.355874, -0.901042, -0.881577, 0.820497, -0.571648, -3.36765e-06, -1.55446, -0.515079, -0.739305, -0.433726, 1.74657, 0, 0, 0, 1),
+ Qt.matrix4x4(0.812441, 0.0011587, -0.583043, 1.54508, 0.00957059, -0.99989, 0.011349, 1.60009, -0.582965, -0.0148005, -0.812362, -1.11435, 0, 0, 0, 1),
+ Qt.matrix4x4(0.474129, 0.644705, -0.59963, 0.22274, 0.808336, -0.588689, 0.00621243, 2.16486, -0.34899, -0.487648, -0.800253, -0.170718, 0, 0, 0, 1),
+ Qt.matrix4x4(0.370615, 0.494446, -0.786237, 0.176631, 0.807807, -0.58936, 0.010149, 1.5583, -0.458358, -0.638889, -0.617842, -0.219792, 0, 0, 0, 1),
+ Qt.matrix4x4(0.829668, 0.0243892, -0.557723, 1.55416, 0.0343586, -0.999382, 0.00740889, 1.11285, -0.557198, -0.0253095, -0.829994, -1.05429, 0, 0, 0, 1),
+ Qt.matrix4x4(0.814631, 0.00121515, -0.579979, 1.53562, 0.00957154, -0.99989, 0.0113491, 0.458829, -0.579901, -0.0147966, -0.814552, -1.10174, 0, 0, 0, 1),
+ Qt.matrix4x4(0.733453, -0.368831, -0.570973, 1.7816, -0.446605, -0.894721, 0.00426911, 0.0820569, -0.512437, 0.251868, -0.820958, -1.25878, 0, 0, 0, 1),
+ Qt.matrix4x4(0.658706, -0.332259, -0.675064, 1.59829, -0.443617, -0.896179, 0.00822179, -0.518127, -0.60771, 0.294054, -0.737714, -1.48719, 0, 0, 0, 1),
+ Qt.matrix4x4(0.476947, -0.675082, -0.562837, 1.61132, -0.817091, -0.576508, -0.000921175, -0.960906, -0.323859, 0.460329, -0.826567, -1.1161, 0, 0, 0, 1),
+ Qt.matrix4x4(0.254105, -0.362079, -0.896844, 0.849964, -0.814982, -0.579478, 0.00303894, -1.56224, -0.520802, 0.73014, -0.442337, -1.77263, 0, 0, 0, 1)
+ ]
+ }
+ MorphTarget {
+ id: morphTarget
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget17
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget18
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget19
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget20
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget21
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget22
+ weight: 1
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget23
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ Skin {
+ id: skin26
+ joints: [
+ base,
+ chest,
+ loweBody,
+ head,
+ face,
+ hand_l,
+ hand_l_thumb1,
+ hand_l_thumb2,
+ hand_l_index1,
+ hand_l_index2,
+ hand_l_middle1,
+ hand_l_middle2,
+ hand_l_pinky1,
+ hand_l_pinky2,
+ hand_r,
+ hand_r_thumb1,
+ hand_r_thumb2,
+ hand_r_index1,
+ hand_r_index2,
+ hand_r_middle1,
+ hand_r_middle2,
+ hand_r_pinky1,
+ hand_r_pinky2
+ ]
+ inverseBindPoses: [
+ Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, -1.61245, 0, 0, 1, 0, 0, 0, 0, 1),
+ Qt.matrix4x4(0.813694, 0.0862685, -0.574857, -0.218272, 0.0100981, -0.990875, -0.134407, 0.844787, -0.581196, 0.103562, -0.807129, -0.29807, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 1.1016e-07, -3.48602e-07, 1.04242e-06, -1.10184e-07, 1, -6.87816e-05, -3.40188, 3.48594e-07, 6.87816e-05, 1, 0.302907, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 3.89414e-07, 0, -4.74221e-07, -2.75972e-14, -2.1173e-09, 1, 0.303307, 3.89414e-07, -1, 0, 5.80965, 0, 0, 0, 1),
+ Qt.matrix4x4(0.807687, 0.0365695, -0.588477, -1.58809, -0.00161026, -0.997934, -0.0642243, 1.59698, -0.589607, 0.0528207, -0.805956, 1.03229, 0, 0, 0, 1),
+ Qt.matrix4x4(0.471935, -0.631058, -0.615665, -0.244144, -0.802655, -0.59643, -0.0039282, 2.15297, -0.364719, 0.496022, -0.787995, 0.136329, 0, 0, 0, 1),
+ Qt.matrix4x4(0.36442, -0.489526, -0.792187, -0.198617, -0.802136, -0.59714, 3.03982e-06, 1.54657, -0.473046, 0.635443, -0.610273, 0.197515, 0, 0, 0, 1),
+ Qt.matrix4x4(0.80901, 0.00417731, -0.58778, -1.55616, 0.00231045, -0.99999, -0.00392679, 1.05789, -0.587788, 0.0018186, -0.809008, 1.08293, 0, 0, 0, 1),
+ Qt.matrix4x4(0.809015, 6.30314e-07, -0.587788, -1.55427, 4.87695e-07, -1, -4.01388e-07, 0.455413, -0.587785, -1.46701e-07, -0.809012, 1.08375, 0, 0, 0, 1),
+ Qt.matrix4x4(0.727117, 0.374232, -0.575545, -1.79386, 0.455163, -0.890399, -0.00392529, 0.0841881, -0.513931, -0.259114, -0.817758, 1.22003, 0, 0, 0, 1),
+ Qt.matrix4x4(0.652225, 0.330656, -0.682106, -1.61257, 0.452176, -0.891928, -2.05635e-06, -0.515896, -0.608389, -0.308432, -0.731249, 1.45386, 0, 0, 0, 1),
+ Qt.matrix4x4(0.468741, 0.681976, -0.561418, -1.6312, 0.822592, -0.568617, -0.00392005, -0.953233, -0.321902, -0.459983, -0.827519, 1.06958, 0, 0, 0, 1),
+ Qt.matrix4x4(0.24794, 0.355874, -0.901042, -0.881577, 0.820497, -0.571648, -3.36765e-06, -1.55446, -0.515079, -0.739305, -0.433726, 1.74657, 0, 0, 0, 1),
+ Qt.matrix4x4(0.812441, 0.0011587, -0.583043, 1.54508, 0.00957059, -0.99989, 0.011349, 1.60009, -0.582965, -0.0148005, -0.812362, -1.11435, 0, 0, 0, 1),
+ Qt.matrix4x4(0.474129, 0.644705, -0.59963, 0.22274, 0.808336, -0.588689, 0.00621243, 2.16486, -0.34899, -0.487648, -0.800253, -0.170718, 0, 0, 0, 1),
+ Qt.matrix4x4(0.370615, 0.494446, -0.786237, 0.176631, 0.807807, -0.58936, 0.010149, 1.5583, -0.458358, -0.638889, -0.617842, -0.219792, 0, 0, 0, 1),
+ Qt.matrix4x4(0.829668, 0.0243892, -0.557723, 1.55416, 0.0343586, -0.999382, 0.00740889, 1.11285, -0.557198, -0.0253095, -0.829994, -1.05429, 0, 0, 0, 1),
+ Qt.matrix4x4(0.814631, 0.00121515, -0.579979, 1.53562, 0.00957154, -0.99989, 0.0113491, 0.458829, -0.579901, -0.0147966, -0.814552, -1.10174, 0, 0, 0, 1),
+ Qt.matrix4x4(0.733453, -0.368831, -0.570973, 1.7816, -0.446605, -0.894721, 0.00426911, 0.0820569, -0.512437, 0.251868, -0.820958, -1.25878, 0, 0, 0, 1),
+ Qt.matrix4x4(0.658706, -0.332259, -0.675064, 1.59829, -0.443617, -0.896179, 0.00822179, -0.518127, -0.60771, 0.294054, -0.737714, -1.48719, 0, 0, 0, 1),
+ Qt.matrix4x4(0.476947, -0.675082, -0.562837, 1.61132, -0.817091, -0.576508, -0.000921175, -0.960906, -0.323859, 0.460329, -0.826567, -1.1161, 0, 0, 0, 1),
+ Qt.matrix4x4(0.254105, -0.362079, -0.896844, 0.849964, -0.814982, -0.579478, 0.00303894, -1.56224, -0.520802, 0.73014, -0.442337, -1.77263, 0, 0, 0, 1)
+ ]
+ }
+ MorphTarget {
+ id: morphTarget27
+ weight: 0
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget28
+ weight: 1
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget29
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget30
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget31
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget32
+ weight: 0
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget33
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget34
+ weight: 0
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ Skin {
+ id: skin37
+ joints: [
+ base,
+ chest,
+ loweBody,
+ head,
+ face,
+ hand_l,
+ hand_l_thumb1,
+ hand_l_thumb2,
+ hand_l_index1,
+ hand_l_index2,
+ hand_l_middle1,
+ hand_l_middle2,
+ hand_l_pinky1,
+ hand_l_pinky2,
+ hand_r,
+ hand_r_thumb1,
+ hand_r_thumb2,
+ hand_r_index1,
+ hand_r_index2,
+ hand_r_middle1,
+ hand_r_middle2,
+ hand_r_pinky1,
+ hand_r_pinky2
+ ]
+ inverseBindPoses: [
+ Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 0, 0, 0, 0, 1, 0, -1.61245, 0, 0, 1, 0, 0, 0, 0, 1),
+ Qt.matrix4x4(0.813694, 0.0862685, -0.574857, -0.218272, 0.0100981, -0.990875, -0.134407, 0.844787, -0.581196, 0.103562, -0.807129, -0.29807, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 1.1016e-07, -3.48602e-07, 1.04242e-06, -1.10184e-07, 1, -6.87816e-05, -3.40188, 3.48594e-07, 6.87816e-05, 1, 0.302907, 0, 0, 0, 1),
+ Qt.matrix4x4(1, 3.89414e-07, 0, -4.74221e-07, -2.75972e-14, -2.1173e-09, 1, 0.303307, 3.89414e-07, -1, 0, 5.80965, 0, 0, 0, 1),
+ Qt.matrix4x4(0.807687, 0.0365695, -0.588477, -1.58809, -0.00161026, -0.997934, -0.0642243, 1.59698, -0.589607, 0.0528207, -0.805956, 1.03229, 0, 0, 0, 1),
+ Qt.matrix4x4(0.471935, -0.631058, -0.615665, -0.244144, -0.802655, -0.59643, -0.0039282, 2.15297, -0.364719, 0.496022, -0.787995, 0.136329, 0, 0, 0, 1),
+ Qt.matrix4x4(0.36442, -0.489526, -0.792187, -0.198617, -0.802136, -0.59714, 3.03982e-06, 1.54657, -0.473046, 0.635443, -0.610273, 0.197515, 0, 0, 0, 1),
+ Qt.matrix4x4(0.80901, 0.00417731, -0.58778, -1.55616, 0.00231045, -0.99999, -0.00392679, 1.05789, -0.587788, 0.0018186, -0.809008, 1.08293, 0, 0, 0, 1),
+ Qt.matrix4x4(0.809015, 6.30314e-07, -0.587788, -1.55427, 4.87695e-07, -1, -4.01388e-07, 0.455413, -0.587785, -1.46701e-07, -0.809012, 1.08375, 0, 0, 0, 1),
+ Qt.matrix4x4(0.727117, 0.374232, -0.575545, -1.79386, 0.455163, -0.890399, -0.00392529, 0.0841881, -0.513931, -0.259114, -0.817758, 1.22003, 0, 0, 0, 1),
+ Qt.matrix4x4(0.652225, 0.330656, -0.682106, -1.61257, 0.452176, -0.891928, -2.05635e-06, -0.515896, -0.608389, -0.308432, -0.731249, 1.45386, 0, 0, 0, 1),
+ Qt.matrix4x4(0.468741, 0.681976, -0.561418, -1.6312, 0.822592, -0.568617, -0.00392005, -0.953233, -0.321902, -0.459983, -0.827519, 1.06958, 0, 0, 0, 1),
+ Qt.matrix4x4(0.24794, 0.355874, -0.901042, -0.881577, 0.820497, -0.571648, -3.36765e-06, -1.55446, -0.515079, -0.739305, -0.433726, 1.74657, 0, 0, 0, 1),
+ Qt.matrix4x4(0.812441, 0.0011587, -0.583043, 1.54508, 0.00957059, -0.99989, 0.011349, 1.60009, -0.582965, -0.0148005, -0.812362, -1.11435, 0, 0, 0, 1),
+ Qt.matrix4x4(0.474129, 0.644705, -0.59963, 0.22274, 0.808336, -0.588689, 0.00621243, 2.16486, -0.34899, -0.487648, -0.800253, -0.170718, 0, 0, 0, 1),
+ Qt.matrix4x4(0.370615, 0.494446, -0.786237, 0.176631, 0.807807, -0.58936, 0.010149, 1.5583, -0.458358, -0.638889, -0.617842, -0.219792, 0, 0, 0, 1),
+ Qt.matrix4x4(0.829668, 0.0243892, -0.557723, 1.55416, 0.0343586, -0.999382, 0.00740889, 1.11285, -0.557198, -0.0253095, -0.829994, -1.05429, 0, 0, 0, 1),
+ Qt.matrix4x4(0.814631, 0.00121515, -0.579979, 1.53562, 0.00957154, -0.99989, 0.0113491, 0.458829, -0.579901, -0.0147966, -0.814552, -1.10174, 0, 0, 0, 1),
+ Qt.matrix4x4(0.733453, -0.368831, -0.570973, 1.7816, -0.446605, -0.894721, 0.00426911, 0.0820569, -0.512437, 0.251868, -0.820958, -1.25878, 0, 0, 0, 1),
+ Qt.matrix4x4(0.658706, -0.332259, -0.675064, 1.59829, -0.443617, -0.896179, 0.00822179, -0.518127, -0.60771, 0.294054, -0.737714, -1.48719, 0, 0, 0, 1),
+ Qt.matrix4x4(0.476947, -0.675082, -0.562837, 1.61132, -0.817091, -0.576508, -0.000921175, -0.960906, -0.323859, 0.460329, -0.826567, -1.1161, 0, 0, 0, 1),
+ Qt.matrix4x4(0.254105, -0.362079, -0.896844, 0.849964, -0.814982, -0.579478, 0.00303894, -1.56224, -0.520802, 0.73014, -0.442337, -1.77263, 0, 0, 0, 1)
+ ]
+ }
+ MorphTarget {
+ id: morphTarget38
+ weight: 1
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget39
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget40
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget41
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget42
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+ MorphTarget {
+ id: morphTarget43
+ attributes: MorphTarget.Position | MorphTarget.Normal
+ }
+
+ // Nodes:
+ Node {
+ id: assistantArmature
+ Model {
+ id: body
+ x: 0.018
+ y: -0.215
+ source: "meshes/body.mesh"
+ z: 0.03802
+ skin: skin
+ materials: [
+ headGlass_material,
+ bodyMaterial_material,
+ faceScreen_material,
+ bodyDarker_material,
+ chestScreen_m_material
+ ]
+ }
+ Model {
+ id: eye_l
+ source: "meshes/mesh_109.mesh"
+ skin: skin15
+ materials: surfaceShader1_material
+ morphTargets: [
+ morphTarget,
+ morphTarget17,
+ morphTarget18,
+ morphTarget19,
+ morphTarget20,
+ morphTarget21,
+ morphTarget22,
+ morphTarget23
+ ]
+ }
+ Model {
+ id: eye_r
+ source: "meshes/mesh_107.mesh"
+ skin: skin26
+ materials: surfaceShader1_material
+ morphTargets: [
+ morphTarget27,
+ morphTarget28,
+ morphTarget29,
+ morphTarget30,
+ morphTarget31,
+ morphTarget32,
+ morphTarget33,
+ morphTarget34
+ ]
+ }
+ Model {
+ id: mouth
+ source: "meshes/mesh_108.mesh"
+ skin: skin37
+ materials: surfaceShader1_material
+ morphTargets: [
+ morphTarget38,
+ morphTarget39,
+ morphTarget40,
+ morphTarget41,
+ morphTarget42,
+ morphTarget43
+ ]
+ }
+ Node {
+ id: base
+ x: 0
+ eulerRotation.z: 0
+ Node {
+ id: chest
+ y: 1.6124529838562012
+
+ RobotHeart {
+ id: heart
+ x: 0
+ y: 0.5
+ z: 0.78
+
+ heartAnimation.onFinished: node.restoreDefaults()
+ }
+
+ Node {
+ id: loweBody
+ x: -0.004165101796388626
+ y: -0.7256757020950317
+ z: -0.25251561403274536
+ rotation: Qt.quaternion(-0.0626087, 0.950225, 0.0253533, -0.304155)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 0.84
+ }
+ Node {
+ id: head
+ x: -1.5228409893097705e-06
+ y: 1.7894086837768555
+ z: -0.3031412661075592
+ rotation: Qt.quaternion(1, -3.43908e-05, 1.74299e-07, 5.50858e-08)
+ Node {
+ id: face
+ x: 1.0658141036401503e-13
+ y: 2.4077866077423096
+ z: 7.595476247956867e-09
+ rotation: Qt.quaternion(0.707082, 0.707131, -2.45256e-08, 2.2198e-07)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ Node {
+ id: hand_l
+ x: 1.89
+ y: 0.5
+ eulerRotation.z: -180
+ eulerRotation.y: -145
+ eulerRotation.x: 0
+ z: 0
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_l_thumb1
+ x: -1.3783574104309082e-07
+ y: 0.5359349250793457
+ z: 1.4901161193847656e-07
+ rotation: Qt.quaternion(0.893516, 0.248658, 0.000745812, 0.373896)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_l_thumb2
+ x: -8.568167686462402e-08
+ y: 0.6063140034675598
+ z: 8.195638656616211e-08
+ rotation: Qt.quaternion(0.992124, -0.00169711, -0.125246, 0.00108482)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ Node {
+ id: hand_l_index1
+ x: -1.3783574104309082e-07
+ y: 0.5359349250793457
+ z: 1.4901161193847656e-07
+ rotation: Qt.quaternion(0.999542, -0.0255386, 0.00111382, 0.016175)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_l_index2
+ x: 6.01867213845253e-08
+ y: 0.6069974303245544
+ z: 5.390029400587082e-08
+ rotation: Qt.quaternion(0.999997, -0.000909374, 2.75425e-07, 0.00208834)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ Node {
+ id: hand_l_middle1
+ x: -1.3783574104309082e-07
+ y: 0.5359349250793457
+ z: 1.4901161193847656e-07
+ rotation: Qt.quaternion(0.971617, -0.160599, 0.000448361, -0.173691)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_l_middle2
+ x: -2.2351741790771484e-08
+ y: 0.6075053811073303
+ z: -1.4901161193847656e-08
+ rotation: Qt.quaternion(0.997639, -0.000465468, -0.0686245, 0.00253881)
+ scale.x: 0.99
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ Node {
+ id: hand_l_pinky1
+ x: -1.3783574104309082e-07
+ y: 0.5359349250793457
+ z: 1.4901161193847656e-07
+ rotation: Qt.quaternion(0.884977, -0.289438, -0.000556779, -0.364748)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_l_pinky2
+ x: 2.421438694000244e-08
+ y: 0.6085596084594727
+ z: -7.82310962677002e-08
+ rotation: Qt.quaternion(0.965603, 0.000116328, -0.260006, 0.00268633)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ }
+ Node {
+ id: hand_r
+ x: -1.89
+ y: 0.5
+ eulerRotation.z: 185
+ eulerRotation.y: 210
+ eulerRotation.x: 10
+ z: 0
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_r_thumb1
+ x: -5.855690687894821e-08
+ y: 0.5341170430183411
+ z: 2.2351741790771484e-08
+ rotation: Qt.quaternion(0.893414, -0.263802, -0.00523041, -0.363584)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_r_thumb2
+ x: -5.960464477539063e-08
+ y: 0.6063126921653748
+ z: 8.195638656616211e-08
+ rotation: Qt.quaternion(0.991448, -0.0011092, -0.130483, 0.0016812)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ Node {
+ id: hand_r_index1
+ x: -5.855690687894821e-08
+ y: 0.5341170430183411
+ z: 2.2351741790771484e-08
+ rotation: Qt.quaternion(0.9998, -0.00545401, 0.0155425, -0.0113054)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_r_index2
+ x: 7.450580596923828e-09
+ y: 0.6073394417762756
+ z: 2.421438694000244e-08
+ rotation: Qt.quaternion(0.999828, 0.0054324, -0.0136597, 0.0113152)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ Node {
+ id: hand_r_middle1
+ x: -5.855690687894821e-08
+ y: 0.5341170430183411
+ z: 2.2351741790771484e-08
+ rotation: Qt.quaternion(0.972198, 0.137881, 0.00537494, 0.189183)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_r_middle2
+ x: 4.377216100692749e-08
+ y: 0.607505738735199
+ z: -1.5832483768463135e-07
+ rotation: Qt.quaternion(0.997774, -0.00258153, -0.0666323, -6.41172e-05)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ Node {
+ id: hand_r_pinky1
+ x: -5.855690687894821e-08
+ y: 0.5341170430183411
+ z: 2.2351741790771484e-08
+ rotation: Qt.quaternion(0.88557, 0.270553, 0.00851581, 0.377484)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ Node {
+ id: hand_r_pinky2
+ x: -1.4808028936386108e-07
+ y: 0.6085614562034607
+ z: -2.1420419216156006e-08
+ rotation: Qt.quaternion(0.967055, -0.00267332, -0.254553, 0.000299689)
+ scale.x: 1
+ scale.y: 1
+ scale.z: 1
+ }
+ }
+ }
+ }
+ }
+ }
+
+ Node {
+ id: __materialLibrary__
+
+ PrincipledMaterial {
+ id: headGlass_material
+ objectName: "headGlass_material"
+ baseColor: "#5e000000"
+ roughness: 0.10892388224601746
+ cullMode: PrincipledMaterial.NoCulling
+ alphaMode: PrincipledMaterial.Blend
+ transmissionFactor: 1
+ indexOfRefraction: 1.4500000476837158
+ }
+
+ PrincipledMaterial {
+ id: bodyMaterial_material
+ objectName: "bodyMaterial_material"
+ baseColor: "#ff808080"
+ roughness: 0.5527864098548889
+ cullMode: PrincipledMaterial.NoCulling
+ alphaMode: PrincipledMaterial.Opaque
+ }
+
+ PrincipledMaterial {
+ id: faceScreen_material
+ objectName: "faceScreen_material"
+ baseColor: "#ff000000"
+ metalness: 0.5
+ cullMode: PrincipledMaterial.NoCulling
+ alphaMode: PrincipledMaterial.Opaque
+ }
+
+ PrincipledMaterial {
+ id: bodyDarker_material
+ objectName: "bodyDarker_material"
+ baseColor: "#ff292929"
+ roughness: 0.5
+ cullMode: PrincipledMaterial.NoCulling
+ alphaMode: PrincipledMaterial.Opaque
+ }
+
+ PrincipledMaterial {
+ id: chestScreen_m_material
+ objectName: "chestScreen_m_material"
+ baseColor: "#000000"
+ roughness: 0.5
+ cullMode: PrincipledMaterial.NoCulling
+ alphaMode: PrincipledMaterial.Opaque
+ }
+
+ PrincipledMaterial {
+ id: surfaceShader1_material
+ objectName: "surfaceShader1_material"
+ baseColor: "#ff079314"
+ roughness: 0.5527864098548889
+ cullMode: PrincipledMaterial.NoCulling
+ alphaMode: PrincipledMaterial.Opaque
+ }
+ }
+
+ Model {
+ id: rightHand
+ objectName: "rightHand"
+ position: hand_r.position
+ opacity: 0
+ source: "#Sphere"
+ pivot.y: -40
+ scale.x: 0.02
+ scale.y: 0.02
+ scale.z: 0.02
+ pickable: node.state === ""
+ }
+
+ Model {
+ id: leftHand
+ objectName: "leftHand"
+ position: hand_l.position
+ opacity: 0
+ source: "#Sphere"
+ pivot.y: -40
+ scale.x: 0.02
+ scale.y: 0.02
+ scale.z: 0.02
+ pickable: node.state === ""
+ }
+
+ Model {
+ id: lowerBody
+ objectName: "lowerBody"
+ position: loweBody.position
+ opacity: 0
+ source: "#Sphere"
+ pivot.y: -120
+ scale.x: 0.01
+ scale.z: 0.01
+ scale.y: 0.01
+ pickable: node.state === ""
+ }
+
+ Model {
+ id: faceSphere
+ objectName: "face"
+ position: face.position
+ opacity: 0
+ source: "#Sphere"
+ pivot.y: -80
+ scale.x: 0.04
+ scale.z: 0.04
+ scale.y: 0.04
+ pickable: node.state === ""
+ }
+
+ Model {
+ id: chestSphere
+ objectName: "chest"
+ position: node.position
+ opacity: 0
+ source: "#Sphere"
+ pivot.y: -110
+ scale.x: 0.02
+ scale.z: 0.02
+ scale.y: 0.02
+ pickable: node.state === ""
+ }
+
+ // Animations:
+ Timeline {
+ id: entryTimeline
+ animations: [
+ TimelineAnimation {
+ id: entryAnimation
+ onFinished: node.restoreDefaults()
+ running: false
+ loops: 1
+ duration: 10500
+ to: 10500
+ from: 0
+ }
+ ]
+ startFrame: 0
+ endFrame: 10500
+ enabled: false
+
+ KeyframeGroup {
+ target: morphTarget38
+ property: "weight"
+
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1300
+ }
+
+ Keyframe {
+ value: 0.25
+ frame: 1800
+ }
+
+ Keyframe {
+ value: 0.25
+ frame: 10000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget42
+ property: "weight"
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1300
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 1800
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 10000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget27
+ property: "weight"
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1300
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1800
+ }
+
+ Keyframe {
+ frame: 7499
+ value: 0
+ }
+
+ Keyframe {
+ frame: 7252
+ value: 0
+ }
+
+ Keyframe {
+ frame: 7000
+ value: 1
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget28
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1800
+ }
+
+ Keyframe {
+ value: 0
+ frame: 9750
+ }
+
+ Keyframe {
+ value: 1
+ frame: 10250
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1310
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1800
+ }
+
+ Keyframe {
+ value: 1
+ frame: 7000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 7500
+ }
+
+ Keyframe {
+ frame: 7250
+ value: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget17
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1800
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget21
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 7000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 7250
+ }
+
+ Keyframe {
+ frame: 7500
+ value: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget22
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ frame: 7250
+ value: 0
+ }
+
+ Keyframe {
+ frame: 7500
+ value: 1
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "x"
+
+ Keyframe {
+ value: -0.07
+ frame: 0
+ }
+
+ Keyframe {
+ value: -0.07
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.77,0,0.175,1,1,1]
+ value: 2.49
+ frame: 2000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.77,0,0.175,1,1,1]
+ value: 0.59
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 1.89
+ frame: 2500
+ }
+
+ Keyframe {
+ value: 1.89
+ frame: 7000
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 7400
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 9700
+ }
+
+ Keyframe {
+ value: 1.89
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "y"
+
+ Keyframe {
+ value: 0.5
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 0.4
+ frame: 1500
+ }
+
+ Keyframe {
+ value: -0.2
+ frame: 2000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.77,0,0.175,1,1,1]
+ value: 0.3
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 2500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.39,0.575,0.565,1,1,1]
+ value: -0.25
+ frame: 4100
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.233,0.161,0.264,0.997,0.393,0.997,0.522,0.997,0.555,0.752,0.61,0.75,0.664,0.748,0.736,1,0.775,1,0.814,0.999,0.861,0.901,0.888,0.901,0.916,0.901,0.923,0.995,1,1]
+ value: 0.5
+ frame: 5150
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 7000
+ }
+
+ Keyframe {
+ value: 0.3
+ frame: 7400
+ }
+
+ Keyframe {
+ value: 0.3
+ frame: 9700
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.085,0.68,0.53,1,1]
+ value: 0.5
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "x"
+
+ Keyframe {
+ value: 0.07
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0.07
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.77,0,0.175,1,1,1]
+ value: -2.49
+ frame: 2000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.77,0,0.175,1,1,1]
+ value: -0.59
+ frame: 2300
+ }
+
+ Keyframe {
+ value: -1.89
+ frame: 2500
+ }
+
+ Keyframe {
+ value: -1.89
+ frame: 4100
+ }
+
+ Keyframe {
+ value: -2.89
+ frame: 5150
+ }
+
+ Keyframe {
+ value: -2.89
+ frame: 7000
+ }
+
+ Keyframe {
+ value: -0.75
+ frame: 7400
+ }
+
+ Keyframe {
+ value: -0.75
+ frame: 9700
+ }
+
+ Keyframe {
+ value: -1.89
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "y"
+
+ Keyframe {
+ value:0.5
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 0.45
+ frame: 1500
+ }
+
+ Keyframe {
+ value: -0.2
+ frame: 2000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.77,0,0.175,1,1,1]
+ value: 0.3
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 2500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.39,0.575,0.565,1,1,1]
+ value: -0.25
+ frame: 4100
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.233,0.161,0.264,0.997,0.393,0.997,0.522,0.997,0.555,0.752,0.61,0.75,0.664,0.748,0.736,1,0.775,1,0.814,0.999,0.861,0.901,0.888,0.901,0.916,0.901,0.923,0.995,1,1]
+ value: 0.5
+ frame: 5150
+ }
+
+ Keyframe {
+ value: 0.3
+ frame: 7400
+ }
+
+ Keyframe {
+ value: 0.3
+ frame: 9700
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.085,0.68,0.53,1,1]
+ value: 0.5
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "z"
+ Keyframe {
+ value: -50
+ frame: 0
+ }
+
+ Keyframe {
+ value: 2
+ frame: 850
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1572
+ }
+
+ Keyframe {
+ value: 0.88989
+ frame: 1200
+ }
+
+ Keyframe {
+ value: -1
+ frame: 2700
+ }
+
+ Keyframe {
+ value: -2.16239
+ frame: 3150
+ }
+
+ Keyframe {
+ value: -5
+ frame: 4100
+ }
+
+ Keyframe {
+ value: -4
+ frame: 5150
+ }
+
+
+ Keyframe {
+ easing.bezierCurve: [0.25,0.46,0.45,0.94,1,1]
+ value: -3
+ frame: 6250
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.085,0.68,0.53,1,1]
+ value: -4
+ frame: 7420
+ }
+
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: -1.89753
+ frame: 8950
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.215,0.61,0.355,1,1,1]
+ value: 0
+ frame: 9750
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.455,0.03,0.515,0.955,1,1]
+ value: -0.5
+ frame: 10000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.645,0.045,0.355,1,1,1]
+ value: 0
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "y"
+ Keyframe {
+ value: -10
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 850
+ }
+
+ Keyframe {
+ value: 0.44494
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1572
+ }
+
+ Keyframe {
+ value: -0.5
+ frame: 2700
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: -0.25
+ frame: 3400
+ }
+
+ Keyframe {
+ value: 1
+ frame: 4100
+ }
+
+ Keyframe {
+ value: 1
+ frame: 5150
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.25,0.46,0.45,0.94,1,1]
+ value: 0.5
+ frame: 6250
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.085,0.68,0.53,1,1]
+ value: 1
+ frame: 7420
+ }
+
+ Keyframe {
+ value: 1
+ frame: 8950
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: 0
+ frame: 9750
+ }
+
+ Keyframe {
+ value: -0.25
+ frame: 10000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "x"
+ Keyframe {
+ value: -50
+ frame: 0
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.215,0.61,0.355,1,1,1]
+ value: 3
+ frame: 850
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1572
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: 1.33483
+ frame: 1200
+ }
+
+ Keyframe {
+ value: -1
+ frame: 2700
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3150
+ }
+
+ Keyframe {
+ value: 12
+ frame: 4100
+ }
+
+ Keyframe {
+ value: 11
+ frame: 5150
+ }
+
+ Keyframe {
+ value: 11
+ frame: 7400
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.25,0.46,0.45,0.94,1,1]
+ value: 0
+ frame: 8950
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: 0
+ frame: 9750
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "eulerRotation.z"
+ Keyframe {
+ easing.bezierCurve: [0.645,0.045,0.355,1,1,1]
+ value: -20
+ frame: 0
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: 0
+ frame: 850
+ }
+
+ Keyframe {
+ value: 4
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1572
+ }
+
+ Keyframe {
+ value: -3
+ frame: 2700
+ }
+
+ Keyframe {
+ value: -2.95444
+ frame: 3150
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4100
+ }
+
+ Keyframe {
+ value: 0
+ frame: 5150
+ }
+
+ Keyframe {
+ value: 0
+ frame: 7400
+ }
+
+ Keyframe {
+ value: 5
+ frame: 7950
+ }
+
+ Keyframe {
+ value: 0
+ frame: 8950
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.455,0.03,0.515,0.955,1,1]
+ value: 0
+ frame: 9750
+ }
+
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "eulerRotation.y"
+ Keyframe {
+ easing.bezierCurve: [0.895,0.03,0.685,0.22,1,1]
+ value: 70
+ frame: 0
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: 0
+ frame: 850
+ }
+
+ Keyframe {
+ value: -10
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1550
+ }
+
+ Keyframe {
+ value: 10
+ frame: 2700
+ }
+
+ Keyframe {
+ value: 90
+ frame: 3150
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.085,0.68,0.53,1,1]
+ value: -40
+ frame: 4100
+ }
+
+ Keyframe {
+ value: -30
+ frame: 5150
+ }
+
+ Keyframe {
+ value: -19.22502
+ frame: 7400
+ }
+
+ Keyframe {
+ value: -25
+ frame: 7950
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.39,0.575,0.565,1,1,1]
+ value: -360
+ frame: 9750
+ }
+
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "y"
+
+ Keyframe {
+ value: 0.3
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0.3
+ frame: 1000
+ }
+
+ Keyframe {
+ value: -0.2
+ frame: 1200
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.233,0.161,0.264,0.997,0.393,0.997,0.522,0.997,0.555,0.752,0.61,0.75,0.664,0.748,0.736,1,0.775,1,0.814,0.999,0.861,0.901,0.888,0.901,0.916,0.901,0.923,0.995,1,1]
+ value: -1.25
+ frame: 2000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: -0.72568
+ frame: 2700
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.39,0.575,0.565,1,1,1]
+ value: -2
+ frame: 4110
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.233,0.161,0.264,0.997,0.393,0.997,0.522,0.997,0.555,0.752,0.61,0.75,0.664,0.748,0.736,1,0.775,1,0.814,0.999,0.861,0.901,0.888,0.901,0.916,0.901,0.923,0.995,1,1]
+ value: -0.72568
+ frame: 5150
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: -1.2
+ frame: 7400
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.233,0.161,0.264,0.997,0.393,0.997,0.522,0.997,0.555,0.752,0.61,0.75,0.664,0.748,0.736,1,0.775,1,0.814,0.999,0.861,0.901,0.888,0.901,0.916,0.901,0.923,0.995,1,1]
+ value: -0.72568
+ frame: 9750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.y"
+
+ Keyframe {
+ value: 28
+ frame: 0
+ }
+
+ Keyframe {
+ value: 28
+ frame: 1500
+ }
+
+ Keyframe {
+ value: -100
+ frame: 2300
+ }
+
+ Keyframe {
+ value: -15
+ frame: 2500
+ }
+
+ Keyframe {
+ value: -145
+ frame: 2700
+ }
+
+ Keyframe {
+ value: -145
+ frame: 7000
+ }
+
+ Keyframe {
+ value: -118
+ frame: 7400
+ }
+
+ Keyframe {
+ value: -118
+ frame: 9700
+ }
+
+ Keyframe {
+ value: -145
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.y"
+
+ Keyframe {
+ value: -10
+ frame: 1500
+ }
+
+ Keyframe {
+ value: -10
+ frame: 0
+ }
+
+ Keyframe {
+ value: 93
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 3
+ frame: 2500
+ }
+
+ Keyframe {
+ value: 210
+ frame: 2700
+ }
+
+ Keyframe {
+ value: 210
+ frame: 4097
+ }
+
+ Keyframe {
+ value: 3
+ frame: 5149
+ }
+
+ Keyframe {
+ value: 3
+ frame: 6989
+ }
+
+ Keyframe {
+ value: 110
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 110
+ frame: 9695
+ }
+
+ Keyframe {
+ value: 210
+ frame: 10499
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "z"
+ Keyframe {
+ value: -0.1
+ frame: 0
+ }
+ Keyframe {
+ value: -0.1
+ frame: 1000
+ }
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 1.2
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2500
+ }
+
+ Keyframe {
+ value: -0.9
+ frame: 1500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: -0.3
+ frame: 1300
+ }
+
+ Keyframe {
+ value: -1
+ frame: 4113
+ }
+
+ Keyframe {
+ value: 0
+ frame: 5149
+ }
+
+ Keyframe {
+ value: 0
+ frame: 6989
+ }
+
+ Keyframe {
+ value: 1.2
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 1.2
+ frame: 9679
+ }
+
+ Keyframe {
+ value: 0
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "z"
+ Keyframe {
+ value: -0.1
+ frame: 0
+ }
+ Keyframe {
+ value: -0.1
+ frame: 1000
+ }
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 1.2
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2500
+ }
+
+ Keyframe {
+ value: -0.9
+ frame: 1500
+ }
+
+ Keyframe {
+ value: -0.4
+ frame: 1296
+ }
+
+ Keyframe {
+ value: -1
+ frame: 4113
+ }
+
+ Keyframe {
+ value: 0
+ frame: 5149
+ }
+
+ Keyframe {
+ value: 1.2
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 1.2
+ frame: 9695
+ }
+
+ Keyframe {
+ value: 0
+ frame: 10499
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.x"
+ Keyframe {
+ value: 86
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 86
+ frame: 0
+ }
+
+ Keyframe {
+ value: 40
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 49
+ frame: 2500
+ }
+
+ Keyframe {
+ value: 10
+ frame: 2700
+ }
+
+ Keyframe {
+ value: 10
+ frame: 4097
+ }
+
+ Keyframe {
+ value: 49
+ frame: 5149
+ }
+
+ Keyframe {
+ value: 49
+ frame: 5149
+ }
+
+ Keyframe {
+ value: 9
+ frame: 5600
+ }
+
+ Keyframe {
+ value: 49
+ frame: 6046
+ }
+
+ Keyframe {
+ value: 9
+ frame: 6500
+ }
+
+ Keyframe {
+ value: 49
+ frame: 6989
+ }
+
+ Keyframe {
+ value: 36
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 36
+ frame: 9695
+ }
+
+ Keyframe {
+ value: 10
+ frame: 10499
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 108
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 108
+ frame: 0
+ }
+
+ Keyframe {
+ value: 90
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 84
+ frame: 2500
+ }
+
+ Keyframe {
+ value: 185
+ frame: 2700
+ }
+
+ Keyframe {
+ value: 185
+ frame: 4097
+ }
+
+ Keyframe {
+ value: 84
+ frame: 5149
+ }
+
+ Keyframe {
+ value: 4
+ frame: 5600
+ }
+
+ Keyframe {
+ value: 84
+ frame: 6050
+ }
+
+ Keyframe {
+ value: 4
+ frame: 6500
+ }
+
+ Keyframe {
+ value: 84
+ frame: 6989
+ }
+
+ Keyframe {
+ value: 86
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 86
+ frame: 9695
+ }
+
+ Keyframe {
+ value: 185
+ frame: 10499
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.x"
+ Keyframe {
+ value: -3.02782
+ frame: 1500
+ }
+
+ Keyframe {
+ value: -37
+ frame: 2300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2700
+ }
+
+ Keyframe {
+ value: -15
+ frame: 2500
+ }
+
+ Keyframe {
+ value: -3.02998
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 6989
+ }
+
+ Keyframe {
+ value: -37
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -37
+ frame: 9679
+ }
+
+ Keyframe {
+ value: 0
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.z"
+ Keyframe {
+ value: -93
+ frame: 2300
+ }
+
+ Keyframe {
+ value: -86.04612
+ frame: 1500
+ }
+
+ Keyframe {
+ value: -180
+ frame: 2700
+ }
+
+ Keyframe {
+ value: -88
+ frame: 2500
+ }
+
+ Keyframe {
+ value: -86.05
+ frame: 0
+ }
+
+ Keyframe {
+ value: -180
+ frame: 6989
+ }
+
+ Keyframe {
+ value: -86
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -86
+ frame: 9679
+ }
+
+ Keyframe {
+ value: -180
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "eulerRotation.x"
+
+ Keyframe {
+ value: 0
+ frame: 2700
+ }
+
+ Keyframe {
+ value: 35
+ frame: 3154
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4100
+ }
+
+ Keyframe {
+ value: 5
+ frame: 5150
+ }
+
+ Keyframe {
+ value: 4.97468
+ frame: 7400
+ }
+
+ Keyframe {
+ value: 0
+ frame: 9750
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.165,0.84,0.44,1,1,1]
+ value: 2
+ frame: 10000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: 0
+ frame: 10500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_thumb2
+ property: "scale.x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_thumb2
+ property: "scale.y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_thumb2
+ property: "scale.z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "scale.x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "scale.y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "scale.z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "scale.x"
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "scale.x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "scale.y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "scale.z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "scale.x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "scale.y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "scale.z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "scale.x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "scale.y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "scale.z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "scale.x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "scale.y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "scale.z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "scale.x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "scale.y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "scale.z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1550
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: -0.6
+ frame: 1200
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1000
+ }
+
+ Keyframe {
+ value: -0.25
+ frame: 2000
+ }
+
+ Keyframe {
+ value: -0.25
+ frame: 9726
+ }
+
+ Keyframe {
+ value: -0.25
+ frame: 2706
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.25,0.46,0.45,0.94,1,1]
+ value: -1
+ frame: 4113
+ }
+
+ Keyframe {
+ value: -0.25
+ frame: 5149
+ }
+
+ Keyframe {
+ value: -0.25
+ frame: 7422
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "eulerRotation.x"
+ Keyframe {
+ value: -50
+ frame: 0
+ }
+
+ Keyframe {
+ value: -6
+ frame: 2000
+ }
+
+ Keyframe {
+ value: -50
+ frame: 1000
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "eulerRotation.y"
+ Keyframe {
+ value: -172
+ frame: 0
+ }
+
+ Keyframe {
+ value: -144
+ frame: 2000
+ }
+
+ Keyframe {
+ value: -172
+ frame: 1000
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 173
+ frame: 0
+ }
+
+ Keyframe {
+ value: 175
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 173
+ frame: 1000
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_thumb2
+ property: "eulerRotation.x"
+ Keyframe {
+ value: -0.17737
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 15
+ frame: 7700
+ }
+
+ Keyframe {
+ value: 15
+ frame: 9664
+ }
+
+ Keyframe {
+ value: -0.17737
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_thumb2
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 0.14769
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -88
+ frame: 7700
+ }
+
+ Keyframe {
+ value: -88
+ frame: 9664
+ }
+
+ Keyframe {
+ value: 0.14769
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "eulerRotation.x"
+ Keyframe {
+ value: -0.10421
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 18
+ frame: 7700
+ }
+
+ Keyframe {
+ value: 18
+ frame: 9664
+ }
+
+ Keyframe {
+ value: -0.10421
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 0.23931
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -74
+ frame: 7700
+ }
+
+ Keyframe {
+ value: -74
+ frame: 9664
+ }
+
+ Keyframe {
+ value: 0.23931
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "eulerRotation.x"
+ Keyframe {
+ value: -0.03325
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 2
+ frame: 7700
+ }
+
+ Keyframe {
+ value: 2
+ frame: 9664
+ }
+
+ Keyframe {
+ value: -0.03325
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "eulerRotation.y"
+ Keyframe {
+ value: -7.87009
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -47.87009
+ frame: 7700
+ }
+
+ Keyframe {
+ value: -47.87009
+ frame: 9664
+ }
+
+ Keyframe {
+ value: -7.87009
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 0.2939
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -87
+ frame: 7700
+ }
+
+ Keyframe {
+ value: -87
+ frame: 9664
+ }
+
+ Keyframe {
+ value: 0.2939
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "eulerRotation.x"
+ Keyframe {
+ value: 0.09291
+ frame: 7422
+ }
+
+ Keyframe {
+ value: 45
+ frame: 7700
+ }
+
+ Keyframe {
+ value: 45
+ frame: 9664
+ }
+
+ Keyframe {
+ value: 0.09291
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "eulerRotation.y"
+ Keyframe {
+ value: -30.14072
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -30.14072
+ frame: 7700
+ }
+
+ Keyframe {
+ value: -30.14072
+ frame: 9664
+ }
+
+ Keyframe {
+ value: -30.14072
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 0.29378
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -94
+ frame: 7700
+ }
+
+ Keyframe {
+ value: -94
+ frame: 9664
+ }
+
+ Keyframe {
+ value: 0.29378
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "eulerRotation.y"
+ Keyframe {
+ value: -58.1828
+ frame: 7700
+ }
+
+ Keyframe {
+ value: 0
+ frame: 7422
+ }
+
+ Keyframe {
+ value: -58.1828
+ frame: 9664
+ }
+
+ Keyframe {
+ value: 0
+ frame: 9896
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "eulerRotation.x"
+ Keyframe {
+ frame: 7422
+ value: -0.10088
+ }
+
+ Keyframe {
+ frame: 7700
+ value: 25
+ }
+
+ Keyframe {
+ frame: 9664
+ value: 25
+ }
+
+ Keyframe {
+ frame: 9896
+ value: -0.10088
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "eulerRotation.y"
+ Keyframe {
+ frame: 7422
+ value: -14.99523
+ }
+
+ Keyframe {
+ frame: 7700
+ value: -80
+ }
+
+ Keyframe {
+ frame: 9664
+ value: -80
+ }
+
+ Keyframe {
+ frame: 9896
+ value: -14.99523
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "eulerRotation.z"
+ Keyframe {
+ frame: 7422
+ value: 0.20759
+ }
+
+ Keyframe {
+ frame: 7700
+ value: -79
+ }
+
+ Keyframe {
+ frame: 9664
+ value: -79
+ }
+
+ Keyframe {
+ frame: 9896
+ value: 0.20759
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "eulerRotation.x"
+ Keyframe {
+ frame: 7422
+ value: 0.64012
+ }
+
+ Keyframe {
+ frame: 7700
+ value: 71
+ }
+
+ Keyframe {
+ frame: 9664
+ value: 71
+ }
+
+ Keyframe {
+ frame: 9896
+ value: 0.64012
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "eulerRotation.y"
+ Keyframe {
+ frame: 7422
+ value: -1.55826
+ }
+
+ Keyframe {
+ frame: 7700
+ value: -12
+ }
+
+ Keyframe {
+ frame: 9664
+ value: -12
+ }
+
+ Keyframe {
+ frame: 9896
+ value: -1.55826
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "eulerRotation.z"
+ Keyframe {
+ frame: 7422
+ value: 1.28809
+ }
+
+ Keyframe {
+ frame: 7700
+ value: -31
+ }
+
+ Keyframe {
+ frame: 9664
+ value: -31
+ }
+
+ Keyframe {
+ frame: 9896
+ value: 1.28809
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "eulerRotation.x"
+ Keyframe {
+ frame: 7422
+ value: -0.29565
+ }
+
+ Keyframe {
+ frame: 7700
+ value: 62
+ }
+
+ Keyframe {
+ frame: 9664
+ value: 62
+ }
+
+ Keyframe {
+ frame: 9896
+ value: -0.29565
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "eulerRotation.y"
+ Keyframe {
+ frame: 7422
+ value: -7.64122
+ }
+
+ Keyframe {
+ frame: 7700
+ value: -21
+ }
+
+ Keyframe {
+ frame: 9664
+ value: -21
+ }
+
+ Keyframe {
+ frame: 9896
+ value: -7.64122
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "eulerRotation.z"
+ Keyframe {
+ frame: 7422
+ value: 0.01238
+ }
+
+ Keyframe {
+ frame: 7700
+ value: -46
+ }
+
+ Keyframe {
+ frame: 9664
+ value: -46
+ }
+
+ Keyframe {
+ frame: 9896
+ value: 0.01238
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "eulerRotation.x"
+ Keyframe {
+ frame: 7422
+ value: -0.28751
+ }
+
+ Keyframe {
+ frame: 7700
+ value: 6
+ }
+
+ Keyframe {
+ frame: 9664
+ value: 6
+ }
+
+ Keyframe {
+ frame: 9896
+ value: -0.28751
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "eulerRotation.y"
+ Keyframe {
+ frame: 7422
+ value: -29.49459
+ }
+
+ Keyframe {
+ frame: 7700
+ value: -47
+ }
+
+ Keyframe {
+ frame: 9664
+ value: -47
+ }
+
+ Keyframe {
+ frame: 9896
+ value: -29.49459
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "eulerRotation.z"
+ Keyframe {
+ frame: 7422
+ value: 0.11119
+ }
+
+ Keyframe {
+ frame: 7700
+ value: -74
+ }
+
+ Keyframe {
+ frame: 9664
+ value: -74
+ }
+
+ Keyframe {
+ frame: 9896
+ value: 0.11119
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget32
+ property: "weight"
+ Keyframe {
+ frame: 0
+ value: 0
+ }
+
+ Keyframe {
+ frame: 7000
+ value: 0
+ }
+
+ Keyframe {
+ frame: 7250
+ value: 1
+ }
+
+ Keyframe {
+ frame: 7500
+ value: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget33
+ property: "weight"
+ Keyframe {
+ frame: 7500
+ value: 1
+ }
+
+ Keyframe {
+ frame: 7250
+ value: 0
+ }
+
+ Keyframe {
+ frame: 0
+ value: 0
+ }
+
+ Keyframe {
+ frame: 9750
+ value: 1
+ }
+
+ Keyframe {
+ frame: 10251
+ value: 0
+ }
+ }
+ }
+
+ Timeline {
+ id: backflipTimeline
+ animations: [
+ TimelineAnimation {
+ id: backflipAnimation
+ onFinished: node.restoreDefaults()
+ running: false
+ loops: 1
+ duration: 3000
+ to: 3000
+ from: 0
+ }
+ ]
+ startFrame: 0
+ endFrame: 3000
+ enabled: false
+
+ KeyframeGroup {
+ target: base
+ property: "z"
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: -20
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.77,0,0.327,0.749,1,1]
+ value: 0
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "pivot.y"
+ Keyframe {
+ value: 10
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 5
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "y"
+ Keyframe {
+ value: 10
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 5
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "eulerRotation.x"
+ Keyframe {
+ easing.bezierCurve: [0.77,0,0.175,1,1,1]
+ value: -350
+ frame: 2000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.215,0.61,0.355,1,1,1]
+ value: 10
+ frame: 1000
+ }
+
+ Keyframe {
+ value: -360
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "y"
+ Keyframe {
+ value: -0.9
+ frame: 500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.0553,0.0385,0.0796,-0.0381,0.109,-0.0381,0.138,-0.0381,0.185,0.0276,0.222,0.00353,0.259,-0.0205,0.332,-0.25,0.385,-0.252,0.462,-0.14,0.543,1.18,0.617,1.24,0.676,1.24,0.738,1,0.778,0.977,0.817,0.953,0.855,1.02,0.889,1.03,0.924,1.03,0.951,0.964,1,1]
+ value: 0
+ frame: 1400
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.0485,0.00571,0.0592,0.0429,0.0854,0.0451,0.111,0.0473,0.115,-0.0316,0.153,-0.0316,0.191,-0.0316,0.212,0.0991,0.244,0.1,0.277,0.101,0.283,-0.0454,0.337,-0.0454,0.391,-0.0454,0.427,0.495,0.478,0.534,0.529,0.573,0.55,1.13,0.622,1.13,0.694,1.13,0.729,0.934,0.761,0.934,0.793,0.934,0.811,1.04,0.85,1.04,0.889,1.03,0.902,0.962,0.926,0.962,0.949,0.962,0.959,1,1,1]
+ value: -0.72568
+ frame: 2400
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.x"
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: -15
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: -0.18
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 21.06211
+ frame: 500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.z"
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: -88
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: -178.92
+ frame: 3000
+ }
+
+ Keyframe {
+ value: -182.90512
+ frame: 500
+ }
+
+ Keyframe {
+ value: -178.92
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "x"
+
+ Keyframe {
+ value: 1.89
+ frame: 0
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: 1.42
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 1.89
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "x"
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: -1.42
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.2,0.2,0.8,0.8,1,1]
+ value: -1.92
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.z"
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: 84
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: 185
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 185
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.x"
+ Keyframe {
+ easing.bezierCurve: [0.55,0.055,0.675,0.19,1,1]
+ value: 49
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: 10
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 10
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.y"
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: 3
+ frame: 999
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: 210
+ frame: 3001
+ }
+
+ Keyframe {
+ value: 210
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.y"
+ Keyframe {
+ value: -145
+ frame: 500
+ }
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: -15
+ frame: 1000
+ }
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: -145
+ frame: 3000
+ }
+ Keyframe {
+ value: -145
+ frame: 0
+ }
+ }
+ }
+
+ Timeline {
+ id: bouncingTimeline
+ animations: [
+ TimelineAnimation {
+ id: bouncingAnimation
+ onFinished: node.restoreDefaults()
+ running: false
+ loops: 1
+ duration: 2000
+ to: 2000
+ from: 0
+ }
+ ]
+ startFrame: 0
+ endFrame: 2000
+ enabled: false
+
+ KeyframeGroup {
+ target: loweBody
+ property: "y"
+ Keyframe {
+ easing.bezierCurve: [0.233,0.161,0.264,0.997,0.393,0.997,0.522,0.997,0.555,0.752,0.61,0.75,0.664,0.748,0.736,1,0.775,1,0.814,0.999,0.861,0.901,0.888,0.901,0.916,0.901,0.923,0.995,1,1]
+ value: -2
+ frame: 750
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.0699,0.00134,0.0845,0.0779,0.112,0.0779,0.139,0.0779,0.183,-0.00523,0.224,-0.00523,0.266,-0.00523,0.326,0.253,0.387,0.253,0.449,0.253,0.492,0.00134,0.594,-0.00304,0.696,-0.00742,0.767,0.8,1,1]
+ value: -0.73
+ frame: 1500
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "scale.x"
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: 0.7
+ frame: 750
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1500
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "scale.y"
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: 0.7
+ frame: 750
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1500
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "scale.z"
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: 0.7
+ frame: 750
+ }
+
+ Keyframe {
+ value: 0.84
+ frame: 1500
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "y"
+ Keyframe {
+ easing.bezierCurve: [0.645,0.045,0.355,1,1,1]
+ value: -1
+ frame: 750
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: 0
+ frame: 1500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "y"
+ Keyframe {
+ easing.bezierCurve: [0.455,0.03,0.515,0.955,1,1]
+ value: 0
+ frame: 750
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 1500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "y"
+ Keyframe {
+ easing.bezierCurve: [0.455,0.03,0.515,0.955,1,1]
+ value: 0
+ frame: 750
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 1500
+ }
+ }
+ }
+
+ Timeline {
+ id: rightHandWavingTimeline
+ animations: [
+ TimelineAnimation {
+ id: rightHandWavingAnimation
+ onFinished: node.restoreDefaults()
+ pingPong: false
+ running: false
+ loops: 1
+ duration: 2000
+ to: 2000
+ from: 0
+ }
+ ]
+ startFrame: 0
+ endFrame: 2000
+ enabled: false
+
+ KeyframeGroup {
+ target: hand_r
+ property: "x"
+ Keyframe {
+ value: -2.89
+ frame: 400
+ }
+
+ Keyframe {
+ value: -1.89
+ frame: 2000
+ }
+
+ Keyframe {
+ value: -2.89
+ frame: 1600
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "y"
+ Keyframe {
+ value: 1
+ frame: 400
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1600
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "z"
+ Keyframe {
+ value: 1
+ frame: 400
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1600
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.x"
+ Keyframe {
+ value: 49
+ frame: 400
+ }
+
+ Keyframe {
+ value: 10
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 49
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 9
+ frame: 700
+ }
+
+ Keyframe {
+ value: 9
+ frame: 1300
+ }
+
+ Keyframe {
+ value: 49
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 10
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.y"
+ Keyframe {
+ value: 3
+ frame: 400
+ }
+
+ Keyframe {
+ value: 210
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 3
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 210
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 84
+ frame: 400
+ }
+
+ Keyframe {
+ value: 185
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 84
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 4
+ frame: 700
+ }
+
+ Keyframe {
+ value: 4
+ frame: 1300
+ }
+
+ Keyframe {
+ value: 84
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 184
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget27
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 400
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget28
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 0
+ frame: 400
+ }
+
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget38
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0.25
+ frame: 400
+ }
+
+ Keyframe {
+ value: 0.25
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 1
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget42
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 400
+ }
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+ }
+ }
+
+ Timeline {
+ id: exitTimeline
+ animations: [
+ TimelineAnimation {
+ id: exitAnimation
+ onFinished: node.restoreDefaults()
+ running: false
+ loops: 1
+ duration: 3000
+ to: 3000
+ from: 0
+ }
+ ]
+ startFrame: 0
+ endFrame: 3000
+ enabled: false
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.x"
+ Keyframe {
+ value: -3.03
+ frame: 300
+ }
+
+ Keyframe {
+ value: -3.03
+ frame: 750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.y"
+ Keyframe {
+ value: 28
+ frame: 300
+ }
+
+ Keyframe {
+ value: 28
+ frame: 750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.z"
+ Keyframe {
+ value: -86.05
+ frame: 300
+ }
+
+ Keyframe {
+ value: -86.05
+ frame: 750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "x"
+ Keyframe {
+ value: 1.89
+ frame: 500
+ }
+
+ Keyframe {
+ value: -0.07
+ frame: 750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "y"
+ Keyframe {
+ value: 0.5
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "z"
+ Keyframe {
+ value: -0.1
+ frame: 300
+ }
+
+ Keyframe {
+ value: -0.1
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "x"
+ Keyframe {
+ value: -1.89
+ frame: 500
+ }
+
+ Keyframe {
+ value: 0.07
+ frame: 750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "y"
+ Keyframe {
+ value: 0.5
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "z"
+ Keyframe {
+ value: -0.1
+ frame: 300
+ }
+
+ Keyframe {
+ value: -0.1
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.x"
+ Keyframe {
+ value: 86
+ frame: 300
+ }
+
+ Keyframe {
+ value: 86
+ frame: 750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.y"
+ Keyframe {
+ value: -10
+ frame: 300
+ }
+
+ Keyframe {
+ value: -10
+ frame: 750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 108
+ frame: 300
+ }
+
+ Keyframe {
+ value: 108
+ frame: 750
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_thumb2
+ property: "scale.x"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_thumb2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_thumb2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "scale.x"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_index2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "scale.x"
+ Keyframe {
+ value: 0.99
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_middle2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "scale.x"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l_pinky2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "scale.x"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_thumb2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "scale.x"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_index2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "scale.x"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_middle2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "scale.x"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "scale.y"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_r_pinky2
+ property: "scale.z"
+ Keyframe {
+ value: 1
+ frame: 300
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "y"
+ Keyframe {
+ value: -0.72568
+ frame: 500
+ }
+
+ Keyframe {
+ value: -0.2
+ frame: 750
+ }
+
+ Keyframe {
+ value: 0.3
+ frame: 850
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "z"
+ Keyframe {
+ value: -0.5
+ frame: 500
+ }
+
+ Keyframe {
+ value: -0.5
+ frame: 750
+ }
+
+ Keyframe {
+ value: 0
+ frame: 850
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "z"
+ Keyframe {
+ value: -3
+ frame: 850
+ }
+
+ Keyframe {
+ value: -80
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "x"
+ Keyframe {
+ value: -2
+ frame: 850
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.215,0.61,0.355,1,1,1]
+ value: 30
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "eulerRotation.x"
+ Keyframe {
+ value: 10
+ frame: 850
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "eulerRotation.y"
+ Keyframe {
+ value: 30
+ frame: 850
+ }
+
+ Keyframe {
+ value: 130
+ frame: 1200
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "y"
+ Keyframe {
+ easing.bezierCurve: [0.316,0.525,0.744,1.42,1,1]
+ value: -1
+ frame: 850
+ }
+
+ Keyframe {
+ value: -2
+ frame: 3000
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "eulerRotation.x"
+ Keyframe {
+ value: -50
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "eulerRotation.y"
+ Keyframe {
+ value: -172
+ frame: 500
+ }
+ }
+
+ KeyframeGroup {
+ target: loweBody
+ property: "eulerRotation.z"
+ Keyframe {
+ value: 173
+ frame: 500
+ }
+ }
+ }
+
+ //! [wavingAnim]
+ Timeline {
+ id: leftHandWavingTimeline
+ animations: [
+ TimelineAnimation {
+ id: leftHandWavingAnimation
+ onFinished: node.restoreDefaults()
+ running: false
+ loops: 1
+ duration: 2000
+ to: 2000
+ from: 0
+ }
+ ]
+ startFrame: 0
+ endFrame: 2000
+ enabled: false
+
+ KeyframeGroup {
+ target: hand_l
+ property: "x"
+ Keyframe {
+ value: 2.89
+ frame: 400
+ }
+
+ Keyframe {
+ value: 2.89
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 1.89
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "y"
+ Keyframe {
+ value: 1
+ frame: 400
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 0.5
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "z"
+ Keyframe {
+ value: 1
+ frame: 400
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1600
+ }
+
+ Keyframe {
+ value: -0.1
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.x"
+ Keyframe {
+ value: -15
+ frame: 400
+ }
+
+ Keyframe {
+ value: -5
+ frame: 700
+ }
+
+ Keyframe {
+ value: -15
+ frame: 1000
+ }
+
+ Keyframe {
+ value: -5
+ frame: 1300
+ }
+
+ Keyframe {
+ value: -15
+ frame: 1600
+ }
+
+ Keyframe {
+ value: -0.18
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.y"
+ Keyframe {
+ value: -15
+ frame: 400
+ }
+
+ Keyframe {
+ value: -30
+ frame: 1600
+ }
+
+ Keyframe {
+ value: -145
+ frame: 2000
+ }
+
+ Keyframe {
+ value: -40
+ frame: 700
+ }
+ }
+
+ KeyframeGroup {
+ target: hand_l
+ property: "eulerRotation.z"
+ Keyframe {
+ value: -88
+ frame: 400
+ }
+
+ Keyframe {
+ value: -30
+ frame: 700
+ }
+
+ Keyframe {
+ value: -86.05
+ frame: 1000
+ }
+
+ Keyframe {
+ value: -30
+ frame: 1300
+ }
+
+ Keyframe {
+ value: -86.05
+ frame: 1600
+ }
+
+ Keyframe {
+ value: -178.92
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget38
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0.25
+ frame: 400
+ }
+
+ Keyframe {
+ value: 0.25
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 1
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget42
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 400
+ }
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget27
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 400
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget28
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1600
+ }
+
+ Keyframe {
+ value: 0
+ frame: 400
+ }
+
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+ }
+ }
+ //! [wavingAnim]
+
+ Timeline {
+ id: exploreTimeline
+ animations: [
+ TimelineAnimation {
+ id: exploreAnimation
+ onFinished: node.restoreDefaults()
+ running: false
+ loops: 1
+ duration: 10250
+ to: 10250
+ from: 0
+ }
+ ]
+ startFrame: 0
+ endFrame: 10250
+ enabled: false
+
+ KeyframeGroup {
+ target: base
+ property: "x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.25,0.46,0.45,0.94,1,1]
+ value: 10
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 11
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 50
+ frame: 3500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.25,0.46,0.45,0.94,1,1]
+ value: 0
+ frame: 5500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.445,0.05,0.55,0.95,1,1]
+ value: -30
+ frame: 8000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.6,-0.28,0.735,0.045,1,1]
+ value: 0
+ frame: 9700
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.6,-0.28,0.735,0.045,1,1]
+ value: 1
+ frame: 1000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.085,0.68,0.53,1,1]
+ value: 2
+ frame: 1500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.175,0.885,0.32,1.27,1,1]
+ value: 10
+ frame: 3500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.215,0.61,0.355,1,1,1]
+ value: 0
+ frame: 5500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.895,0.03,0.685,0.22,1,1]
+ value: 20
+ frame: 8000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.55,0.085,0.68,0.53,1,1]
+ value: 0
+ frame: 9700
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "z"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1500
+ }
+
+ Keyframe {
+ value: -50
+ frame: 3500
+ }
+
+ Keyframe {
+ value: -50
+ frame: 5500
+ }
+
+ Keyframe {
+ value: -70
+ frame: 8000
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.47,0,0.745,0.715,1,1]
+ value: 0
+ frame: 9700
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "eulerRotation.x"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 5
+ frame: 1000
+ }
+
+ Keyframe {
+ value: -5
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 10
+ frame: 3500
+ }
+
+ Keyframe {
+ value: 10
+ frame: 5500
+ }
+
+ Keyframe {
+ value: -10
+ frame: 8000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 9700
+ }
+ }
+
+ KeyframeGroup {
+ target: base
+ property: "eulerRotation.y"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 40
+ frame: 1000
+ }
+
+ Keyframe {
+ value: 40
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 140
+ frame: 3500
+ }
+
+ Keyframe {
+ value: 180
+ frame: 5500
+ }
+
+ Keyframe {
+ value: 270
+ frame: 4000
+ }
+
+ Keyframe {
+ value: 680
+ frame: 8000
+ }
+
+ Keyframe {
+ value: 590
+ frame: 6500
+ }
+
+ Keyframe {
+ easing.bezierCurve: [0.68,-0.55,0.265,1.55,1,1]
+ value: 720
+ frame: 9700
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget38
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 9700
+ }
+
+ Keyframe {
+ value: 1
+ frame: 10250
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget39
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 10250
+ }
+
+ Keyframe {
+ value: 1
+ frame: 9700
+ }
+
+ Keyframe {
+ value: 1
+ frame: 500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget28
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 10250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 9700
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget27
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 9700
+ }
+
+ Keyframe {
+ value: 0
+ frame: 10250
+ }
+ }
+ }
+
+ Timeline {
+ id: faceTimeline
+ animations: [
+ TimelineAnimation {
+ id: faceAnimation
+ onFinished: node.restoreDefaults()
+ running: false
+ loops: 1
+ duration: 5000
+ to: 5000
+ from: 0
+ }
+ ]
+ startFrame: 0
+ endFrame: 5000
+ enabled: false
+
+ KeyframeGroup {
+ target: morphTarget27
+ property: "weight"
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 250
+ }
+
+ Keyframe {
+ value: 1
+ frame: 500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1750
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget28
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1750
+ }
+
+ Keyframe {
+ value: 1
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4750
+ }
+
+ Keyframe {
+ value: 1
+ frame: 5000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget38
+ property: "weight"
+
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0.25
+ frame: 500
+ }
+
+ Keyframe {
+ value: 0.25
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 5000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget42
+ property: "weight"
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 500
+ }
+
+ Keyframe {
+ value: 0.75
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget32
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1750
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 3250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 4750
+ }
+
+ Keyframe {
+ value: 0
+ frame: 5000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget22
+ property: "weight"
+ Keyframe {
+ value: 1
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1750
+ }
+
+ Keyframe {
+ value: 1
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4750
+ }
+
+ Keyframe {
+ value: 1
+ frame: 5000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget
+ property: "weight"
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 250
+ }
+
+ Keyframe {
+ value: 1
+ frame: 500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1750
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget21
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 1
+ frame: 250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 1500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 1750
+ }
+
+ Keyframe {
+ value: 0
+ frame: 2000
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 3250
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 4750
+ }
+
+ Keyframe {
+ value: 0
+ frame: 5000
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget34
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3250
+ }
+
+ Keyframe {
+ value: 1
+ frame: 3500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 4500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4750
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget23
+ property: "weight"
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3250
+ }
+
+ Keyframe {
+ value: 1
+ frame: 3500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 4500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 4750
+ }
+ }
+
+ KeyframeGroup {
+ target: morphTarget40
+ property: "weight"
+
+ Keyframe {
+ value: 0
+ frame: 0
+ }
+
+ Keyframe {
+ value: 0
+ frame: 3000
+ }
+
+ Keyframe {
+ value: 1
+ frame: 3500
+ }
+
+ Keyframe {
+ value: 1
+ frame: 4500
+ }
+
+ Keyframe {
+ value: 0
+ frame: 5000
+ }
+ }
+ }
+
+ states: [
+ State {
+ name: "EntryAnimation"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.ENTRY
+
+ PropertyChanges {
+ target: entryTimeline
+ enabled: true
+ }
+
+ PropertyChanges {
+ target: entryAnimation
+ running: true
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ },
+ State {
+ name: "Backflip"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.BACKFLIP
+
+ PropertyChanges {
+ target: backflipTimeline
+ enabled: true
+ }
+
+ PropertyChanges {
+ target: backflipAnimation
+ running: true
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ },
+ State {
+ name: "LowBodyBouncing"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.BOUNCING
+
+ PropertyChanges {
+ target: bouncingTimeline
+ enabled: true
+ }
+
+ PropertyChanges {
+ target: bouncingAnimation
+ running: true
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ },
+ State {
+ name: "Right hand waving"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.RIGHTHAND
+
+ PropertyChanges {
+ target: rightHandWavingTimeline
+ enabled: true
+ }
+
+ PropertyChanges {
+ target: rightHandWavingAnimation
+ running: true
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ },
+ State {
+ name: "Left hand waving"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.LEFTHAND
+
+ PropertyChanges {
+ target: leftHandWavingTimeline
+ enabled: true
+ }
+
+ PropertyChanges {
+ target: leftHandWavingAnimation
+ running: true
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ },
+ State {
+ name: "Explore Scene"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.EXPLORE
+
+ PropertyChanges {
+ target: exploreTimeline
+ enabled: true
+ }
+
+ PropertyChanges {
+ target: exploreAnimation
+ running: true
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ },
+ State {
+ name: "Exit Animation"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.EXIT
+
+ PropertyChanges {
+ target: exitTimeline
+ enabled: true
+ }
+
+ PropertyChanges {
+ target: exitAnimation
+ running: true
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ },
+ State {
+ name: "FaceAnim"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.FACE
+
+ PropertyChanges {
+ target: faceTimeline
+ enabled: true
+ }
+
+ PropertyChanges {
+ target: faceAnimation
+ running: true
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ },
+ State {
+ name: "HeartAnimation"
+ when: node.currentAnim === VirtualAssistant.ANIMATION.HEART
+
+ PropertyChanges {
+ target: heart.heartAnimation
+ loops: 4
+ }
+
+ PropertyChanges {
+ target: heart.heartTimeline
+ enabled: true
+ }
+ }]
+}
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/body.mesh b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/body.mesh
new file mode 100644
index 00000000..864bcab7
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/body.mesh
Binary files differ
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_107.mesh b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_107.mesh
new file mode 100644
index 00000000..655c1a36
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_107.mesh
Binary files differ
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_108.mesh b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_108.mesh
new file mode 100644
index 00000000..136cfe67
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_108.mesh
Binary files differ
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_109.mesh b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_109.mesh
new file mode 100644
index 00000000..57e9222a
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/meshes/mesh_109.mesh
Binary files differ
diff --git a/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/qmldir b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/qmldir
new file mode 100644
index 00000000..b2583871
--- /dev/null
+++ b/examples/quick3d/virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/qmldir
@@ -0,0 +1,2 @@
+module Quick3DAssets.VirtualAssistant
+VirtualAssistant 1.0 VirtualAssistant.qml
diff --git a/examples/quick3d/virtualassistant/content/App.qml b/examples/quick3d/virtualassistant/content/App.qml
new file mode 100644
index 00000000..c96e6864
--- /dev/null
+++ b/examples/quick3d/virtualassistant/content/App.qml
@@ -0,0 +1,19 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import VirtualAssistant.Constants
+
+Window {
+ minimumWidth: Constants.width
+ minimumHeight: Constants.height
+
+ visible: true
+ title: "Qt Robot Assistant"
+
+ Screen01 {
+ id: mainScreen
+
+ anchors.fill: parent
+ }
+}
diff --git a/examples/quick3d/virtualassistant/content/CMakeLists.txt b/examples/quick3d/virtualassistant/content/CMakeLists.txt
new file mode 100644
index 00000000..c5cdc348
--- /dev/null
+++ b/examples/quick3d/virtualassistant/content/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+qt_add_library(content STATIC)
+
+qt_add_qml_module(content
+ URI "content"
+ VERSION 1.0
+ QML_FILES
+ App.qml
+ ControlPanel.qml
+ Screen01.ui.qml
+ SettingsPanel.qml
+ RESOURCES
+ colosseum_4k.hdr
+)
diff --git a/examples/quick3d/virtualassistant/content/ControlPanel.qml b/examples/quick3d/virtualassistant/content/ControlPanel.qml
new file mode 100644
index 00000000..cb68d2fa
--- /dev/null
+++ b/examples/quick3d/virtualassistant/content/ControlPanel.qml
@@ -0,0 +1,47 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+
+Pane {
+ id: root
+
+ topPadding: 10
+ leftPadding: 40
+ rightPadding: 40
+ bottomPadding: 40
+
+ readonly property list<string> animations: [qsTr("Entry Animation"), qsTr("Backflip"),
+ qsTr("Low Body Bouncing"), qsTr("Right hand waving"),
+ qsTr("Left hand waving"), qsTr("Exploring scene"),
+ qsTr("Exit Animation"), qsTr("Face Animation")]
+
+ signal clicked(index: int)
+
+ ColumnLayout {
+ anchors.fill: parent
+ spacing: 10
+
+ Label {
+ text: qsTr("Select animation:")
+ font.pixelSize: 24
+ Layout.alignment: Qt.AlignHCenter
+ }
+
+ Repeater {
+ model: root.animations
+ Button {
+ required property int index
+ required property string modelData
+
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ text: modelData
+ onClicked: root.clicked(index)
+ }
+ }
+ }
+}
diff --git a/examples/quick3d/virtualassistant/content/Screen01.ui.qml b/examples/quick3d/virtualassistant/content/Screen01.ui.qml
new file mode 100644
index 00000000..7e69f1d0
--- /dev/null
+++ b/examples/quick3d/virtualassistant/content/Screen01.ui.qml
@@ -0,0 +1,125 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick3D
+import QtQuick.Layouts
+import QtQuick3D.Helpers
+import VirtualAssistant.Constants
+import Quick3DAssets.VirtualAssistant
+
+Rectangle {
+ width: Constants.width
+ height: Constants.height
+
+ View3D {
+ id: view3D
+ anchors.fill: parent
+
+ environment: ExtendedSceneEnvironment {
+ backgroundMode: SceneEnvironment.SkyBox
+ lightProbe: Texture { source: Constants.sceneName }
+ antialiasingMode: SceneEnvironment.MSAA
+ antialiasingQuality: SceneEnvironment.VeryHigh
+ fxaaEnabled: true
+ probeExposure: 0.6
+ probeOrientation: Qt.vector3d(0, settingsPanel.skyboxRotation, 0)
+ specularAAEnabled: true
+ tonemapMode: SceneEnvironment.TonemapModeLinear
+ vignetteEnabled: true
+ vignetteRadius: 0.15
+ }
+
+ Node {
+ id: scene
+
+ VirtualAssistant {
+ id: virtualAssistant
+ }
+ }
+
+ Node {
+ id: cameraNode
+ PerspectiveCamera {
+ id: sceneCamera
+ y: 5
+ z: 15
+ fieldOfView: settingsPanel.cameraFov
+ clipNear: 1.0
+ }
+ }
+
+ OrbitCameraController {
+ anchors.fill: parent
+ origin: cameraNode
+ camera: sceneCamera
+ enabled: settingsPanel.cameraControllerEnabled
+ }
+
+ MouseArea {
+ anchors.fill: parent
+
+ Connections {
+ function onClicked(mouse) {
+ var result = view3D.pick(mouse.x, mouse.y);
+
+ if (!result.objectHit)
+ return
+
+ virtualAssistant.animateObject(result.objectHit.objectName)
+ }
+ }
+ }
+ }
+
+ Item {
+ id: __materialLibrary__
+ DefaultMaterial {
+ id: defaultMaterial
+ objectName: "Default Material"
+ diffuseColor: "#4aee45"
+ }
+ }
+
+ TabBar {
+ id: bar
+ anchors.left: parent.left
+ anchors.top: parent.top
+ width: 300
+
+ TabButton {
+ text: qsTr("Animations")
+ }
+ TabButton {
+ text: qsTr("Settings")
+ }
+ }
+
+ StackLayout {
+ anchors.top: bar.bottom
+ anchors.bottom: parent.bottom
+ width: bar.width
+
+ currentIndex: bar.currentIndex
+
+ ControlPanel {
+ id: controlPanel
+
+ Connections {
+ target: controlPanel
+ function onClicked(index: int) {
+ virtualAssistant.runAnimation(index);
+ }
+ }
+ }
+
+ SettingsPanel {
+ id: settingsPanel
+
+ camera: sceneCamera
+ }
+ }
+}
+
+
diff --git a/examples/quick3d/virtualassistant/content/SettingsPanel.qml b/examples/quick3d/virtualassistant/content/SettingsPanel.qml
new file mode 100644
index 00000000..2438eb46
--- /dev/null
+++ b/examples/quick3d/virtualassistant/content/SettingsPanel.qml
@@ -0,0 +1,121 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
+import VirtualAssistant.Constants
+
+Pane {
+ id: root
+
+ topPadding: 10
+ leftPadding: 40
+ rightPadding: 40
+ bottomPadding: 40
+
+ required property var camera
+
+ property alias cameraControllerEnabled: enableCamera.checked
+ property alias cameraFov: fov.value
+ property alias skyboxRotation: skyboxRot.value
+
+ ColumnLayout {
+ anchors.fill: parent
+ spacing: 10
+
+ Label {
+ text: qsTr("Scene settings")
+ font.pixelSize: 24
+ Layout.alignment: Qt.AlignHCenter
+ }
+
+ CheckBox {
+ id: enableCamera
+
+ Layout.alignment: Qt.AlignHCenter
+ text: qsTr("Enable Camera Controller")
+ }
+
+ ColumnLayout {
+ Layout.alignment: Qt.AlignHCenter
+ spacing: 5
+
+ Label {
+ Layout.alignment: Qt.AlignHCenter
+ text: qsTr("Camera Fov: ") + fov.value
+ font.pixelSize: 14
+ }
+
+ Slider {
+ id: fov
+
+ from: 35
+ to: 125
+ value: 80
+ stepSize: 1
+ }
+ }
+
+ ColumnLayout {
+ Layout.alignment: Qt.AlignHCenter
+ spacing: 5
+
+ Label {
+ Layout.alignment: Qt.AlignHCenter
+ text: qsTr("Skybox rotation: ") + skyboxRot.value
+ font.pixelSize: 14
+ }
+
+ Slider {
+ id: skyboxRot
+
+ from: 0
+ to: 360
+ value: 180
+ stepSize: 1
+ }
+ }
+
+ ColumnLayout {
+ spacing: 4
+ Layout.alignment: Qt.AlignHCenter
+
+ Label {
+ Layout.alignment: Qt.AlignHCenter
+ text: qsTr("Camera position: ")
+ }
+
+ Row {
+ Layout.alignment: Qt.AlignHCenter
+ spacing: 5
+ Label {
+ text: "x: " + root.camera.x.toFixed(2)
+ }
+ Label {
+ text: "y: " + root.camera.y.toFixed(2)
+ }
+ Label {
+ text: "z: " + root.camera.z.toFixed(2)
+ }
+ }
+ }
+
+ Button {
+ Layout.alignment: Qt.AlignHCenter
+
+ text: qsTr("Reset default settings")
+ onClicked: {
+ fov.value = Constants.defaultFov;
+ enableCamera.checked = false;
+ skyboxRot.value = Constants.defaultRotation;
+ root.camera.position = Constants.defaultCameraPosition
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ }
+ }
+}
diff --git a/examples/quick3d/virtualassistant/content/colosseum_4k.hdr b/examples/quick3d/virtualassistant/content/colosseum_4k.hdr
new file mode 100644
index 00000000..4ffbbb61
--- /dev/null
+++ b/examples/quick3d/virtualassistant/content/colosseum_4k.hdr
Binary files differ
diff --git a/examples/quick3d/virtualassistant/doc/images/VirtualAssistantHome.png b/examples/quick3d/virtualassistant/doc/images/VirtualAssistantHome.png
new file mode 100644
index 00000000..444a35e3
--- /dev/null
+++ b/examples/quick3d/virtualassistant/doc/images/VirtualAssistantHome.png
Binary files differ
diff --git a/examples/quick3d/virtualassistant/doc/src/virtualassistant.qdoc b/examples/quick3d/virtualassistant/doc/src/virtualassistant.qdoc
new file mode 100644
index 00000000..94a5905a
--- /dev/null
+++ b/examples/quick3d/virtualassistant/doc/src/virtualassistant.qdoc
@@ -0,0 +1,51 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+/*!
+ \title Qt Quick 3D - Virtual Assistant Example
+ \ingroup quick3d-examples
+ \example virtualassistant
+ \examplecategory {3D}
+ \brief Qt Quick application that presents a 3D model of a virtual assistant with dynamic animations created using QML and timelines.
+ \meta {tag} {quick,quick3D}
+
+ \image VirtualAssistantHome.png
+
+ \e{Virtual Assistant Example} demonstrates how to bring a 3D model of a virtual assistant to life through timeline animations, increasing user engagement and interaction. The example can be run and edited in both QtDesignStudio and QtCreator.
+
+ \section1 Importing 3D Model
+ To load the model in QtDesingStudio it is enough to import the .gltf file to the project. QtDesignStudio automatically create a qml file that represents the object and it wil also generate necessary assets. Without QtDesignStudio you need to use \l balsam tool, and run it manually. In this example the generated qml file was modified to introduce the states, animations and some additional invicible models that allows to pick specific parts of the Virtual Assistant.
+
+ \section1 Preparing \l {SceneEnvironment} Scene Environment
+ Scene use HDR images to create a skybox and to provide natural lighthing.
+
+\quotefromfile virtualassistant/content/Screen01.ui.qml
+ \skipto environment
+ \printuntil vignetteRadius
+ \printuntil }
+
+ \section1 Camera Options
+ Camera properties can be changed from the \c SettingsPanel. You can manipulate the camera FOV, skybox rotation using sliders. The checkbox enable the \l OrbitCameraController that allows to change camera position, rotation etc. using mouse and keyboards buttons.
+
+ \section1 Animations
+ The animations are created using multiple \l {Timeline} timelines and \l {Keyframe} keyframes. Each \l {Timeline} Timeline is connected with different state of the \c VirtualAssistant. The animations starts playing immadiately when the state change. At the end of each animation the object returns to the default state and restore the default values like position and rotation of the model \l {Node} {nodes}. The animations change the properties values of the nodes in our skeleton and also modify the weight of different \l {MorphTarget} {morph targets} to animate the face elements (eyes, mouth).
+
+To run the animation you can use the button on ControlPanel on the left side of the scene or you can also click on specific model elements like hands, lower body and face to activate animation related to that part of the model.
+
+ \section2 \l Skeleton animations
+ \list
+ \li Entry animation
+ \li Exit animation
+ \li Explore scene animation
+ \li Backflip animation
+ \li Bouncing animation
+ \li Right and Left hand waving animation
+ \endlist
+ \section2 Morph Target animations
+ \list
+ \li Face animations (Happy and Sad)
+ \endlist
+
+ Sample implementation of waving animation on the model's left hand:
+ \snippet virtualassistant/asset_imports/Quick3DAssets/VirtualAssistant/VirtualAssistant.qml wavingAnim
+*/
diff --git a/examples/quick3d/virtualassistant/imports/CMakeLists.txt b/examples/quick3d/virtualassistant/imports/CMakeLists.txt
new file mode 100644
index 00000000..459382f4
--- /dev/null
+++ b/examples/quick3d/virtualassistant/imports/CMakeLists.txt
@@ -0,0 +1,4 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+add_subdirectory(Constants)
diff --git a/examples/quick3d/virtualassistant/imports/Constants/CMakeLists.txt b/examples/quick3d/virtualassistant/imports/Constants/CMakeLists.txt
new file mode 100644
index 00000000..bf73a134
--- /dev/null
+++ b/examples/quick3d/virtualassistant/imports/Constants/CMakeLists.txt
@@ -0,0 +1,17 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+set_source_files_properties(Constants.qml
+ PROPERTIES
+ QT_QML_SINGLETON_TYPE true
+)
+
+qt_add_library(Constants STATIC)
+qt_add_qml_module(Constants
+ URI "VirtualAssistant.Constants"
+ VERSION 1.0
+ RESOURCE_PREFIX "/qt/qml"
+ QML_FILES
+ Constants.qml
+
+)
diff --git a/examples/quick3d/virtualassistant/imports/Constants/Constants.qml b/examples/quick3d/virtualassistant/imports/Constants/Constants.qml
new file mode 100644
index 00000000..d34d685d
--- /dev/null
+++ b/examples/quick3d/virtualassistant/imports/Constants/Constants.qml
@@ -0,0 +1,15 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+pragma Singleton
+import QtQuick
+
+QtObject {
+ readonly property int width: 1280
+ readonly property int height: 720
+
+ readonly property vector3d defaultCameraPosition: Qt.vector3d(0, 5, 15)
+ readonly property int defaultFov: 80
+ readonly property int defaultRotation: 180
+ readonly property string sceneName: "colosseum_4k.hdr"
+}
diff --git a/examples/quick3d/virtualassistant/imports/Constants/designer/plugin.metainfo b/examples/quick3d/virtualassistant/imports/Constants/designer/plugin.metainfo
new file mode 100644
index 00000000..c08d2c57
--- /dev/null
+++ b/examples/quick3d/virtualassistant/imports/Constants/designer/plugin.metainfo
@@ -0,0 +1,13 @@
+MetaInfo {
+ Type {
+ name: "VirtualAssistant.EventListSimulator"
+ icon: ":/qtquickplugin/images/item-icon16.png"
+
+ Hints {
+ visibleInNavigator: true
+ canBeDroppedInNavigator: true
+ canBeDroppedInFormEditor: false
+ canBeDroppedInView3D: false
+ }
+ }
+}
diff --git a/examples/quick3d/virtualassistant/imports/Constants/qmldir b/examples/quick3d/virtualassistant/imports/Constants/qmldir
new file mode 100644
index 00000000..06a17ab6
--- /dev/null
+++ b/examples/quick3d/virtualassistant/imports/Constants/qmldir
@@ -0,0 +1,3 @@
+Module VirtualAssistant
+singleton Constants 1.0 Constants.qml
+
diff --git a/examples/quick3d/virtualassistant/qmlmodules b/examples/quick3d/virtualassistant/qmlmodules
new file mode 100644
index 00000000..7ac51675
--- /dev/null
+++ b/examples/quick3d/virtualassistant/qmlmodules
@@ -0,0 +1,21 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+qt6_add_qml_module(QtVirtualAssistant
+ URI "Main"
+ VERSION 1.0
+ RESOURCE_PREFIX "/qt/qml"
+ NO_PLUGIN
+ QML_FILES Main.qml
+)
+
+add_subdirectory(content)
+add_subdirectory(imports)
+add_subdirectory(asset_imports)
+
+target_link_libraries(QtVirtualAssistant PRIVATE
+ contentplugin
+ Constantsplugin
+ VirtualAssistantplugin
+ RobotHeartplugin
+)
diff --git a/examples/quick3d/virtualassistant/qt_attribution.json b/examples/quick3d/virtualassistant/qt_attribution.json
new file mode 100644
index 00000000..ce4792ed
--- /dev/null
+++ b/examples/quick3d/virtualassistant/qt_attribution.json
@@ -0,0 +1,11 @@
+{
+"Id": "virtualassistantexample-skyboxes",
+"Name": "HDRI Images",
+"QDocModule": "qtdoc",
+"QtUsage": "Used in the Virtual Assistant example.",
+"QtParts": [ "examples" ],
+
+"LicenseId": "CC0-1.0",
+"License": "Creative Commons Zero v1.0 Universal",
+"DownloadLocation": "https://polyhaven.com"
+}
diff --git a/examples/quick3d/virtualassistant/qtquickcontrols2.conf b/examples/quick3d/virtualassistant/qtquickcontrols2.conf
new file mode 100644
index 00000000..6750f4f4
--- /dev/null
+++ b/examples/quick3d/virtualassistant/qtquickcontrols2.conf
@@ -0,0 +1,8 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+[Controls]
+Style=Material
+
+[Material]
+Theme=Dark
diff --git a/examples/quick3d/virtualassistant/src/main.cpp b/examples/quick3d/virtualassistant/src/main.cpp
new file mode 100644
index 00000000..06060edd
--- /dev/null
+++ b/examples/quick3d/virtualassistant/src/main.cpp
@@ -0,0 +1,17 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QQmlApplicationEngine engine;
+ QObject::connect(&engine, &QQmlApplicationEngine::quit, &app, &QGuiApplication::quit);
+
+ engine.loadFromModule("Main", "Main");
+
+ return app.exec();
+}