http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.htmlからこのチュートリアルに取り組んでいます。 残念ながら、Assimp がどのようにボーン データを導出するかについては説明していません。グローバル逆変換は、ブレンダーが y 値を z 値に、z 値を -y に設定するために使用するデフォルトのマトリックス値であることを知っています。(または、少なくともそれが私のテスト md5 モデルが使用するものです)
GlobalInverseTransform = aiScene->mRootNode->mTransformation;
Assimp が MD5 ファイルからオフセット マトリックスまたは逆バインド ポーズを導出する方法を理解しようとしています。たとえば、BobLampClean.md5meshには 32 個のジョイントと 32 個のオフセット マトリックスがあります。
aiMesh->mBones[i]->mOffsetMatrix;
オフセット行列を計算する他のサンプルを通じてオンラインで見たものから、次のようになります...
void ComputeQuatW(glm::quat& quat)
{
float t = 1.0f - (quat.x * quat.x) - (quat.y * quat.y) - (quat.z * quat.z);
if (t < 0.0f)
quat.w = 0.0f;
else
quat.w = -sqrtf(t);
}
glm::mat4 rotation, rotationInv, translationInv, offsetmatrix;
glm::quat MyQuaternion;
//here I chose an arbitrary joint and hard coded its orientation and position
MyQuaternion = glm::quat(glm::quat(-0.535591, -0.462288, -0.534983, 1));
ComputeQuatW(MyQuaternion);
glm::mat4 RotationMatrix = glm::toMat4(MyQuaternion);
rotationInv = glm::transpose(RotationMatrix);
translationInv = glm::translate(translationInv, glm::vec3(-0.014076, -2.592741, -30.241238));
offsetmatrix = rotationInv*translationInv;
これらの各オフセット マトリックスを出力して、Assimp のボーン マトリックスと比較しましたが、役に立ちませんでした。何が間違っているのかよくわかりません...
編集の更新: わかりましたので、操作を間違って行っています。Assimp を使用しない実際のコード例をデバッグしており、Assimp のデータと同じ値を複製できます。データを正しく計算する方法について更新します。