58 mat = mat_t * mat_r * mat_s;
66 mat = mat_t * mat_r * mat_s;
75 if (t >= kf_0.
_t && t <= kf_1.
_t)
86 mat = mat_t * mat_r * mat_s;
128 auto clip = _allAnimation.find(std::string{ cilp_name });
129 return clip->second.GetClipEndTime();
134 return _allBoneOffset;
139 std::vector<Matrix4>& final_trans)
142 size_t num_bone = _allBoneOffset.size();
144 std::vector<Matrix4> trans_to_parent = _allNodeTrans2Parent;
147 auto clip = _allAnimation.find(std::string{ clip_name });
148 clip->second.Interpolate(t, trans_to_parent);
151 std::vector<Matrix4> trans_to_root(num_bone);
154 for (
size_t i = 0; i < num_bone; ++i)
157 int index_parent = _allNodeParent[i];
158 if(index_parent == -1)
159 trans_to_root[i] = trans_to_parent[i];
163 Matrix4& mat_to_parent = trans_to_parent[i];
165 Matrix4& parent_to_root = trans_to_root[index_parent];
167 trans_to_root[i] = parent_to_root * mat_to_parent;
172 for (
size_t i = 0; i < num_bone; ++i)
174 Matrix4& mat_offset = _allBoneOffset[i];
175 Matrix4& mat_to_root = trans_to_root[i];
176 final_trans[i] = mat_to_root * mat_offset;
182 s.
Write(&_allNodeParent);
183 s.
Write(&_allNodeTrans2Parent);
184 s.
Write(&_allBoneOffset);
186 size_t size = _allAnimation.size();
188 for (
auto& iter : _allAnimation)
190 const std::string& name = iter.first;
197 for (
size_t i = 0; i < size1; ++i)
202 for (
size_t j = 0; j < size2; ++j)
212 s.
Read(&_allNodeParent);
213 s.
Read(&_allNodeTrans2Parent);
214 s.
Read(&_allBoneOffset);
218 for (
size_t k = 0; k < size; ++k)
228 for (
size_t i = 0; i < size1; ++i)
234 for (
size_t j = 0; j < size2; ++j)
242 std::vector<int> _allNodeParent;
243 std::vector<Matrix4> _allNodeTrans2Parent;
244 std::vector<Matrix4> _allBoneOffset;
245 std::unordered_map<std::string, AnimationClip> _allAnimation;
267 auto iter =
_skinndeData->_allAnimation.find(std::string{ name });
void Update(FloatTime dt)
每帧调用,推进时间点进行插值
void Set(std::string_view name, FloatTime t)
std::vector< Matrix4 > _finalTrans
void GetFinalTrans(std::string_view clip_name, FloatTime t, std::vector< Matrix4 > &final_trans)
void Save(StreamOutput &s)
FloatTime GetClipEndTime(std::string_view cilp_name)
std::vector< Matrix4 > GetBoneOffset()
void Load(StreamInput &s)
void Identity()
获得行列式的值,Determinant(A)
void Write(const T *data)
写入一个对象
std::array< T, N > Lerp(const std::array< T, N > &a, const std::array< T, N > &b, T t)
线性插值
Matrix4 CreateRotation(const Position3 &axis, Float angle)
创建旋转矩阵
Matrix4 CreateTranslation(const Position3 &t)
创建平移矩阵
Matrix4 CreateScaling(const Position3 &s)
创建缩放矩阵
constexpr bool IsOutRange(T x, T a, T b)
判断数值是否越界(前闭后开)
Position4 Slerp(const Position4 &q0, const Position4 &q1, const Float &t)
球面线性插值
std::array< Float, 3 > Position3
std::array< Float, 4 > Position4
std::vector< BoneKeyFrameMulti > _allBoneKeyFrameMulti
void Interpolate(FloatTime t, std::vector< Matrix4 > &bone_trans)
FloatTime GetClipEndTime()
void Interpolate(FloatTime t, Matrix4 &mat)
std::vector< BoneKeyFrame > _allKeyFrame