DirectX12 ボーンオフセット行列と初期姿勢行列
あいさつ
どうも、はかせです。
今日はボーン勉強会その二です。
今回のテーマはボーンについて調べてるとしょっちゅう出てくる
ボーンオフセット行列と
初期姿勢行列です。
ボーンオフセット行列
ボーンをローカル座標で原点に移動させる行列です。
なんでこんな行列が存在するかっていうと
ランタイムでの行列計算コストを減らすためですね。
仮にボーンを(2.0,1.0)から(1.0,2.0)へ移動させるとしましょう。
直接移動させることももちろんできます。
所詮(2.0,1.0)-(1.0,2.0)=(1.0,-1.0)となり
(1.0,-1.0)の移動行列を計算して適用すればいいだけですから。
ただ行列の計算ってのは
色んなとこでもさんざん言われているよう
結構重いです。
それを全頂点分やろうとすれば
フレーム落ちという結果が目に見えます。
なので登場するのがボーンオフセット行列です。
こいつはボーンを一旦原点を移動させる行列です。
原点へ移動させることで原点から
目的地への移動行列があるだけで
移動できるようになります。
そして大抵この目的地への移動行列ってのは
モデルデータやらアニメーションデータやらに入っているか
予め線形補間なりなんなりで計算して置けます。
ボーンオフセット行列は初期位置から原点(0.0,0.0)への移動行列なので
予め計算して持っておけます。
つまり移動に必要な行列を予め持って置けることになります
こうすることでランタイム中に行列の計算を
減らすことができるようになり、
パフォーマンスに貢献してくれます。
(もちろんケースバイケースなので完全0にはならない可能性もある)
初期姿勢行列
ボーン座標を親のローカル座標に変換する行列です。
先ほど述べたボーンオフセット行列を用いた移動は
あくまで自分のローカル座標上での移動です。
ボーンてのは必ず親が存在しており
相互に干渉しあうことで自然な動きを実現します。
つまり最終的な位置は親のローカル座標上で決定される必要があります。
それを実現するのがこの初期姿勢行列になります。
計算も結構簡単で子の初期位置に
親のボーンオフセット行列をかけていくだけです。
ボーンオフセット行列は
さっきも言ったように原点へ
移動させる行列です。
これを利用することで
親の原点からどれだけ移動しているか=
親のローカル座標上での座標が求められるわけです。
ボーンオフセット行列が原点からのオフセットであったのに対し
初期姿勢行列は親からのオフセットって感じですかね。
あとがき
今回はボーンを勉強していく中で何回も出てくる
ボーンオフセット行列と初期姿勢行列でした。
ザ・数学みたいな感じでしたね。
なんとなくわかった気になってますが
なんかもやっとした感じでもあるので
どっか間違ってるかもしれませんね。
間違ってたらやってく中で変に詰まるでしょうし
その時に改めて勉強しなおすだけですね。
今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ