はかせのラボ

私の頭の中を書いていく雑記ブログです

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)の移動行列を計算して適用すればいいだけですから。

ただ行列の計算ってのは
色んなとこでもさんざん言われているよう
結構重いです。
f:id:hakase0274:20191019164003p:plain

それを全頂点分やろうとすれば
フレーム落ちという結果が目に見えます。

なので登場するのがボーンオフセット行列です。
こいつはボーンを一旦原点を移動させる行列です。

原点へ移動させることで原点から
目的地への移動行列があるだけで
移動できるようになります。

そして大抵この目的地への移動行列ってのは
モデルデータやらアニメーションデータやらに入っているか
予め線形補間なりなんなりで計算して置けます。

ボーンオフセット行列は初期位置から原点(0.0,0.0)への移動行列なので
予め計算して持っておけます。

つまり移動に必要な行列を予め持って置けることになります
f:id:hakase0274:20191019165033p:plain

こうすることでランタイム中に行列の計算を
減らすことができるようになり、
パフォーマンスに貢献してくれます。
(もちろんケースバイケースなので完全0にはならない可能性もある)

初期姿勢行列

ボーン座標を親のローカル座標に変換する行列です。

先ほど述べたボーンオフセット行列を用いた移動は
あくまで自分のローカル座標上での移動です。

ボーンてのは必ず親が存在しており
相互に干渉しあうことで自然な動きを実現します。

つまり最終的な位置は親のローカル座標上で決定される必要があります。

それを実現するのがこの初期姿勢行列になります。
計算も結構簡単で子の初期位置に
親のボーンオフセット行列をかけていくだけです。

ボーンオフセット行列は
さっきも言ったように原点へ
移動させる行列です。

これを利用することで
親の原点からどれだけ移動しているか=
親のローカル座標上での座標が求められるわけです。

ボーンオフセット行列が原点からのオフセットであったのに対し
初期姿勢行列は親からのオフセットって感じですかね。

あとがき

今回はボーンを勉強していく中で何回も出てくる
ボーンオフセット行列と初期姿勢行列でした。

ザ・数学みたいな感じでしたね。
なんとなくわかった気になってますが
なんかもやっとした感じでもあるので
どっか間違ってるかもしれませんね。

間違ってたらやってく中で変に詰まるでしょうし
その時に改めて勉強しなおすだけですね。

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ