summaryrefslogtreecommitdiffstats
path: root/src/doc
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2017-04-12 10:03:31 +0100
committerSean Harmer <sean.harmer@kdab.com>2017-04-13 07:21:05 +0000
commit7e90ca1f888efdf7a4fb4e720b81337f88ff8877 (patch)
treef454e0331e1c460d9ce46f99121e7895a46c05fb /src/doc
parentc7eea417418b0d502b8a4acf9ddfc6d01ff29226 (diff)
Flesh out animation module overview documentation
Change-Id: If5f3788325cd96845151c0f41c3ffc890edbeab6 Reviewed-by: Andreas Holzammer <andreas.holzammer@kdab.com>
Diffstat (limited to 'src/doc')
-rw-r--r--src/doc/src/qt3danimation-module.qdoc140
1 files changed, 136 insertions, 4 deletions
diff --git a/src/doc/src/qt3danimation-module.qdoc b/src/doc/src/qt3danimation-module.qdoc
index 294edb0e7..0601a8973 100644
--- a/src/doc/src/qt3danimation-module.qdoc
+++ b/src/doc/src/qt3danimation-module.qdoc
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
@@ -53,18 +54,149 @@
\section1 Overview
- \section2 Animations
+ The Qt 3D Animation module adds support for specifying and using animations
+ that can be applied to the properties of objects in your simulation.
+ Initially this module supports key frame based animations. That is,
+ properties have values 'keyed' at certain times and when played back the
+ property values are calculated by interpolating between the known values
+ within the key frames. All of the animation evaluation within the Qt 3D
+ Animation module takes place on the Qt 3D threadpool. This allows the
+ animations to run smoothly and to scale up to high throughput.
+
+ \section2 Animation Data
+
+ Key frame animation data can either be created programmatically via the Qt
+ 3D Animation APIs such as Qt3DAnimation::QKeyFrameData or it can come from
+ digital content creation (DCC) tools such as Blender, Maya or 3D Studio
+ Max. Qt 3D provides an example export script for animation data for
+ Blender. The format consumed by Qt 3D Animation at present is a simple JSON
+ based format. This allows both developers and artists to easily work with
+ animation data. More formats optimised for runtime consumption will be
+ added later.
+
+ The key frame animation data can be loaded from file using the
+ Qt3DAnimation::QAnimationClipLoader class. To specify animation data
+ programmatically use the Qt3DAnimation::QAnimationClip class.
+
+ By default, the key frame data is specified using cubic bezier curves. This
+ allows smooth animations to be created from a small number of key frame
+ data points. Other interpolation types will be added later.
+
+ \section2 Playing Animations
+
+ In addition to the animation data containing the key frames, Qt 3D
+ Animation also provides APIs for playing the animations and mapping the
+ resulting property values onto properties of objects in your simulation.
+ There are currently two ways of playing the animations:
\list
- \li Qt3DAnimation::QKeyframeAnimation
+ \li Qt3DAnimation::QClipAnimator
+ \li Qt3DAnimation::QBlendedClipAnimator
\endlist
- \section2 Clip animations
+ Both of these are implemented as subclasses of Qt3DCore::QComponent meaning
+ that objects of these types can be aggregated by Qt3DCore::QEntity objects
+ to add animation capabilities to your simulated entities.
+
+ \section2 Simple Animation Playback
+
+ The Qt3DAnimation::QClipAnimator class allows the playback of a single
+ Qt3DAnimation::QAbstractAnimationClip at a time. To add an animation to an
+ entity, simply add an instance of the Qt3DAnimation::QClipAnimator class to
+ your entity's \c components property.
+
+ The Qt 3D Animation module takes a slightly different approach to
+ QPropertyAnimation and AbstractAnimation. With those animation frameworks,
+ the animation specifies both the animation values \e {and} the target
+ objects and properties. The animation components in Qt 3D separate these
+ two orthogonal concepts. For example, the Qt3DAnimation::QClipAnimator
+ component has a \c clip property for specifying the animation data
+ (Qt3DAnimation::QAnimationClip or Qt3DAnimation::QAnimationClipLoader).
+
+ This allows calculation of the animated values, but more information is
+ needed in order to map these values onto properties of objects. This is
+ accomplished with the a Qt3DAnimation::QChannelMapper which contains a list
+ of Qt3DAnimation::QChannelMapping objects. A Qt3DAnimation::QChannelMapping
+ is used to map a specific channel from an animation clip onto a named
+ property of a target object. By separating the animation data and property
+ mappings like this, the same animation can be applied to many objects
+ without needing to have multiple copies of the animation data or objects.
+ It also allows animation data to easily be retargeted to other objects.
+
+ \section2 Blended Animation Playback
+
+ The Qt3DAnimation::QBlendedClipAnimator component allows to go beyond what
+ is possible with Qt3DAnimation::QClipAnimator by blending several animation
+ clips together before applying the property changes to the target
+ properties. The animator component still takes a channel mapper just like
+ the standard Qt3DAnimation::QClipAnimator component. However, instead of
+ specifying a single animation clip, it is necessary to set the \c blendTree
+ property to point to the root node of a \e {blend tree}.
+
+ A blend tree is a data structure representing how animation clips get
+ aggregated or blended together as the function of properties on the blend
+ tree nodes. The currently supported set of blend tree nodes are:
\list
- \li Qt3DAnimation::QAnimationClip
+ \li Qt3DAnimation::QClipBlendValue
+ \li Qt3DAnimation::QLerpClipBlend
+ \li Qt3DAnimation::QAdditiveClipBlend
\endlist
+ The source animation clip inputs are specified as leaf nodes in the blend
+ tree using instances of the Qt3DAnimation::QClipBlendValue class. These
+ animation clips can be combined in a large number of ways. For now the Qt3D
+ Animation module provides linear interpolation (LERP) and additive blend
+ operations. More blend node types will be added over time. These are
+ expected to include at least a generalised LERP node and a barycentric LERP
+ node.
+
+ As an example consider the following blend tree:
+
+ \badcode
+ Clip0----
+ |
+ Lerp Node----
+ | |
+ Clip1---- Additive Node
+ |
+ Clip2----
+ \endcode
+
+ Let's assume that \c Clip0 represents a walk animation cycle with a
+ duration of 3 seconds and that \c Clip1 is a run animation cycle with a
+ duration of 2 seconds. These are both inputs (and dependencies) of the \c
+ Lerp blend node. The result of evaluating the \c Lerp node depends upon the
+ \c blendFactor property of the \c Lerp node. This could be bound to the
+ speed of a humanoid character entity for example. As the speed of the
+ character increases the animation gradually cross-fades from the walk
+ animation in \c Clip0 to the run animation in \c Clip1.
+
+ Furthermore, let's assume that \c Clip2 represents some variation animation
+ that can be added on (waving arms or shaking head for e.g.). The amount of
+ this additive clip that is added can be controlled by the \c additiveFactor
+ property on the \c Additive blend node.
+
+ When evaluating a blend tree, normalized time (or phase) is used so that
+ clips of different durations can be blended together without problems. For
+ example, even though the walk and run animation clips are of different
+ lengths, as long as they are created by the animator such that the
+ foot-falls line up at the same phase these can be nicely interpolated.
+
+ The implication of this is that the duration of the blended clip is
+ actually a function of the blend factors of the nodes in the tree.
+ Considering only the \c Lerp node in the above example, when the blend
+ factor of the \c Lerp node is 0, only the walk animation in Clip0 is used
+ resulting in a duration of 3 seconds. With a blend factor of 1 the
+ resulting duration will be 2 seconds. For intermediate blend factors, the
+ duration will be linearly interpolated between 3 and 2 seconds.
+
+ By definining your own blend trees, you have complete control over how to
+ combine your collection of input animation clips. The blend tree can be
+ configured by the properties on the blend nodes. Note also that the
+ properties on the blend nodes themselves are just standard properties, so
+ these could in turn be driven by other animations if desired.
+
\section1 Reference
\list
\li \l {Qt 3D Animation C++ Classes}