ポリゴンメッシュでキャラクタを作成(スキン編)
ポリゴンメッシュのモデリングが出来、ボーンも割り当てた後は、ポリゴンメッシュとボーンをつなぐための「スキン」設定を行います。
スキンの種類
Shade 3Dでは、古くからある「クラシック」スキンと新しい「頂点ブレンド」スキンの2つの種類があります。
「頂点ブレンド」を使用することで、他ツールと互換性のあるスキン変形を行うことができます。
「クラシック」はShade 3D内の独自の計算であるので、特に理由がなければ「頂点ブレンド」を使用するようにしてください。
スキンって何?
では、そもそもスキンとは何でしょうか?
キャラクタにモーションをつける際は、Shade 3Dでは以下のような手段が存在します。
- 直線移動ジョイントやパスジョイント内に形状を入れて動かす
- ポリゴンメッシュまたは自由曲面にボーンやボールジョイントをスキン割り当てし、ボーンまたはボールジョイントの動きに合わせて形状を変形させる
他、スイッチジョイントや変形ジョイント、カメラや光源のモーションなどがあります。
ボーンもジョイントの一種になります。
以下の例では、ポリゴンメッシュの腕にボーン構造をスキン割り当てし、ボーンを動かすことでポリゴンメッシュを変形させています。
言葉通り「骨」ですね。骨を動かすことで、肌(skin)が付いてくるわけです。
スキンは、固定の形状とそれを動かすジョイント(ボーン)の間に存在し、形状を間接的に動かすための手段となります。
ここでは、スキンを割り当てるポリゴンメッシュ、モーションで使うボーン、の2つに限定して説明することにします。自由曲面や他のジョイントでもスキンを使えますが、あくまでも他ツールにデータを渡すのを目的にしますので。
ポリゴンメッシュでのスキンは、頂点ごとに複数のボーンがどれくらい影響を与えるかというのを「ウエイト値」として指定することになります。
1つの頂点に影響を与えるボーンの数はShade 3D内では無制限ですが、MMDでは2つ、リアルタイム系では上限が限定されてる場合が多いです。
下の画像では、円柱にboneA/boneBのボーンを割り当てています。boneCは先端となります。
boneAの中心からboneBの中心を結んだ箇所がboneAの管理下、boneBの中心からboneCの中心を結んだ箇所がboneBの管理下になっています。
円柱の中央付近(boneBの中心付近)の頂点のウエイト値がboneA = 0.5、boneB = 0.5であるときは、boneBの回転で両方のボーンの影響を均等に受けます。
円柱の根元付近の頂点では、boneA = 1.0、boneB = 0.0のウエイト値になっています。この場合は、boneAだけの影響を受けます。
これでボーンを曲げると、ポリゴンメッシュも滑らかに変形することになります。
頂点ブレンドの場合は、各頂点ごとのウエイト値の合計が1.0になるように自動計算されます。
スキン設定
Shade 3Dでスキンを割り当てる方法について説明します。
スキンを割り当てる (オートバインド)
ポリゴンメッシュとボーンを用意します。
ルートボーンから階層的にボーン構造を作っておきます。
これを、ブラウザ上で同一階層に並べておいてください。fbxエクスポートして他のツールに渡す目的の場合は、シーンルートの直下に配置します。
ポリゴンメッシュを選択。形状編集モード+頂点選択モードでポリゴンメッシュのすべての頂点を選択します。
メインメニューの「表示」-「スキン」でスキンウィンドウを表示し、「頂点ブレンド」ボタンを選択します。
スキンウィンドウの左上の「バインド」ボタンを押します。
すると、選択された頂点に対して自動的に近接するボーンが割り当てられます。
ただ、この状態のままだとボーンを動かしても意図したスキン変形がかからない場合が多いかと思います。
スキンの編集方法
スキンに値を入れる、または修正する方法として以下の3つに分かれます。
- オートバインド
- ウエイトペイント
- ウエイトテーブル
手軽さでは、オートバインド、ウエイトペイント、ウエイトテーブルの順になります。
まず、オートバインドで軽くスキンを割り当ててから、ウエイトペイントで微調整、それでも調整が難しい最終手段としてウエイトテーブルをいじる、となります。
オートバインドは前述のとおりで、ボタン一発です。
ウエイトペイント
ここではサンプルとしてドラゴンにオートバインドした直後のデータを使用して説明します(dragon_modeling_skin_0.shd)。
スキンの確認時は、ジョイントモードにして図形ウィンドウ上でボーンを回転させて確認すると分かりやすいかと思います。
ジョイントモードで尻尾部分のボーンを選択して回転させた場合は、特にオートバインドを行った直後の状態で問題なく変形しています。
このような、ポリゴンメッシュの頂点とボーンが一意なところでは、オートバインドで比較的意図したとおりにスキン割り当てできているようです。
首の調整
neck1のボーンを選択し、ジョイントモードで回転させてみます。
ツノ部分が変形についてきていない箇所が出てきました。ここを修正します。
後でジョイントをリセットしますので、今は変形したままで問題ありません。
ポリゴンメッシュ形状を選択し、形状編集モード+面選択モードにして、一度すべての面選択を解除してください。
これは、ウエイトペイントの表示が見難くなるのを防ぐ対策です。
ツールボックスより、「編集」-「共通」-「ウエイトペイント」を選択します。以降は透視図で作業します。
ツールパラメータで「bone_root」が選択された状態になってます。ここにボーンが一覧されてます。
ポリゴンメッシュの指定のボーンのウエイト値が青-黄-赤で図形ウィンドウ上にグラデーション表示された状態になっています。
今は首から上を調整しますので「neck1」を選択してください。
ツノ部分が青くなってます。これは、首を回転させても変形がついてこないのを示していますので、ここを赤く染め上げましょう。
図形ウィンドウ上で頂点をドラッグすることで、その部分のウエイト値が加算されます。
Tips : ウエイトペイントで塗る]
まず、ペイントの前に図形ウィンドウ上でマウス右ドラッグで影響範囲の円を手ごろなサイズに調整してください。
ウエイトペイント時は、大きく変更したい場合はツールパラメータのウエイトの値を0.5など大きい値にする、細かく調整する場合は0.1など小さな値にするようにします。
これで、図形ウィンドウ上で頂点付近をドラッグすると、移動のたびに指定のウエイト値分加算されます。
内部的には影響するボーンの前後も考慮して、頂点ごとのウエイト値の合計が1.0になるように自動計算されています。
また、間違えて塗ってしまった場合は取り消し(UNDO)するようにしてください。よく使う操作になります。
減算したい場合は、Shiftキーを押しながらドラッグします。ツールパラメータの「タイプ」「減衰」「演算」はデフォルト値のままで変更することは少ないかと思います。
ツノのウエイト値を真っ赤に染めました。ウエイト値を修正したため、変形させたポリゴンメッシュも変化してます。
一度ウエイトペイントから抜けて、neck1のボーンをブラウザで選択。
右クリックしたコンテキストメニューから「全てのジョイントをリセット」を選択して、ボーンのジョイント値(回転/オフセット)をリセットしてください。
なお、ジョイントのリセット操作はシーケンスモードをOffにしないと実行できないので注意してください。
ジョイントモードでneck1のボーンを回転させてみて破綻なく変形しているのを確認します。
一度確認のためボーンを回転させて元に戻したい場合は、取り消し(UNDO)を使うのが便利かと思います。
これがもっとも基本的なウエイトペイントでの調整方法になります。
その他、いろいろボーンを回転させて破綻がないか確認していきましょう。首より上は、同じ方法で調整できますがそうもいかない箇所も出てきます。
そう考えると、このドラゴンの題材はなかなかいい練習になるかと思います。
足の調整
ジョイントモードで「left_leg_front_1」のボーンを選択して回転させてみました。
足に連動して、腹の部分も出っ張ってしまいました。ここを調整しましょう。ウエイトペイントで「left_leg_front_1」のボーンを選択します。
たしかに腹の部分にウエイト値が割り当てられていますので、今度は減算です。
Shiftキーを押しながら腹部分の頂点をドラッグして塗っていきます。
ペイントしてもまだ腹は出っ張ったままです。
では、次に子ボーンである「left_leg_front_2」を選択してみます。あ、こっちが赤くなってますね。ここも減算対象です。
「left_leg_front_2」のウエイト値を調整しました。ところが、まだ腹が出っ張ったままです。
このまま「left_leg_front_1」に戻ってみると、せっかくウエイト値を減算した部分が赤く戻ってしまいました。
これは無限ループの予感!!
ここで、ウエイトペイントの特徴を説明しておきます。
Tips : ウエイトペイントでの塗りの挙動]
ウエイトペイントで塗る作業というのは以下のような動きをしてます。
頂点ごとに影響を与える複数ボーンのウエイト値の合計は1.0に補正されます。
「left_leg_front_1」に加算でペイントした場合、合計1.0になるということは影響する親と子の「legs」「left_leg_front_2」は減算されることになります。
逆に、「left_leg_front_1」に減算でペイントした場合、影響する親と子の「legs」「left_leg_front_2」は加算されます。
「left_leg_front_1」で減算したので「left_leg_front_2」のウエイト値は増加し、次に「left_leg_front_2」のウエイト値を減算すると、今度は「left_leg_front_1」が増加した、ということになります。
ウエイトペイントで値がいったりきたりしてしまう、という問題を解決するにはさらに上の「legs」も見たほうがよいということになります。
では「left_leg_front_1」の親の「legs」のウエイト値を見てみましょう。
腹の部分が青くなっていました。ここを加算でウエイトペイントし、赤く染めます。
腹の出っ張りがおさまりましたね。
念のため、「left_leg_front_1」「left_leg_front_2」をもう一度見てみます。
これで、ウエイトペイントを一度閉じて、ジョイントモードで「left_leg_front_1」「left_leg_front_2」を動かしてみてください。
それらしく変形するようになってるかと思います。
これで「全てのジョイントをリセット」でジョイントをリセットしておきます。
足は全部この手順で調整できます。
ウエイトペイントは、操作対象のボーンとその子のほか、親ボーンも見たほうがいいというのが分かりました。
羽の調整
羽部分も足の調整と同じ手順で調整できます。
ジョイントモードで左羽のボーン「left_wing_1」を回転させてみます。背中の部分が変形でついてきてしまってます。
足のウエイト値を調整した経験から、ひとつ飛ばして「left_wing_1」の親の「wings」のウエイト値を先に調整してみます。
ウエイトペイントで「wings」を選択し、背中部分を赤く塗りつぶします。背中のでっぱりはおさまりましたね。
念のため、「left_wing_1」のウエイト値を確認しておきます。
ウエイトペイントから抜けてジョイントモードで「left_wing_1」を回転させて変形が意図したとおりになっているか確認します。
右羽も同様に確認しておきましょう。
これで、一通りスキン割り当ての修正ができました。このドラゴンでは、結局はウエイトテーブルを使うことはありませんでしたね。
オートバインド、ウエイトペイントでも調整しきれないところが出てきた場合は、数値指定のウエイトテーブルも見るようにしてみてください。
スキンを割り当てて調整した最終データをdragon_modeling_skin_last.shdとして保存しました。
ここまでのデータのダウンロードはこちら。
文:ft-lab
この記事へのご意見・ご感想などはこちらで受け付けております。