载入中...
搜索中...
未找到
AnimClip.h
浏览该文件的文档.
1#pragma once
2
4
5#include <string>
6#include <vector>
7
8namespace eve::animation {
9
10class AnimPose;
11class AnimSkeleton;
12
17class AnimClip {
18public:
19 explicit AnimClip(std::string name = "");
20 ~AnimClip();
21
22 AnimClip(const AnimClip &) = delete;
23 AnimClip &operator=(const AnimClip &) = delete;
24
25 void setName(const std::string &name) { name_ = name; }
26 std::string getName() const { return name_; }
27
28 void setDuration(float seconds);
29 float getDuration() const { return duration_; }
30
31 void setLoop(bool loop) { loop_ = loop; }
32 bool getLoop() const { return loop_; }
33
35 void setSampleRate(float hz);
36 float getSampleRate() const { return sampleRate_; }
37
38 void addPositionKey(int boneIndex, float time, float x, float y, float z);
39 void addRotationKey(int boneIndex, float time, float x, float y, float z, float w);
40 void addScaleKey(int boneIndex, float time, float x, float y, float z);
41
42 int getPositionKeyCount(int boneIndex) const;
43 int getRotationKeyCount(int boneIndex) const;
44 int getScaleKeyCount(int boneIndex) const;
45
46 float getPositionKeyTime(int boneIndex, int keyIndex) const;
47 float getPositionKeyX(int boneIndex, int keyIndex) const;
48 float getPositionKeyY(int boneIndex, int keyIndex) const;
49 float getPositionKeyZ(int boneIndex, int keyIndex) const;
50
51 float getRotationKeyTime(int boneIndex, int keyIndex) const;
52 float getRotationKeyX(int boneIndex, int keyIndex) const;
53 float getRotationKeyY(int boneIndex, int keyIndex) const;
54 float getRotationKeyZ(int boneIndex, int keyIndex) const;
55 float getRotationKeyW(int boneIndex, int keyIndex) const;
56
57 float getScaleKeyTime(int boneIndex, int keyIndex) const;
58 float getScaleKeyX(int boneIndex, int keyIndex) const;
59 float getScaleKeyY(int boneIndex, int keyIndex) const;
60 float getScaleKeyZ(int boneIndex, int keyIndex) const;
61
67 void applyPlanarRootMotion(int boneIndex, float speedX, float speedZ);
68
73 void sample(float time, AnimPose *out, const AnimSkeleton *skeleton = nullptr) const;
74
76 float wrapTime(float time) const;
77
84 void adopt(AnimClip& other);
85
86private:
87 struct Vec3Key {
88 float t = 0.f, x = 0.f, y = 0.f, z = 0.f;
89 };
90 struct QuatKey {
91 float t = 0.f, x = 0.f, y = 0.f, z = 0.f, w = 1.f;
92 };
93 struct BoneTrack {
94 std::vector<Vec3Key> positions;
95 std::vector<QuatKey> rotations;
96 std::vector<Vec3Key> scales;
97 };
98
99 void ensureBone(int boneIndex);
100 TransformTRS sampleBone(int boneIndex, float time, const TransformTRS &fallback) const;
101
102 static void sampleVec3(const std::vector<Vec3Key> &keys, float time, float &x, float &y,
103 float &z, bool &ok);
104 static void sampleQuat(const std::vector<QuatKey> &keys, float time, float &x, float &y,
105 float &z, float &w, bool &ok);
106
107 std::string name_;
108 float duration_ = 0.f;
109 bool loop_ = true;
110 float sampleRate_ = 30.f;
111 std::vector<BoneTrack> tracks_;
112};
113
114} // namespace eve::animation
int y
Definition Grass.cpp:135
int z
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
int w
const char * name
Definition RockMesh.cpp:21
Keyframed skeletal animation clip (local TRS tracks per bone). Script type: AnimClip.
Definition AnimClip.h:17
float getDuration() const
Definition AnimClip.h:29
bool getLoop() const
Definition AnimClip.h:32
void sample(float time, AnimPose *out, const AnimSkeleton *skeleton=nullptr) const
Sample local pose at time (seconds). If skeleton non-null, missing tracks fall back to bind pose; oth...
Definition AnimClip.cpp:276
float getPositionKeyZ(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:111
float getRotationKeyW(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:132
void addScaleKey(int boneIndex, float time, float x, float y, float z)
Definition AnimClip.cpp:66
float getScaleKeyY(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:145
void setDuration(float seconds)
Definition AnimClip.cpp:18
float getPositionKeyTime(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:99
float getSampleRate() const
Definition AnimClip.h:36
void addPositionKey(int boneIndex, float time, float x, float y, float z)
Definition AnimClip.cpp:35
void adopt(AnimClip &other)
Replace this clip's content with other's (payload moved, not copied). Used by hot reload so registere...
Definition AnimClip.cpp:289
float getRotationKeyTime(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:116
int getRotationKeyCount(int boneIndex) const
Definition AnimClip.cpp:81
float getScaleKeyTime(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:137
void applyPlanarRootMotion(int boneIndex, float speedX, float speedZ)
Bake planar root motion onto an existing position track (or create one). For each position key at tim...
Definition AnimClip.cpp:154
float getRotationKeyZ(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:128
int getScaleKeyCount(int boneIndex) const
Definition AnimClip.cpp:86
void setSampleRate(float hz)
Sample rate hint used by MotionDatabase baking (Hz).
Definition AnimClip.cpp:23
float getPositionKeyX(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:103
int getPositionKeyCount(int boneIndex) const
Definition AnimClip.cpp:76
void addRotationKey(int boneIndex, float time, float x, float y, float z, float w)
Definition AnimClip.cpp:45
float getRotationKeyX(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:120
std::string getName() const
Definition AnimClip.h:26
float getRotationKeyY(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:124
void setName(const std::string &name)
Definition AnimClip.h:25
float getPositionKeyY(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:107
float wrapTime(float time) const
Wrap or clamp time according to loop flag.
Definition AnimClip.cpp:169
float getScaleKeyX(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:141
float getScaleKeyZ(int boneIndex, int keyIndex) const
Definition AnimClip.cpp:149
void setLoop(bool loop)
Definition AnimClip.h:31
AnimClip & operator=(const AnimClip &)=delete
AnimClip(const AnimClip &)=delete
Evaluated local (and optional world) pose for an AnimSkeleton. Script type: AnimPose.
Definition AnimPose.h:15
3D bone hierarchy + bind-pose local TRS for skeletal animation. Independent of ik::Skeleton3D (FABRIK...