Assimp でいくつかのアニメーション ファイルをインポートし、それらを既存のアニメーションのリストに追加しようとしています。ただし、関数が返されたときに、新しい aiAnimation オブジェクトの mChannels ポインターが無効であるという点で、aiAnimation->mChannels (タイプ aiNodeAnim**) に問題があります。これは、Assimp のインポーターが破棄されると、それ自体がクリーンアップされるためです。必要なのは、インポーターが範囲外になったときにチャネルが削除されないようにチャネルをコピーすることです。
これは私のアニメーション追加関数であり、期待どおりに更新されますが、関数から戻るときに「Engine.exe がブレークポイントをトリガーしました」というランタイム例外が発生します。
void Animation::AddAnimation(const char* p_filePath)
{
Assimp::Importer m_importer;
const aiScene* m_scene = m_importer.ReadFile(p_filePath,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType | aiProcess_GenSmoothNormals);
for (int i = 0; i < m_scene->mNumAnimations; ++i)
{
aiAnimation* m_newAnimation = new aiAnimation(*m_scene->mAnimations[i]);
m_newAnimation->mName = m_scene->mAnimations[i]->mName;
m_newAnimation->mDuration = m_scene->mAnimations[i]->mDuration;
m_newAnimation->mTicksPerSecond = m_scene->mAnimations[i]->mTicksPerSecond;
m_newAnimation->mNumChannels = m_scene->mAnimations[i]->mNumChannels;
if (m_scene->mAnimations[i]->mChannels != NULL)
{
aiNodeAnim* m_channels = *m_scene->mAnimations[i]->mChannels;
*m_newAnimation->mChannels = new aiNodeAnim[m_scene->mAnimations[i]->mNumChannels];
for (int j = 0; j < m_scene->mAnimations[i]->mNumChannels; ++j)
{
m_newAnimation->mChannels[j] = new aiNodeAnim();
m_newAnimation->mChannels[j] = &m_channels[j];
}
}
g_channels = m_newAnimation->mChannels;
g_animations.push_back(m_newAnimation);
}
}