3Dモデル
-スキンメッシュモデル-

unity_chan_logo

■概要

スキンメッシュモデルとはアニメーションの際にメッシュが変形するモデルのことです。
メッシュを変形させることを「スキニング」、スキニングするメッシュを
「スキンメッシュ」と呼んでいます。
※この記事の3DモデルのフォーマットはXファイルです。

gmpg_0167

●必要知識
	スキンメッシュモデルを理解するには以下の項目について
	知っている必要があります。

	ポリゴン
	3Dモデル基本
	階層つき3Dモデル

●使用理由
	スキンメッシュはキャラクターなどの人物モデルに使用されていますが
	これはスキンメッシュを使用したアニメーションでは
	メッシュの変形により、筋肉の動きや関節のつなぎ目を滑らかに表現できるので、
	動きだけではない、よりリアルなアニメーションが実現できます。

	gmpg_0168

■ボーン

ボーンとはスキニングを行うために使用される関節の役割を与えられたデータです。
ボーンはモデルに関連付けられていますがメッシュのフレームには含まれておらず、
専用のデータとしてファイルに存在します。

●ボーンの見た目
	3DCGソフトなどでのボーンは以下のような形状をしていることが多いです。

	gmpg_0170

	絵でも書いていますが、ボーンの始点はとがっている部分の反対側です。
	そこを始点としてどの方向を向いているかをとがっている部分で表現しています。

●ボーンの役割
	ボーンの役割は「関節」です。
	人型モデルでは肩やひじ、手首などにボーンを設定します。
	このボーンを変更(回転など)することで、ボーンに関連付けられた
	メッシュがスキニングします。

	gmpg_0169

●ツリー構造
	ボーンは1つのボーンを頂点としたツリー構造によって管理を行っていますが
	ボーンはモデル本体のフレームとは別で管理をしています。
	モデル本体のフレームが保持しているボーンの情報は
	フレーム内のポリゴンとボーンを関連付ける情報だけです。
	(どのボーンを使用して、どれくらい影響をするのか)

	gmpg_0171

●ポリゴンへの影響
	スキンメッシュのポリゴンは自分自身に影響を与えるボーンの情報を持っています。
	もし、そのボーンが変更された場合、ポリゴンにも影響が及びますgmpg_0172

	上の絵ではボーンBを回転したことで二つのポリゴンに影響を与えています。
	このボーンがポリゴンがボーンに影響度はポリゴン毎に設定します。
	ポリゴンは影響を与えるボーンとその影響度の指定をされており、
	影響を与えるボーンが変化するとポリゴンも合わせて変更されます。
	このボーンがポリゴンに与える影響度は「重み」と呼ばれています。

	・重みの範囲
		ポリゴンに与えるボーンの重みは最大1.0で設定されます。
		この値は影響を与えるボーン全ての重みを合わせた値です。
		つまり重みの合計値が常に1.0になるように設定されています。

●ボーンの本質
	ボーンの本質は向きと位置が合わさった行列で、
	アニメーションをしていない初期姿勢の行列が設定されています。
	
	・相対か絶対か
		ボーンの行列は親のボーンからの相対行列か、
		モデルのローカル座標の絶対行列のどちらかが設定されていますが、
		これは3Dモデルのファイル形式によって異なります。

	・逆行列
		ボーンを変更するためには初期姿勢行列の逆行列が必要となります。
		これは回転の問題を解決するためです。
		まずは正解のボーンの位置変更が下の絵です。

		gmpg_0175

		次に誤った回転を行ったボーンの位置変更です。

		gmpg_0173

		誤った回転ではボーン2は原点から離れた位置で回転を行っているので、
		正解の位置とは異なった位置に移動しています。
		この問題はボーン2を一旦原点に戻し、
		回転後に元に位置に戻すことで解決します。

		gmpg_0174

		上の図の手順②のボーンを原点に戻す際に初期姿勢行列の逆行列を使います。
		この逆行列は基本的に毎フレーム使用するので、
		最適化としてファイル読み込み時に逆行列を割り出して
		必要な際に使うようにしています。
		また、手順③の元に戻す際には初期姿勢行列を使用して戻します。

■階層有りとスキンメッシュの違い

階層有りモデルとスキンメッシュモデルはツリー構造で
フレーム、またはボーンを管理しており、
親の動きが子に影響するという点も同じです。
この二つのモデルの違いはフレーム単位で動かすのか、
ポリゴン単位で動かすのかの違いになります。

gmpg_0176

上の絵は左がスキンメッシュ、右が立方体や球体を親子関係にして
人型の腕や体になるように配置したものです。
この立方体や球体の1つ1つがフレームと考えてください。


●階層有りの場合
	階層有りのアニメーションでは親フレームの姿勢行列(移動、回転、拡縮)を
	元にして、子供のフレームの姿勢行列が決まります。
	この時、メッシュはフレームの姿勢行列にあわせて変更されますが、
	メッシュの形が変わることはありません。

	gmpg_0177

	上の絵では立方体を使用した人型にポーズを取らせていますが、
	関節の部分がめり込んだり、隙間が開いています。
	これは立方体や球の各フレームが移動、回転、拡縮して、
	それをそのまま表示しているので、このような結果になっています。

●スキンメッシュの場合
	スキンメッシュでも親ボーンの姿勢行列(移動、回転、拡縮)を元にして
	子ボーンの姿勢行列が決まりますが、スキンメッシュではこの行列を
	メッシュと掛け合わせて基本的な表示位置を決めます。
	その際にポリゴンはボーンの影響を考慮に入れて計算されるので、
	スキニングされることになります。

	gmpg_0178

	上の絵は人型のモデルにポーズを取らせていますが、
	階層有りのモデルとは異なり、関節のめり込みや隙間がほとんどなく、
	滑らかにポリゴンがつながっていることが分かると思います。
	これは各ポリゴンがボーンの影響を受けてスキニングしたことにより、
	ポリゴン同士のつながりを崩すことなく描画できているということです。

gmpg_0179

同じポーズをしたモデルを並べています。
関節部をきちんと表現するならば階層モデルによるアニメーションではなく
スキンメッシュモデルを使用してアニメーションを行うべきです。