スポンサーサイト

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

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

【リンク】 ◆解説系TOP◆

スキンメッシュアニメーションの解説も4回目となりました。

【今までの解説】
----------------------------------------------
スキンメッシュアニメーションの解説1
スキンメッシュアニメーションの解説2
スキンメッシュアニメーションの解説3
----------------------------------------------

今までやってきたのは
-------------------------------------------------------------------
・ボーン基準の回転
・親子関係のボーン基準の回転
・複数のボーンから影響を受ける場合の座標変換 (影響度)

-------------------------------------------------------------------
ですね。

今回は、影響度を設定するメリット+αを書こうかなと。

以下、下記の様に対応します。
ボーンオフセット行列 = BOf行列
元に戻す行列 = 逆BOf行列

(単語の意味が分からない場合は、以前の解説を読んでみてください)



では、「何で影響度を設定するのか?」の説明。
端的に答えると、 滑らかな動き・形にさせるためです。

実際に図を使いながら見てみましょう。

下記の様に、頂点0~8で何かの左腕が定義されており、
0、8がBoneA 1~7がBoneBの影響を100%受けるとします。
影響度

この場合、力こぶを作るように腕を90度曲げると、このようになります。
(BoneBを90度回転させる)

影響度2

見れば分かりますが、関節の部分が へし曲がりました。
むしろ、腕が途中で途切れています。

本物の人間であれば悲惨な状態なので
ここで、影響度の調整をしてみます。

頂点1、2の影響度を
-----------
BoneA 0.8
BoneB 0.2

-----------

頂点7の影響度を
-----------
BoneA 0.4
BoneB 0.6

-----------
に変更します。

【参考画像】
影響度3

ここでもう一度 影響度を考慮した座標変換の仕方を復習します。

影響度がある場合は、
影響を与える全てのボーンの行列を計算し、それを足したものを
頂点にかければOK
です。
今回の場合は下記の式になります。
--------------------------------------------------------------------------
頂点 × (BoneAの変換結果 + BoneBの変換結果
--------------------------------------------------------------------------

そして変換結果の出し方は、

【BoneA】
BOf行列×座標変換行列×逆BOf行列×影響度

【BoneB】
BOf行列×座標変換行列×逆BOf行列×座標変換行列×逆BOf行列×影響度
(水色がBoneA、薄赤がBoneBの行列などと対応してます)

それぞれ上記のようになります。


で、途中計算は省略してますが、
BoneA 0.8BoneB 0.2) と (BoneA 0.6BoneB 0.4)の行列は
それぞれ下記の様になります。

変換結果の和


頂点1、2に上段の行列をかけると、
頂点1(1 1 0) × 画像上段の行列 = (1 0.6 0)
頂点2(1 2 0) × 画像上段の行列 = (1.8 0.8 0)

頂点7に下段の行列をかけると、
頂点7(1 -1 0) × 画像下段の行列 = (2.2 -1 0)

これを図にすると・・・
影響度4
はい、先程みたいに腕がちぎれてません。

「まだ形が変じゃないか」と思うかもしれませんが、
※そもそも頂点数が9個なので察してください。
(実際の3Dモデルはもっと頂点が多いですし、影響度ももっと良い具合に調整されているでしょう。)

要は、影響度で絶妙な調整が出来る ということです。


で、上記の計算式というのは、もともと分配法則により変形された式でした。
--------------------------------------------------------------------
頂点×BoneAの変換結果 + 頂点×BoneBの変換結果
↓分配法則により変形↓
頂点×(BoneAの変換結果 + BoneBの変換結果
--------------------------------------------------------------------

で、この変形した式のほうが計算上、都合が良いです。
何故かというと、変形前の式だと頂点の数だけ同じ行列をかけなければなりません。

BoneA・BoneBの影響を受ける頂点0、1、2を座標変換させるとすると、
----------------------------------------------------------------------
頂点0×BoneAの変換結果 + 頂点0×BoneBの変換結果 = 変換後の頂点0
頂点1×BoneAの変換結果 + 頂点1×BoneBの変換結果 = 変換後の頂点1
頂点2×BoneAの変換結果 + 頂点2×BoneBの変換結果 = 変換後の頂点2

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

しかし、変換後の式だと、例えば変換結果の和を合成行列としておけば、
計算回数が非常に少なくなります。
-------------------------------------------------------------------------
合成行列 = (BoneAの変換結果 + BoneBの変換結果

頂点0 × 合成行列 = 変換後の頂点0
頂点1 × 合成行列 = 変換後の頂点1
頂点2 × 合成行列 = 変換後の頂点2

-------------------------------------------------------------------------
この通り。

で、スキンメッシュアニメーションでは、3Dモデルを読み込んだときに、
同じボーンの組み合わせから影響を受ける頂点を予め纏めておきます。
※更に、同じ影響度ごとに纏めておくと良い。
BoneA 0.5 BoneB 0.5  ⇒  BoneA 0.5 BoneB 0.5
BoneA 0.2 BoneB 0.8  ⇒  BoneA 0.5 BoneB 0.5 
BoneA 0.5 BoneB 0.5  ⇒  BoneA 0.2 BoneB 0.8
BoneA 0.2 BoneB 0.8  ⇒  BoneA 0.2 BoneB 0.8


そして纏められた頂点ごとに、合成行列をかけて変換するのです。
BoneAとBoneBの影響を受ける頂点を全て変換
BoneCとBoneDの影響を受ける頂点を全て変換
              :
みたいな。


×××××××××××××××××××
STEP5 法線の計算
×××××××××××××××××××

今まで、頂点をぐにゃぐにゃと動かしてきました。

で、ノーライティングモード(物体に光がどう当たっているのか?を考慮しない)なら
頂点を動かすだけでも一応 問題は無いのですが、
3Dモデルに法線の情報がある場合は
頂点だけを動かすと問題が発生します。

コチラをご覧下さい↓
法線
単純に板ポリゴンにテクスチャを貼り付けただけの物です。

この状態から、頂点だけをX軸中心に90度回転させて見ます。
そうすると・・・
法線2

はい、真っ黒になりました。

何でこんなことになるかというと、法線は反射してくる光の方向を表すものなので、
正しい方向を向いていないと、
正しく光が反射しない=物体が見えないと言う事になるのです。
(ブラックホールみたいに、光が反射せず真っ黒に見える状態)

なので、法線の情報がある場合は 頂点を動かしたら
法線も再計算する必要があります。

【参考画像】
法線3
(まぁ、自前で実装しない場合は
DirectXのヘルプ関数群とかが内部でやってくれるっぽいですが。)

で、法線の再計算はどうやるの?というと、 頂点と同じです。

上の方で
頂点(x y z)×合成行列という式を書いてますが、同じように
法線(x y z)×合成行列とすればOKです。
頂点を変換する際にまとめて変換してしまいましょう。

ここで注意事項。
同じように計算した後、 法線ベクトルは正規化する必要があります。
正規化というのは、法線の大きさが1になるように調整する事です。

で、端的にベクトルの大きさの求め方と、正規化の仕方を書きます。

ベクトルの大きさの求め方------------------------------
  ______________
√(xの2乗 + yの2乗 + zの2乗) = ベクトルの大きさ

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

正規化の仕方---------------------------------------
【1】ベクトルの大きさを求める
【2】x、y、zを、それぞれベクトルの大きさで割る

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

法線ベクトル(2 0 0)があった場合、下記の様に正規化します。
--------------------------------------------------------------------------
  ______________
√2の2乗 + 0の2乗 + 0の2乗
  _
√4   =     ←ベクトルの大きさ

(2÷2 0÷2 0÷2
(1 0 0) ←正規化終了。
--------------------------------------------------------------------------

法線に関しては、
【1】頂点と同じように変換する。
【2】正規化する。

と覚えておけばよいでしょう。

今回のまとめ
----------------------------------------------------------------------------
・影響度によって、絶妙な3Dモデルの変形が出来る
・予め同じボーンの組み合わせから影響を受ける頂点を纏めておくと、効率よく計算できる。

・法線がある場合、法線も頂点と同じように変換する
・ただし、法線は最後に正規化する必要がある。
----------------------------------------------------------------------------

最後に。
この解説シリーズ(?)はあくまでも概念や、計算方法などの説明のみなので、
具体的なプログラムは提示していません。
というか、まだ自分でも実装出来てな

プログラムが完成したら、
今までのまとめと、スキンメッシュアニメーションのプログラムの流れでも書こうかなと思います。

ほぼ概念は説明してしまったので、恐らく
次回で 最終回です。
※いつになるかは不明だよ
スポンサーサイト

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

コメント

No title

凄く勉強になります。ありがとうございます。

No title

お役に立てればうれしいですv-290
スキンメッシュアニメーションは、本当に
最初は全く皆目見当がつかない技術だと思いますv-393

でも、解説してある書籍やサイトが少ないだけで、
処理の仕組み自体はそんなに難しくないと思うので、
開発など頑張ってください!v-411

コメントの投稿
管理者にだけ表示を許可する



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