私は自分自身のCOLLADA輸入業者を書いています。私はかなり遠くに、メッシュや材料などを載せています。しかし、私はアニメーション、特に関節回転に悩まされました。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のマニュアルでは、ジョイントのローカルローテーションとジョイントのグローバルローテーションが区別されません。しかし、私が見たほとんどのモデルでは、ローテーションのIDはrotate
(グローバル)またはjointOrient
(ローカル)のいずれかになります。
グローバルローテーションを無視してローカルローテーションのみを使用すると、モデルのバインドポーズが取得されます。しかし、ジョイントのローカル変換にグローバルローテーションを追加すると、奇妙なことが起こり始めます。
これはグローバルな回転を使用することなく、次のとおりです。
そして、これは世界的なローテーションである:私はラインを使用してスケルトンを描くが、中にいます、両方のスクリーンショットで
ジョイントがメッシュの内側にあるため、最初は目に見えません。 2番目のスクリーンショットでは、頂点はすべての場所にあります!
それは見えにくいですが、あなたは関節が第二のスクリーンショットの正しい位置にあることがわかります。
比較のために、これは、第二のスクリーンショットはどのように見えるかです。
しかし今、奇妙なことです。私は逆バインドを無視した場合COLLADAで指定されたポーズをし、代わりにジョイントの親の逆を取るローカル変換ジョイントのローカル時刻を変換、私は次を得る:
このスクリーンショットで私が描いています各頂点から影響を受ける関節までの線。式は、今となっているため、私はバインドポーズを取得するということは、それほど不思議ではない:
world_matrix * inverse_world_matrix * position * weight
しかし、それは、COLLADAの逆バインドポーズと疑うに私をリードし、間違った空間です。
私の質問は次のとおりです。COLLADAはどの空間で逆バインドポーズを指定していますか?そして、逆バインドポーズを必要なスペースに変換するにはどうすればよいですか?
1.4.1仕様の「COLLADAでのスケルトンのスキニング」の項を読んでいますか?あなたの数式は外に見える – jterrace