スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スキンメッシュアニメーションの解説 その2

【リンク】 ◆解説系TOP◆

昨日の続きです。

最初に注意書き。
↓以下、このように対応しますので、覚えておいてください。
---------------------------------------------
ボーンオフセット行列 = BOf行列
もとの座標に戻す行列 = 逆BOf行列

---------------------------------------------

ついでに、Xファイル上だとボーンオフセット行列はSkinWeightsという
キーワードで囲まれた部分の中に存在します。

【参考画像】
SkinWaights.jpg

そして、BOf行列で移動した分を元に戻す逆BOf行列
そのボーン名が記述してあるFrameの中のFrameTransformMatrix
の部分に定義されてます。

【参考画像】
FrameTransformMatrix.jpg

これを見ても分かるように、
最初にx、y、z軸方向にそれぞれ-0.021821,-2.476220,-0.019219動かして原点に移動させ、
その後、x、y、z軸方向にそれぞれ0.021821, 2.476220, 0.019219動かして、
BOf行列で移動させた分を元に戻している事が分かります。

では、次の段階へ進みましょう!


×××××××××××××××××××
STEP3 親子関係のボーン
×××××××××××××××××××

昨日はボーンひとつだけの変換でした。
しかし、 大抵の3Dモデルのボーンは親子関係になってます。
なので、今日は親子関係になっているボーンの変換方法を説明します。

親子関係のおさらい。
--------------------------------------
・親が動くと子も動く。
・子が動くと、子だけが動く。

--------------------------------------
ボーン親子関係
これで親子関係が 大体分かるかと思います。
また、ボーンの先端に、別のボーンの根元を合体させて親子関係が作られます。

で、座標変換についてですが 親の場合は今までと同じです。
※以下、親 = RedBone 子 = BlueBoneとします。

RedBoneの行列は以下のように定義されています。
----------------------------------------
BOf行列 = x軸に-3移動、y軸に-1移動
逆BOf行列 = x軸に3移動、y軸に1移動

----------------------------------------

RedBoneにつられて動く頂点があれば、 90度回転させるとき下記の様に計算できます。
頂点 × BOf行列 × 90回転させる行列 × 逆BOf行列

注意すべきは 子ボーンの計算。

子であるBlueBoneの行列は以下のように定義されています。
----------------------------------------
BOf行列 = x軸に-6移動、y軸に-1移動
逆BOf行列 = x軸に3移動、y軸に0移動

----------------------------------------

値がおかしい事が分かるでしょうか?
BOf行列と逆BOf行列の差分が一致しておりません。

何故かというと、
親であるRedBoneは原点からx軸に3移動、y軸に1移動した所に根元がある
と計算しているのに対して、

子であるBlueBoneは、親であるRedBoneからx軸に3移動、y軸に0移動した所に根元がある
と考えているのです。

つまり、子は親を基準とした相対座標になっているのです。
「じゃあどうすれば子の絶対的な座標が分かるの?」というと、

親が居なくなるまで、
親の逆BOf行列をかけ続ければよいのです。


今回は、親はRedBoneしかいませんので、下記の様な計算になります。
頂点 × BOf行列 × 90度回転させる行列 × 逆BOf行列 × 逆BOf行列

手順と図を見ながら実際に確認してみましょう。
--------------------------------------
【1】初期状態。
【2】ボーンの根元が原点に来るように移動。 (BOf行列)
【3】90度回転。 (座標変換行列)
【4】BlueBoneの逆BOf行列をかける。
【5】RedBoneの逆BOf行列をかける。
【6】移動完了!

--------------------------------------

ボーン親子関係2
ちゃんとBlueBone(子ボーン)の位置に戻ってますね。 完璧です。

更に、親のボーンが座標変換されている場合は、
逆BOf行列をかけるまえに、座標変換行列をかけます。

RedBoneが90度回転、BlueBoneが90度回転した場合は下記の様になる筈です。

ボーン親子関係3

これも、手順と図を見て理解してみましょう。
--------------------------------------
■子ボーンの処理■
【1】初期状態。
【2】ボーンの根元が原点に来るように移動。 (BOf行列)
【3】90度回転。 (BlueBoneの座標変換行列)
【4】BlueBoneの逆BOf行列をかける。
【5】90度回転。 (RedBoneの座標変換行列)
【5】RedBoneの逆BOf行列をかける。
【6】BlueBone移動完了!
■親ボーンの処理■
【7】RedBone移動完了!

--------------------------------------
(RedBoneの途中の変換はものすごく省略してます。

ボーン親子関係4

これで、親子関係を持つボーンの変換は大体分かったはずです!
(うまく説明できたか心配である)

今日の内容をまとめてみましょう。


今回のまとめ

・ボーンの先端に、別のボーンの根元をセットすると、ボーンの親子関係が作られる
・子ボーンの根元の座標は、原点からではなく、親ボーンからの相対座標になっている。
・子ボーンの絶対的な位置は、親が居なくなるまで 親ボーンの座標変換と逆BOf行列をかけ続ければ求められる。


親・・・RedBone
子・・・BlueBone
孫・・・PurpleBone (子の更に子のボーン)
とすると、

親に影響する頂点の絶対座標は、
頂点×BOf行列×座標変換行列×逆BOf行列

子に影響する頂点の絶対座標は、
頂点×BOf行列×座標変換行列×逆BOf行列×座標変換行列×逆BOf行列

孫に影響する頂点の絶対座標は、
頂点×BOf行列×座標変換行列×逆BOf行列×座標変換行列×逆BOf行列×座標変換行列×逆BOf行列
で求められるよ!


次回は、影響率についてやろうと思います。
(明後日ぐらいに書く予定!)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

No title

このページの解説のおかげで、ボーンに頂点がちゃんと追従するようになりました。
ありがとうございます。
まさか、子ボーンの逆Bof行列が親からの相対を表していたとは。。。

No title

おぉ それは良かったです!v-290
子ボーンに関しては、絶対座標では無いのですv-394

自分も最初、以下の様になってるんだ!
----------------------------------------
【1】原点にスライドさせる
【2】座標変換行列をかける
【3】スライドさせた差分を元に戻す

----------------------------------------
と理解していたのですが、
子ボーンに関しては【1】と【3】が一致しないため、
あれ・・・なんで?と混乱しました。

で、Xファイルをよくよく解析してみると、
「あれ、親ボーンの【3】と、 子ボーンの【3】を足したら
子ボーンの【1】の符号反転した値になるんじゃね?」

という事に気がつきました。

子ボーンが相対座標になっているのは、
全て親子関係を作るためですね。
(絶対座標だと、親ボーンの影響を受けなくなってしまう。)

スキンメッシュアニメーションは、最初 まったく原理が分からなかったのですが、
理解してしまえば簡単ですよね!v-290e-420
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。