载入中...
搜索中...
未找到
ControlPose.h
浏览该文件的文档.
1#pragma once
2
5
6#include <string>
7#include <vector>
8
9namespace eve::animation {
10
11class AnimSkeleton;
12
22public:
23 explicit ControlPose(AnimSkeleton *skeleton);
24 ~ControlPose() = default;
25
26 ControlPose(const ControlPose &) = delete;
27 ControlPose &operator=(const ControlPose &) = delete;
28
29 AnimSkeleton *getSkeleton() const { return skeleton_; }
30
31 void setFrequency(float frequencyHz);
32 float getFrequency() const { return frequencyHz_; }
33 void setDamping(float dampingZeta);
34 float getDamping() const { return dampingZeta_; }
35 void setResponse(float response);
36 float getResponse() const { return response_; }
37
38 void setIntegrator(const std::string &kind);
39 std::string getIntegrator() const;
40
42 void setBoneWeight(int boneIndex, float weight);
43 float getBoneWeight(int boneIndex) const;
44
46 void setTargetPose(const AnimPose *target);
48 void snapToTarget();
49
52
53 void update(float dt);
54
55private:
56 enum class Integrator { SecondOrder, Spring, Pd };
57
58 struct ScalarState {
59 float y = 0.f;
60 float yd = 0.f;
61 float x = 0.f;
62 float xp = 0.f;
63 bool hasPrev = false;
64 };
65
66 struct BoneState {
67 ScalarState px, py, pz;
68 ScalarState qx, qy, qz, qw;
69 ScalarState sx, sy, sz;
70 float weight = 1.f;
71 };
72
73 void refreshCoeffs();
74 void ensureBones(int count);
75 void stepScalar(float dt, float xd, ScalarState &s);
76 void writePoseFromState();
77 void readTargetIntoState(const AnimPose *target, bool snap);
78
79 AnimSkeleton *skeleton_ = nullptr;
80 AnimPose pose_;
81 AnimPose target_;
82
83 float frequencyHz_ = 3.f;
84 float dampingZeta_ = 1.f;
85 float response_ = 1.f;
86 Integrator integrator_ = Integrator::SecondOrder;
87 SecondOrderCoeffs coeffs_{};
88 float kp_ = 0.f;
89 float kd_ = 0.f;
90
91 std::vector<BoneState> bones_;
92 bool hasTarget_ = false;
93};
94
95} // namespace eve::animation
Tok kind
int y
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
std::vector< Colorf > px
uint32_t s
Definition Weather.cpp:28
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...
Control-theory procedural pose driver: tracks a target AnimPose with per-channel second-order / sprin...
Definition ControlPose.h:21
void setBoneWeight(int boneIndex, float weight)
Per-bone blend weight in [0,1]; 1 = full dynamics, 0 = hard snap to target.
void setDamping(float dampingZeta)
float getBoneWeight(int boneIndex) const
void setTargetPose(const AnimPose *target)
Copy target pose. Channels without prior state snap; existing state keeps momentum.
ControlPose(const ControlPose &)=delete
AnimSkeleton * getSkeleton() const
Definition ControlPose.h:29
ControlPose & operator=(const ControlPose &)=delete
void snapToTarget()
Snap current state to the last target without changing the target.
std::string getIntegrator() const
void setResponse(float response)
void setFrequency(float frequencyHz)
void setIntegrator(const std::string &kind)