私は自分のCOLLADAインポーターの作成に取り組んでいます。メッシュやマテリアルなどをロードして、かなり遠くまで到達しました。しかし、私はアニメーション、特に関節の回転に問題を抱えています。
メッシュのスキニングに使用している式は単純です。
weighted;
for (i = 0; i < joint_influences; i++)
{
weighted +=
joint[joint_index[i]]->parent->local_matrix *
joint[joint_index[i]]->local_matrix *
skin->inverse_bind_pose[joint_index[i]] *
position *
skin->weight[j];
}
position = weighted;
そして、文献に関する限り、これは正しい公式です。現在、COLLADAは、ローカルとグローバルの2種類の関節の回転を指定しています。ジョイントのローカル変換を取得するには、回転を連結する必要があります。
COLLADAドキュメントで区別されていないのは、ジョイントのローカル回転とジョイントのグローバル回転です。しかし、私が見たほとんどのモデルでは、ローテーションはrotate
(グローバル)またはjointOrient
(ローカル)のいずれかのIDを持つことができます。
グローバルローテーションを無視してローカルローテーションのみを使用すると、モデルのバインドポーズが取得されます。しかし、ジョイントのローカル変換にグローバルローテーションを追加すると、奇妙なことが起こり始めます。
これは、グローバルローテーションを使用しない場合です。
そして、これはグローバルローテーションです。
どちらのスクリーンショットでも、線を使用してスケルトンを描画していますが、最初はジョイントがメッシュの内側にあるため、スケルトンは表示されていません。2番目のスクリーンショットでは、頂点がいたるところにあります。
比較のために、これは2番目のスクリーンショットがどのように見えるかです:
見づらいですが、2番目のスクリーンショットで関節が正しい位置にあることがわかります。
しかし、今は奇妙なことです。COLLADAで指定されている逆バインドポーズを無視し、代わりにジョイントの親ローカル変換にジョイントのローカル変換を掛けたものを逆にすると、次のようになります。
このスクリーンショットでは、各頂点から影響力のあるジョイントまで線を引いています。数式が次のようになるため、バインドポーズを取得するという事実はそれほど奇妙ではありません。
world_matrix * inverse_world_matrix * position * weight
しかし、COLLADAの逆バインドポーズが間違ったスペースにあるのではないかと思われます。
だから私の質問は:COLLADAはどのスペースでその逆バインドポーズを指定しますか?そして、どうすれば逆バインドポーズを必要なスペースに変換できますか?