载入中...
搜索中...
未找到
MotionDatabase.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
5#include "common/Result.h"
6
7#include <string>
8#include <memory>
9#include <vector>
10#include <span>
11#include <cstddef>
12
13namespace eve::animation {
14
15class AnimClip;
16class AnimSkeleton;
17class MotionMatcher;
18struct MotionFeatureLayout;
19namespace detail { struct MotionSchemaState; }
20
23 int clipIndex = 0;
24 float start = 0.f;
25 float end = 0.f;
26};
27
40public:
42 explicit MotionDatabase(AnimSkeleton* skeleton);
45
48
50 AnimSkeleton* getSkeleton() const { return skeleton_; }
51
53 void addFeatureBone(int boneIndex);
55 void addFeatureBoneByName(const std::string& name);
56
69 [[nodiscard]] eve::Result<void> setLocomotionFeatures(int leftFoot, int rightFoot, int pelvis);
71 bool hasLocomotionFeatures() const { return locomotionFeatures_; }
72
82 [[nodiscard]] eve::Result<void> setFeatureLayout(const MotionFeatureLayout& layout);
84 bool hasFeatureLayout() const;
94 [[nodiscard]] eve::Result<void> setFeatureCurves(std::span<const std::byte> bytes,
95 std::span<const std::string> sources);
108 [[nodiscard]] eve::Result<int> setFeatureNormalizationRanges(std::span<const MotionNormalizationRange> ranges);
109
114 void setRootBone(int boneIndex);
116 int getRootBone() const { return rootBone_; }
118 void setRootBoneByName(const std::string& name);
119
121 void addClip(AnimClip* clip);
123 int getClipCount() const { return static_cast<int>(clips_.size()); }
124
133 void bake();
135 bool isBaked() const { return baked_; }
136
138 int getFrameCount() const { return static_cast<int>(frames_.size()); }
140 int getFeatureSize() const { return featureSize_; }
141
143 float getFrameTime(int frameIndex) const;
145 int getFrameClipIndex(int frameIndex) const;
147 AnimClip* getClip(int clipIndex) const;
148
150 int getFeatureBoneCount() const { return static_cast<int>(featureBones_.size()); }
152 int getFeatureBone(int index) const;
153
155 void getFeature(int frameIndex, float* out, int outCount) const;
157 void normalizeFeature(std::vector<float>& feature) const;
158
160 struct Frame {
161 int clipIndex = 0;
162 float time = 0.f;
163 std::vector<float> feature;
164 // Cached root for trajectory reconstruction helpers.
165 float rootX = 0.f, rootZ = 0.f, rootYaw = 0.f;
166 float velX = 0.f, velZ = 0.f;
167 // Sum of unnormalized trajectory-velocity channel magnitudes, retained
168 // before feature normalization for UE-compatible play-rate estimation.
169 float trajectorySpeed = 0.f;
170 };
171
172 const Frame& frameAt(int index) const;
173
174private:
175 struct SchemaSampler;
176 friend class MotionMatcher;
177 float schemaTrajectorySpeed(std::span<const float> feature) const;
178 void extractSchemaFeature(AnimClip* clip, float time, std::vector<float>& out, float& rootX,
179 float& rootZ, float& rootYaw, float& velX, float& velZ) const;
180 void normalizeSchemaFeatures();
181 void extractLocomotionFeature(AnimClip* clip, float time, std::vector<float>& out, float& rootX, float& rootZ,
182 float& rootYaw, float& velX, float& velZ) const;
183 void normalizeLocomotionFeatures();
184 void requireBaked() const;
185 void computeFeatureSize();
186 void extractFeature(AnimClip* clip, float time, float dtSample, std::vector<float>& out, float& rootX, float& rootZ,
187 float& rootYaw, float& velX, float& velZ) const;
188 static float yawFromQuat(float x, float y, float z, float w);
189
190 AnimSkeleton* skeleton_ = nullptr;
191 std::vector<AnimClip*> clips_;
192 std::vector<int> featureBones_;
193 std::vector<Frame> frames_;
194 // Contiguous baked-frame span for each clip; size is clips_.size() + 1.
195 std::vector<int> clipFrameOffsets_;
196 int featureSize_ = 0;
197 int rootBone_ = 0;
198 bool baked_ = false;
199 bool locomotionFeatures_ = false;
200 std::vector<float> featureMean_;
201 std::vector<float> featureInvStd_;
202 mutable AnimPose scratchPose_;
203 std::unique_ptr<detail::MotionSchemaState> schema_;
204 std::vector<MotionNormalizationRange> normalizationRanges_;
205};
206
207} // namespace eve::animation
float w
Definition AnimClip.cpp:738
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
#define EVENGINE_API_WORLD
Definition Export.h:109
std::string layout
glm::vec4 clip
std::uint64_t bytes
std::string name
int detail
Move-only, checked operation results for the common layer.
uint32_t index
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Keyframed skeletal animation clip (local TRS tracks per bone). Script type: AnimClip.
Definition AnimClip.h:145
Evaluated local (and optional world) pose for an AnimSkeleton. Script type: AnimPose.
Definition AnimPose.h:17
3D bone hierarchy + bind-pose local TRS for skeletal animation. Independent of ik::Skeleton3D (FABRIK...
Baked motion-matching feature database from one or more AnimClips. Feature layout per frame: [0....
MotionDatabase(const MotionDatabase &)=delete
AnimSkeleton * getSkeleton() const
Returns the skeleton.
bool isBaked() const
True when baked.
int getFeatureBoneCount() const
Returns the feature bone count.
MotionDatabase & operator=(const MotionDatabase &)=delete
int getFeatureSize() const
Returns the feature size.
int getRootBone() const
Returns the root bone.
bool hasLocomotionFeatures() const
Whether this database uses the 30-dimensional locomotion layout.
int getFrameCount() const
Returns the frame count.
~MotionDatabase()
Motion database.
int getClipCount() const
Returns the clip count.
Runtime motion matching player: builds a query feature from current pose + desired trajectory,...
Owning ordered feature layout; copied atomically by a database.
Copied clip-time interval contributing once to feature normalization; endpoints inclusive.