Используя учебник http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html, я смог получить анимацию, работающую в моем проекте OpenGL. Но в используемой модели кажется, что на вершину приходится более 4 костей, поэтому эта функция продолжает вызывать ошибки:
void SkinnedMesh::VertexBoneData::AddBoneData(GLuint BoneID, float Weight)
{
const GLuint arraySize = sizeof(IDs) / sizeof(GLuint);
for (GLuint i = 0 ; i < arraySize; i++)
{
if (Weights[i] == 0.0)
{
IDs[i] = BoneID;
Weights[i] = Weight;
return;
}
}
// should never get here - more bones than we have space for
assert(0);
}
Если я закомментирую утверждение, код выполняется, но я получаю артефакты вершин вершин, на которые не влияет движение кости, что я предполагаю, что модель имеет более 4 костей на вершину. Есть ли простой способ назначить вершину другой кости?
Функция, которая вызывает AddBoneData
, выглядит следующим образом:
void SkinnedMesh::LoadBones(GLuint MeshIndex, const aiMesh* pMesh, vector<VertexBoneData>& Bones)
{
for (GLuint i = 0 ; i < pMesh->mNumBones ; i++)
{
GLuint BoneIndex = 0;
string BoneName(pMesh->mBones[i]->mName.data);
if (m_BoneMapping.find(BoneName) == m_BoneMapping.end())
{
// Allocate an index for a new bone
BoneIndex = m_NumBones;
m_NumBones++;
BoneInfo bi;
m_BoneInfo.push_back(bi);
m_BoneInfo[BoneIndex].BoneOffset = AssimpToGLM(pMesh->mBones[i]->mOffsetMatrix);
m_BoneMapping[BoneName] = BoneIndex;
}
else
{
BoneIndex = m_BoneMapping[BoneName];
}
for (GLuint j = 0 ; j < pMesh->mBones[i]->mNumWeights ; j++)
{
GLuint VertexID = m_Entries[MeshIndex].BaseVertex + pMesh->mBones[i]->mWeights[j].mVertexId;
float Weight = pMesh->mBones[i]->mWeights[j].mWeight;
Bones[VertexID].AddBoneData(BoneIndex, Weight);
}
}
}