「今日の作業はスキンウェイトの設定。心弾む瞬間!わくわくしてたまんないな~。」
未だかつてこのように三度の飯よりスキンウェイト調整が好きという人の話を聞いたことありませんので、普通はイヤイヤやっているという感じでしょう。
個人的にはこの作業は散髪のような感じで、基本的な部分、技術を抑えれば誰もがある程度上手く早く行えると思っています。当然仕上げに腕の良し悪しが絡んでくるのですが。
というわけで、今回はスキンウェイトの調整技術を紹介してみたいと思います。スキンウェイト調整って案外すっきりできるものなんだあなと感じてもらえればよいのですが、さてどうなることか。素早く終わってなおかつきれいに仕上がる様をみると、スキンウェイトもなかなか楽しいものです。ぜひ実践してみてください。
ちなみに今回取り上げるのは昔からあるSmooth Bind(Classic Linear)です。Dual QuaternionやInteractive Skin Bindには触れませんのであしからず。
まず何を重要視するか決める
とりあえずスキニングして動けばいいというキャラクターもいるでしょうし、まばたきや皮膚の動きまで完璧な細かいディテールまで追求することもあるでしょう。キャラクターによって必要とされるレベルは異なります。
毎回それを考えるのは面倒なので、個人的には常に一定のクオリティラインを決めています。それは、
「体積と輪郭を保つ」
という事です。
スキニングで変形して形状がしぼんだりとかすると、途端に古いCGっぽくみえリアリティにかけます。なぜなら現実のものは曲がってしぼむということはないからです。例えば足の変形で見てみましょう。
左の足が変形前で、膝を90度曲げると真中と右の様になります。真中はひざの内側がへこんでしまっています。右はへこまず体積を保っています。輪郭も見てください。真中はいかにもジョイントで曲がっている感じでCGっぽく感じませんか?右は輪郭が保たれ、中身が詰まっているように見えます。ちょっと離れて見ても違いがよくわかります。
体積と輪郭が保たれると遠くから見ても近くから見てもきれいな形が保たれます。また、細かい変形がうまくいっていなくても全体として写実性を感じられるようになります。本当にそこにあるような説得力、これが現代の3DCGに必要なことです。
まあ、そもそも離れて見てきれいに変形していなければ、近くによってもディテールに接近してもきれいには見えないはずですしね…。
デッサンやモデリング、テクスチャの様に大まかなところを決めて、段々と細かいところへ移っていく、大まかな形状がうまく変形できてから細かいディテールまで追求する方が良いと思います。時間があれば細かく作り込めばいいですし、時間がなければそこまでで終わり。途中でやめても全体的な品質は保たれる、という魂胆です。
ゲームのデータとしてもこの作り方は都合がよいです。大まかなところから作っていくので、最低限必要なスキンウェイトを割り当てることになり、データの節約ができます。またLODモデルで低ポリゴンのモデルにスキンウェイトを転送する時にも上手く転送できます。
というわけで、基本的なアプローチの指針が決まったところで、細かいところを見ていきましょう。
1つのジョイントにスキンウェイト100%だと何が起きる?
スキンウェイトはジョイントの影響数、もしくはウェイト数と言った方がわかりやすいでしょうか、その数で変形の傾向が変わります。一つのジョイントに対して100%スキンウェイトが割り当てられている状態、いわゆる1ウェイトのスキニングでは、変形にどういう特徴があると思いますか?
答えは、親子付したオブジェクトの様に「完全に形を保って変形」します。ジオメトリは「伸縮しません」。つまり体積が完璧に保たれます。工業製品などは基本的に伸縮しないので、1ウェイトのスキニング設定します。
人体のスキンウェイトを調整する場合、太ももやひざ、二の腕は”あまり”伸縮しません。ウェイトはそれぞれ対応するジョイントに100%割り当てます。実際は微妙に伸縮していますね。そういう細かい調整は後ですればよいので、始めは無視します。
2つのジョイントへのスキンウェイトでは何が起きる?
これを2ウェイトのスキニングと呼びます。2つ以上のジョイントにスキンウェイトを割り当てると「伸縮します」。体積が変化します。人体の変形で主に伸縮するのは関節ですので、関節部分には2つ以上のスキンウェイトを割り当てることになります。
1ウェイトと異なりジオメトリ形状を大きく変化させるので調整が必要となります。スキンウェイトの品質が問われるのはココのスキンウェイトなのです。
というわけで人体ならまずは関節近辺に2ウェイト、それ以外は1ウェイトになるように調整します。それから細かい作業を始めます。
スキンウェイトをいくら調整しても変形がうまくいかないなら、ジョイントの位置があってないか数が足りてないのでそちらでの調整を検討します。もしかしたらエッジの切り方が悪いのかもしれません。
ゲームでは処理速度やハードの制限上ジョイント数を増やせなかったりします。そういう時は頭をひねってなんとか上手くやる方法を考え出します。が、大体大したアイディアは出ないです…。だって品質比は「ジョイント7:3スキニング」ですもの。3はいくらがんばっても10にはなりません。ほどほどであきらめて家に帰って新作ゲームで遊んだほうがためになることが多いかもしれませんよ。