41 Bone(
const std::string& name,
int ID,
const aiNodeAnim* channel)
45 m_LocalTransform(1.0f)
47 m_NumPositions = channel->mNumPositionKeys;
49 for (
int positionIndex = 0; positionIndex < m_NumPositions; ++positionIndex)
51 aiVector3D aiPosition = channel->mPositionKeys[positionIndex].mValue;
52 float timeStamp = channel->mPositionKeys[positionIndex].mTime;
55 data.timeStamp = timeStamp;
56 m_Positions.push_back(data);
59 m_NumRotations = channel->mNumRotationKeys;
60 for (
int rotationIndex = 0; rotationIndex < m_NumRotations; ++rotationIndex)
62 aiQuaternion aiOrientation = channel->mRotationKeys[rotationIndex].mValue;
63 float timeStamp = channel->mRotationKeys[rotationIndex].mTime;
66 data.timeStamp = timeStamp;
67 m_Rotations.push_back(data);
70 m_NumScalings = channel->mNumScalingKeys;
71 for (
int keyIndex = 0; keyIndex < m_NumScalings; ++keyIndex)
73 aiVector3D scale = channel->mScalingKeys[keyIndex].mValue;
74 float timeStamp = channel->mScalingKeys[keyIndex].mTime;
77 data.timeStamp = timeStamp;
78 m_Scales.push_back(data);
86 glm::mat4 translation = InterpolatePosition(animationTime);
87 glm::mat4 rotation = InterpolateRotation(animationTime);
88 glm::mat4 scale = InterpolateScaling(animationTime);
89 m_LocalTransform = translation * rotation * scale;
91 glm::mat4 GetLocalTransform() {
return m_LocalTransform; }
92 std::string GetBoneName()
const {
return m_Name; }
93 int GetBoneID() {
return m_ID; }
100 for (
int index = 0; index < m_NumPositions - 1; ++index)
102 if (animationTime < m_Positions[index + 1].timeStamp)
113 for (
int index = 0; index < m_NumRotations - 1; ++index)
115 if (animationTime < m_Rotations[index + 1].timeStamp)
126 for (
int index = 0; index < m_NumScalings - 1; ++index)
128 if (animationTime < m_Scales[index + 1].timeStamp)
137 float GetScaleFactor(
float lastTimeStamp,
float nextTimeStamp,
float animationTime)
139 float scaleFactor = 0.0f;
140 float midWayLength = animationTime - lastTimeStamp;
141 float framesDiff = nextTimeStamp - lastTimeStamp;
142 scaleFactor = midWayLength / framesDiff;
146 glm::mat4 InterpolatePosition(
float animationTime)
148 if (1 == m_NumPositions)
149 return glm::translate(glm::mat4(1.0f), m_Positions[0].position);
152 int p1Index = p0Index + 1;
153 float scaleFactor = GetScaleFactor(m_Positions[p0Index].timeStamp,
154 m_Positions[p1Index].timeStamp, animationTime);
155 glm::vec3 finalPosition = glm::mix(m_Positions[p0Index].position, m_Positions[p1Index].position
157 return glm::translate(glm::mat4(1.0f), finalPosition);
160 glm::mat4 InterpolateRotation(
float animationTime)
162 if (1 == m_NumRotations)
164 auto rotation = glm::normalize(m_Rotations[0].orientation);
165 return glm::toMat4(rotation);
169 int p1Index = p0Index + 1;
170 float scaleFactor = GetScaleFactor(m_Rotations[p0Index].timeStamp,
171 m_Rotations[p1Index].timeStamp, animationTime);
172 glm::quat finalRotation = glm::slerp(m_Rotations[p0Index].orientation, m_Rotations[p1Index].orientation
174 finalRotation = glm::normalize(finalRotation);
175 return glm::toMat4(finalRotation);
179 glm::mat4 InterpolateScaling(
float animationTime)
181 if (1 == m_NumScalings)
182 return glm::scale(glm::mat4(1.0f), m_Scales[0].scale);
185 int p1Index = p0Index + 1;
186 float scaleFactor = GetScaleFactor(m_Scales[p0Index].timeStamp,
187 m_Scales[p1Index].timeStamp, animationTime);
188 glm::vec3 finalScale = glm::mix(m_Scales[p0Index].scale, m_Scales[p1Index].scale
190 return glm::scale(glm::mat4(1.0f), finalScale);
193 std::vector<KeyPosition> m_Positions;
194 std::vector<KeyRotation> m_Rotations;
195 std::vector<KeyScale> m_Scales;
200 glm::mat4 m_LocalTransform;