スケルトン アニメーション システムを実装しましたが、適切に機能させるために最後の 1 つの詳細が欠けているようです。
キャラクターの一部だけに骨があるアニメーションを作りました。この画像では、スティックマンは腕を振っていますが、他のスティックマンと比べて腕が間違った場所で振っています。(彼の足の間はほとんど見えません)
行列計算の基本を概説して、何か間違っているかどうかを確認します。
ボーン固有の絶対および相対アニメーション マトリックスの計算 (キーフレーム マトリックス データに基づく):
if (b == this->root) {
b->absoluteMatrix = M;
} else {
b->absoluteMatrix = b->parent->absoluteMatrix * M;
}
b->skinningMatrix = b->absoluteMatrix * inverse(b->offsetMatrix);
if (this->currentAnimationTime == 0) {
cout << "Bone '" << b->name << "' skinningMatrix:\n";
printMatrix(b->skinningMatrix);
cout << "Bone '" << b->name << "' absoluteMatrix:\n";
printMatrix(b->absoluteMatrix);
cout << "Bone '" << b->name << "' offsetMatrix:\n";
printMatrix(b->offsetMatrix);
cout << "---------------------------------\n";
}
GPUに送信するskinningMatrix。これにより、次のように出力されます。
ここで、offsetMatrix はバインド ポーズでメッシュ空間からボーン空間に変換する変換です。
私のシェーダーでは、次のことを行います。
layout(location = 0) in vec4 v; // normal vertex data
newVertex = (skinningMatrix[boneIndex.x] * v) * weights.x;
newVertex = (skinningMatrix[boneIndex.y] * v) * weights.y + newVertex;
newVertex = (skinningMatrix[boneIndex.z] * v) * weights.z + newVertex;
私の計算で何が間違っている可能性があるかについてのヒントはありますか?