载入中...
搜索中...
未找到
AnimSkin.h
浏览该文件的文档.
1#pragma once
2
4
5#include <string>
6#include <vector>
7
8namespace eve::model3d {
9class ModelData;
10}
11
12namespace eve::animation {
13
14class AnimSkeleton;
15class AnimPose;
16
25class AnimSkin {
26public:
27 static constexpr int kMaxInfluences = 4;
28
29 AnimSkin() = default;
30 ~AnimSkin() = default;
31
32 AnimSkin(const AnimSkin &) = delete;
33 AnimSkin &operator=(const AnimSkin &) = delete;
34
40 static AnimSkin *fromModel(const model3d::ModelData *model, int meshIndex,
41 const AnimSkeleton *skeleton);
42
43 int getVertexCount() const { return vertexCount_; }
44 int getBoneCount() const { return static_cast<int>(skeletonBone_.size()); }
45 int getInfluenceCount() const { return kMaxInfluences; }
46
48 int getSkeletonBone(int skinBoneIndex) const;
49 std::string getSkinBoneName(int skinBoneIndex) const;
50
52 float getInverseBindElement(int skinBoneIndex, int elementIndex) const;
53
59 void skinPositions(const AnimPose *pose, float *outPosXYZ) const;
60
65 bool skinPositionsTo(const AnimPose *pose, std::vector<float> &outPosXYZ) const;
66
71 bool updateSkinnedPositions(const AnimPose *pose);
72
74 bool hasSkinnedPositions() const { return skinnedValid_; }
75
77 float getSkinnedPositionX(int vertexIndex) const;
78 float getSkinnedPositionY(int vertexIndex) const;
79 float getSkinnedPositionZ(int vertexIndex) const;
80
82 float getBindPositionX(int vertexIndex) const;
83 float getBindPositionY(int vertexIndex) const;
84 float getBindPositionZ(int vertexIndex) const;
85
87 int getVertexBone(int vertexIndex, int influenceIndex) const;
88 float getVertexWeight(int vertexIndex, int influenceIndex) const;
89
90private:
91 struct Influence {
92 int bone = -1; // index into skeletonBone_ / inverseBind_
93 float weight = 0.f;
94 };
95
96 void requireVertex(int vertexIndex) const;
97 void requireSkinBone(int skinBoneIndex) const;
98
99 int vertexCount_ = 0;
100 std::vector<float> bindPos_; // xyz packed
101 std::vector<Influence> influences_; // vertexCount_ * kMaxInfluences
102 std::vector<int> skeletonBone_; // skin joint → skeleton bone
103 std::vector<std::string> skinBoneNames_;
104 std::vector<Mat4> inverseBind_;
105 std::vector<float> skinnedPos_; // xyz packed cache
106 bool skinnedValid_ = false;
107};
108
109} // namespace eve::animation
glm::mat4 model
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...
CPU linear-blend skinning binding for one mesh against an AnimSkeleton.
Definition AnimSkin.h:25
int getSkeletonBone(int skinBoneIndex) const
Skeleton bone index used by skin joint i (-1 if unused).
Definition AnimSkin.cpp:155
float getInverseBindElement(int skinBoneIndex, int elementIndex) const
Inverse-bind matrix element (column-major, 0..15) for skin joint i.
Definition AnimSkin.cpp:165
int getBoneCount() const
Definition AnimSkin.h:44
float getSkinnedPositionX(int vertexIndex) const
Cached skinned position component (requires updateSkinnedPositions).
Definition AnimSkin.cpp:266
float getBindPositionX(int vertexIndex) const
Bind-pose (unskinned) position component for vertex v (0..vertexCount-1).
Definition AnimSkin.cpp:173
int getVertexBone(int vertexIndex, int influenceIndex) const
Influence slot i (0..3) for vertex: skeleton bone index or -1.
Definition AnimSkin.cpp:186
bool hasSkinnedPositions() const
True after a successful updateSkinnedPositions().
Definition AnimSkin.h:74
AnimSkin & operator=(const AnimSkin &)=delete
AnimSkin(const AnimSkin &)=delete
bool updateSkinnedPositions(const AnimPose *pose)
Skin into an internal cache readable via getSkinnedPosition*. Returns false if pose is null or there ...
Definition AnimSkin.cpp:255
int getInfluenceCount() const
Definition AnimSkin.h:45
static AnimSkin * fromModel(const model3d::ModelData *model, int meshIndex, const AnimSkeleton *skeleton)
Build skin binding for meshIndex on model, mapping bone names onto skeleton. Throws if the mesh has n...
Definition AnimSkin.cpp:58
bool skinPositionsTo(const AnimPose *pose, std::vector< float > &outPosXYZ) const
Convenience: skin into a vector sized vertexCount*3. Returns false if pose is null or bone count mism...
Definition AnimSkin.cpp:248
float getVertexWeight(int vertexIndex, int influenceIndex) const
Definition AnimSkin.cpp:198
std::string getSkinBoneName(int skinBoneIndex) const
Definition AnimSkin.cpp:160
float getBindPositionZ(int vertexIndex) const
Definition AnimSkin.cpp:181
float getSkinnedPositionZ(int vertexIndex) const
Definition AnimSkin.cpp:276
float getSkinnedPositionY(int vertexIndex) const
Definition AnimSkin.cpp:271
static constexpr int kMaxInfluences
Definition AnimSkin.h:27
float getBindPositionY(int vertexIndex) const
Definition AnimSkin.cpp:177
void skinPositions(const AnimPose *pose, float *outPosXYZ) const
Linear-blend skin bind-pose positions into outPosXYZ (vertexCount*3 floats). pose must already have c...
Definition AnimSkin.cpp:207
int getVertexCount() const
Definition AnimSkin.h:43
CPU-side decoded 3D model (Assimp scene owned via medialoader::ModelScene). Does not upload to GPU — ...
Definition ModelData.h:23