我目前正在使用ASSIMP庫在我的3D OpenGL遊戲引擎中實現骨架動畫,但不幸的是它並不是那麼棒。 我目前面臨的問題是,只有一個父變換時,連接的骨骼變換(骨骼之間的父子關係)才能正確運行。Assimp Skinning Global Transforms
會發生什麼事是,thigh's bone transformation is carried out on global axes instead of the pelvis' local axes.
這裏是我的骨架類:
class Skeleton
{
public:
Skeleton();
unsigned int numBones;
std::vector<std::string> names;
std::vector<glm::mat4> offsets;
std::vector<glm::mat4> transforms;
std::vector<int> parents;
std::string GetName(int bone);
glm::mat4 GetWorldTransform(int bone);
int GetID(std::string bone_name);
};
,這裏是我用來計算世界變換每個骨骼的功能:
glm::mat4 Skeleton::GetWorldTransform(int bone)
{
int p = parents[bone];
glm::mat4 result = glm::mat4(1.0);
result *= glm::inverse(offsets[bone]);
result *= transforms[bone];
result *= offsets[bone];
while(p >= 0) //The root bone has a parent of -1
{
result *= glm::inverse(offsets[p]);
result *= transforms[p]; //Apply The Parent's Transform
result *= offsets[p];
p = parents[p];
}
return result;
}
在我的網格類中,我有這個函數UpdateSkeleton():
void Mesh::UpdateSkeleton(unsigned int shaderID)
{
std::vector<glm::mat4> mats;
for(int i = 0; i < skeleton->numBones; i++)
{
glm::mat4 matrix = glm::mat4(1.0);
matrix *= skeleton->GetWorldTransform(i);
mats.push_back(matrix);
}
if(mats.size() > 0)
glUniformMatrix4fv(glGetUniformLocation(shaderID,"gBones"),mats.size(),GL_FALSE,glm::value_ptr(mats[0]));
}
謝謝!