Assimp Skeletal Animation добавление данных о костях с более чем 4 костями на вершину - PullRequest
0 голосов
/ 07 ноября 2018

Используя учебник 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);
        }
    }    
}
...