LightWaveで二次元キャラ系人物モデリング奮闘記 ―まつ毛編―

最終更新:2016/09/06

今回はまつ毛のモデリング。まつ毛の話は最初のほうの顔のモデリングで少ししたけど、最終的にモデリングで作るのか、テクスチャで描くのかを決めずに仮設のまま放置していた。大幅に順序が前後するけど、瞳をすり鉢状にしてディテールを改善したことだし、まつ毛もモデリングで作ることに決め、ここで詰めていくことにする。

ボーン・ウェイトの記事でも少し触れたけど、ここでウェイト・マップを応用したサーフェースのパラメータ調整にも挑戦してみる。

頭の連続したポリゴンだけを取り出すと、現状は次の画像のようになっている。ちなみに、頬の紫色と首の赤色のスケッチ色は「法線の折り目」検出を使わずに顎のラインの境界線をunReal Xtreme2に確実に認識させるためのもの。

Cilia000

まつ毛のモデリング

まずは仮設のまつ毛の黒いポリゴンをすべて削除し、次の画像のようにまつ毛の裏打ちとして残しておいた眼窩の周囲のポリゴンを選択する。細かい部分なのでサブパッチは一時解除しておいたほうが作業しやすい。対称モード(Shift+Y)にしておくと左目のモデリングと同時に右目のモデリングも同時に進む。後頭部がガタガタなのはこの際気にしないで欲しい。

Cilia001

例によって拡張プラス(Eキー)でポリゴンを追加し、次の画像のように必要な分だけ前に押し出す。具体的には16mmだったけど、顔のスケールが1m以上あるのでほんの1~2%程度の範囲。

Cilia002

まつ毛用のサーフェースは既に作成済みなので、どこからどこまでがまつ毛なのかわかりやすいように仮設のまつ毛に使っていた色を着けておく。

Cilia003

まつ毛を伸ばしたい側面のポリゴンを選択し、拡張プラスと移動ツールで拡張する。この時点でまつ毛の先端は顔から離れることになる。

Cilia004

拡張したポリゴンの上下、前後のポイントを次の画像のように中央の1点に集約させる。スナップドラッグツール(Shift+G)を使ってもいいし、目標のポイントを中心にして拡大縮小ツール(Shift+H)を使って0%まで縮小してもいいし、ポイント情報で座標を直接入力してもいい。ポイントを結合してしまうとまつ毛の先が尖らなくなってしまうので、例によってポイントは結合しない。

ポイントを結合しないと気持ち悪いということであれば、サブパッチの場合はサブパッチ・ウェイト、キャトマルの場合はエッジ・ウェイトを使って尖らせる。ポイントを結合した場合は線ポリゴンが一定数できるので、忘れずに削除しておく。なお、ポイント結合時に限り対称モードを解除しておかないと左右のまつ毛がつながってしまうのでその点だけ注意。髪の毛と異なり、まつ毛の場合は尖らせたい箇所が数えられるほどしかないので、ウェイトを使うのも手ではある。

Cilia005

まつ毛の目尻側の下端が眼窩の外側のポリゴンのエッジにも接続していると目を綺麗に囲んでくれないことが判明したので、ポイントの結合を解除(Ctrl+U)し、眼窩の内側に接続し直した。その際、まつ毛の裏側にあたる顔側のポリゴンがひとつ不足するため、ポリゴン作成(Pキー)で三角形のポリゴンを追加した。

Cilia006

対称モードを適切に使用してモデリングしていれば、左目のまつ毛が完成する頃には右目のまつ毛も概ねできあがっているはず。まつ毛の眼窩の内側への接続し直しとポリゴンの追加だけは左右を個別にやらないといけないので若干効率が悪いけど、テクスチャを使わないことに決めたのだから、そのくらいの手間は惜しんではいけないのかもしれない。

Cilia007

ウェイト・マップを応用した色調調整

これで終わってしまうとただの作業記録になってしまうので(ブログだから別にそれでもいいのかもしれないけど)、ちょっと新しいことをする。

まつ毛の目頭側の下端がくっきりしすぎているので、少しぼかしたい。モデリングで短くすることも考えたんだけど、パッチ単位でしか短くできないので、大幅に短くなってしまう。そこで、ボーン・ウェイトとは無関係のウェイト・マップを活用する。

新規ウェイト(Weight Map)で「Cilia_Weight」という名称のウェイト・マップを追加する。

Cilia008

目頭側のポイントに外側から順に「100%」、「50%」のウェイト値を設定する。

Cilia009

モデラーのプレビューではウェイト・マップの効果を確認できないので、レイアウトでサーフェースの詳細を設定する。色のテクスチャ設定でグラディエント・マップを選択し、次の画像のように50%のキーから100%に向かって肌色になるようにグラデーションを設定する。

Cilia010

かなり微妙ではあるけど、目頭側の色調が若干ぼやけた。もう少し研究が必要そうだけど、やろうとしたことはわかるのではないかと思う。

Cilia011

途中経過

遠景にするとウェイト・マップによる色調調整はほとんどわからなくなってしまうけど、まつ毛が増量されて目力が更に増し、顔の情報量が増えてきた。そうすると、今度は首から下の情報量の少なさが気になってくる。

Cilia012

関連記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―瞳編―

最終更新:2016/09/06

ここでちょっと脱線。これまで瞳にはUVを使わずに平面状にテクスチャ・マップを貼り付けていた。二次元キャラクター風の3DCGモデルを作りたい場合、目は平面か若干凹ませるくらいで造るというのは前の記事でも書いたけど、それを更に進め、瞳をすり鉢状に造型してハイライトと陰影をコントロールすると同時に視線の方向をわかりやすくする。

この手法は本来、設置されている環境の光源によって見え方に影響を受けるフィギュアの造型に関するものなんだけど、3DCGにも応用できるのではないかと思い、以前から試してみたいと思っていた。

概念図

基本的な考え方を簡単な図に示す。次の画像のような平面状の目の場合、斜めから見ても光の加減に関係なく単純に斜めに見えるだけなので、ハイライトや陰影といった視覚情報をテクスチャにあらかじめ描き込んでおく必要がある。また、視線がどこを向いているのかわかりにくい傾向がある。

Pupil018
平面状の目

一方、次の画像のようなすり鉢状の目の場合、斜めから見ると光の加減でハイライトや陰影が生じるため単色のサーフェースでも情報量が多くなる。また、瞳の中心が左右どちらかに圧縮して見えるので視線がどちらへ向いているのか想像しやすい。

Pupil019
すり鉢状の目

なお、念のため前置きしておくけど、本記事は平面状の目に対してテクスチャ・マップを貼る手法を否定するものではない。あくまでも個人的好奇心と実験的要素が大きい。

平面状の目のテクスチャ・マップ

現状、目のモデルは次の画像のようになっている。

Pupil000

斜めにすると次の画像のように見える。これでも問題ないと言えば問題ないんだけど、どの方向から見ても陰影に変化がなく、立体的にも変わり映えがしない。

Pupil001

テクスチャ画像には次の画像を使用しており、元はInkscapeでベクター画像として作成したものをPNG画像としてエクスポートしたもの。目に落ちている影も一応描き込んであるものの、目の形状の都合でほとんど見えていない。

Pupil002

テクスチャ画像は円形だけど、目のサイズに合うようにX軸方向とY軸方向のスケールを調整して貼り付けている。

Pupil020

すり鉢状の目のモデリング

ボックスをメタフォームで細分化して球状に形成していってもいいんだけど、すり鉢状にしていくことを考えるとボールから作ったほうが良さそうだったので、ボールから作る。「サイド」は顔側の形状に合わせて8面にした。「分割数」は少し多めに12とした。多すぎる場合はバンドグル(Band Glue)で整理すればいい。

Pupil003

目は概ねZ軸方向を向いているので、ボールの中心軸をZ軸方向に向ける。

Pupil004

サブパッチを適用し、前に出っ張っているほうをZ軸に反転(Flip It)させて、瞳の前縁くらいまで移動させる。ポリゴンが裏返ってしまうので、法線を反転(Fキー)させる。黒く見える線は背景レイヤー。テクスチャ・マップで作った平面状の目の大体の位置と大きさを把握するためのもの。

Pupil005

瞳の内側にあたるエッジやポイントをループ選択(Select Loop)などで円環状に選択し前後に移動させ、拡大縮小(Size)ツール(Shift+H)で凸部分の大きさを調整しながら起伏を増やして造型していく。瞳の中心を一番暗くしたい場合は光が差し込まないように更にもう一段深くする。すり鉢の角度をあまり深くしすぎて瞳の中心が見えなくなってしまっては本末転倒なので、最大でも45°が限度といったところだろう。

サブパッチがかかっていると鋭角のエッジは想像よりも鈍りやすく段差の高さを調整しづらいので、折り返し箇所が苦しくなってきたら拡張プラス(Eキー)で平面の段を追加する。円形だからバンドグルによるポリゴンの再統合も容易なので、とりあえず一段分割してみてから考えてもいいと思う。

Pupil006

瞳の造型が大体できたら、眼窩の形に合うように白目の部分を形成する。平面状の目を先に作っていたので、それを構成するポイントを利用し、スナップドラッグ(Snap)ツール(Shift+G)で合わせた。スナップドラッグはポイントの結合はしないので、単純に既存のポイントに位置合わせをしたい時に便利。

最初からすり鉢状の目を作る場合は、ポリゴン数が単純に多いので瞳の位置や向き、白目の面積の調整に苦労するかもしれない。瞳に平面状テクスチャを使っていればレイアウトでも位置や大きさの微調整はできるけど、モデリングで瞳を作った場合はレイアウトでの調整は困難になる。

また、中心軸がZ軸方向に完全に平行なすり鉢状では横から見た時に瞳がまったく見えなかったり、不自然に出っ張っているように見えることもあるので、移動ツールで瞳の左右外縁を後ろに押して歪ませたり、瞳の正面方向を維持しつつ横からも見えるように斜体(Shear)ツール([キー)で加工する必要がある。ニュートラルな視線を正面に向けたい場合でも、やや寄り目くらいに調整しておかないとレイアウトに持って行った時に左右の視線がヒラメのように外向きに開いて見える。

何の目安もなく感覚でモデリングするのは結構難しいので、参照用に眼窩の形や向きがわかるような適当なポリゴンを作っておいてそれを背景レイヤーに敷いてモデリングすると少し楽になる。

瞳の幅をストレッチ(Scale)ツール(Hキー)で80%くらいまで縮小し、ハイライトにあたるボックスを追加する。

Pupil007

ハイライトのボックスを選択し、細分化(Subdivide)ツール(Shift+D)の「メタフォーム」で分割する。1回で十分だと思うけど、もっと球状に近くしたい場合は更に分割する。

Pupil008

完成したすり鉢状の目が次の画像。右目は鏡面X(Mirror X)で作るけど、一般的に二次元キャラクターのハイライトは左右対称にならないので、複製後に位置を調整する。鏡面(Mirror)ツール(Shift+V)で右の瞳の正中線に位置するポイントの座標を参照して複製するとX軸方向は比較的簡単に合わせられる。

Pupil009

顔に移す前に頭のボーン・ウェイトを設定する。次の画像のようにビューをウェイトシェイドに変更する。

Pupil010

「マップ」メニューグループのMAP値指定(Set VMAP)で両目全体に100%のウェイト値を設定する。

Pupil011

目を頭のボーンとは独立して制御したい場合は必ずしも頭のボーン・ウェイトでなくてもいいけど、まずはモデリングの出来映えを確認しなければならないのでひとまず頭と一緒に動くものとして扱う。

Pupil012

コピー&ペーストで顔のあるレイヤーに複製する。モデラーでは問題なさそうではあったけどレンダリングしたら想像のとおりにはいかなかったことも考え、目は別のレイヤーに残しておく。

Pupil013

サーフェースの設定

目には外側から順に次のサーフェースを設定している。すべてunReal Xtreme2のEdgeTracerシェーダでグループID「4」を設定し、前髪を貫通するように設定してある。

  • Eye_Ball – 白目
  • Eye_Outline – 白目と瞳の境界部分
  • Eye_Pupil – 瞳の外側のすり鉢部分
  • Eye_Iris – 瞳の外側と中心の境界部分
  • Eye_Pupil_Center – 瞳の中心のすり鉢部分
  • Eye_Highlight – 瞳の右上にある固定ハイライト

サーフェースの設定は好みの部分も大いにあるのであくまでも参考程度に。次の画像は白目とハイライトの部分のサーフェース設定。白目とハイライトには髪の毛などの影を落としたくないので、自己発光度(Luminosity)を「100%」、拡散レベル(Diffuse)を「0%」にしている。

Pupil021

次の画像は瞳の外側の輪のサーフェース設定。光源に対してハイライトを生じさせたいので反射光(Specular)を「100%」にして光沢(Glossiness)を「40%」にしている。

Pupil022

次の画像は瞳の中心部分のサーフェース設定。光源に対してハイライトを生じるとかえって違和感があるのでサーフェース色は同じではあるものの反射光(Specular)を「0%」にしている。

Pupil023

引き続きノンリアリスティック・レンダリングにunReal Xtreme2を利用しているけど、目の中のサーフェースにはCelPainterシェーダを使っていない。正確には、使ってみる前にそこそこ良好なレンダリング出力を得られてしまったので細かいパラメータ調整まで試していない。なお、自己発光度を設定しているサーフェースにCelPainterシェーダを併用すると極端に暗く出力されることがある。

ToonTracerピクセルフィルターでサーフェース境界にエッジを引かせている。瞳のサーフェースの周囲にまったくエッジが引かれていないと瞳だけ浮いて見えてしまう上、瞳が小さく見えてしまうためだ。

Pupil024

また、モデリング手法の都合上、鋭角のエッジができやすいので、瞳の中に途切れ途切れの同心円状のラインが生じるのを防ぐ目的で境界検出に「法線の折り目」検出を使っていない。

Pupil025

レンダリング比較

上の設定でレンダリング出力したものが次の画像。顔が大きくなるようにカメラのズームファクターを変更したので相対的にエッジ・ラインが細くなっているように見えるけど、瞳の中だけに限って見れば余分なエッジは出力されていないし、レイトレースによるハイライトも生じていて瞳の中央にも奥行きが出ている。

細かいことを言えば、球状の固定ハイライトが瞳のすり鉢に接触している部分でやや不自然な歪みを生じているので、ハイライトは瞳から少し浮かせるくらいがちょうどいいのかもしれない。フィギュアで宙に浮いているハイライトというのはありえないけど、3DCGの場合は3Dプリンターでの出力を考慮しない限り許される。

Pupil014
すり鉢状の目

次の画像は比較用に平面状の目にテクスチャを貼ったものをレンダリングしたもの。3DCGの場合は平面状の目でもサーフェースを自己発光させることで光源の影響を受けにくくすることはできるからフィギュアのような問題は起こりにくいし、テクスチャの描き方次第なのではないかと言われてしまうとそれまでなんだけど、瞳の印象は変えられたので当初の目的は達していると思う。

Pupil015
平面状の目

遠景にするとやや見え方が異なる。テクスチャを貼った平面状の目を長いこと見ていて見慣れすぎているのですり鉢状の目の陰影が新鮮に見えるだけかもしれない。もちろん、平面状の目にテクスチャを貼っている例は枚挙に暇がないほどで、十分実用に堪えるものなので、もはや好みの問題と言えるかもしれない。

Pupil016
すり鉢状の目
Pupil017
平面状の目

途中経過

どっちでも大差ないと言われてしまえばそのとおりだけど、瞳のすり鉢状モデリングの効果を確認できただけでも満足。

Pupil016

関連記事

参考記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―続・髪の毛 HairBlade編―

最終更新:2016/09/06

最初に作った髪の毛を破棄し、作り直すつもりで仮にかぶせていた髪の毛を本格的にモデリングし直す。

LightWaveでもZBrushのように曲線で髪の束を管理できる機能があったらいいのになぁ、と思って調べていたら、意外と身近にあった。unReal Xtreme2と同じ開発者によるHairBladeというプラグイン。短冊状のポリゴンから髪の毛を作成することを想定したものだけど、工夫次第ではどんな髪型にも応用できる。

LightWave用としては極めて珍しい常駐型のプラグインで、曲線を編集することでリアルタイムに髪型を確認しながらモデリングできる。LightWave 8.xかLightWave 9.x以降の使用を想定したものだけど、LightWave 2015でも問題なく動作する。HairBladeUtilityプラグインも併せてインストールしておくと作業効率を改善できる。

次の4種類のプラグインは頻繁に使うのでユーザーメニューに登録しておく。HairBladeプラグインの中核であるHairBlade PolygonHandlerはインストールした瞬間からモデラーに常駐して動作を開始する。

  • CurveToBlade
  • Blade Edit
  • Blade Freeze
  • HairBlade Manager

これまでサブパッチで1週間単位の時間をかけても納得のいくものができなかったのに対し、3日ほどでイメージに近いものをモデリングできるようになった。これまでは髪の毛のことを考えると気が重くなっていたけど、これで髪型の異なる複数のキャラクターをモデリングするのも苦にならなくなる。

HairBladeを作成する

曲線を元にしてHairBladeを作成するので、最低1本はドロー(Spline Draw)ツールで曲線を引く必要がある。X軸方向からYZ平面を見る側面ビューで次の画像のようにX軸座標の0に1本目を引くといいだろう。

HairBlade000

ドローで引く曲線が経由するポイントの数は任意だけど、あまり少なくても後の作業がやりづらくなるので、ひとまず6セグメントになるように7ポイントにした。曲線の始点と終点は接続せず、開いたままにしておく。

HairBlade001

始点はどこから始めてもいいけど、HairBladeは始点から順にコントロール・ポイントをカウントし管理するので、髪の毛の根元側を始点と決めたら以後一貫して変えないほうがいい。

作成した曲線はポリゴンの一種として扱われるので、ポリゴン選択モードで次の画像のように曲線を選択し、CurveToBladeを選択する。

HairBlade002

CurveToBladeを選択すると、次の画像のようなHairBladeをどのように作成するかの設定パネルが表示される。「Shape Type」は断面の形状を選択できるけど、まだ何も登録していないので、ひとまず「Procedural」にする。Proceduralにはデフォルトとして最も単純なV字形断面が登録されているけど、積極的に使う機会はないかもしれない。「Width」と「Height」パラメータは「Shape Type」に「Procedural」を選択した場合のみ有効で、特に変更する必要はない。「Start Cap」と「End Cap」は始点と終点の終端にフタをするかどうかの選択。後からでも変更できる。

HairBlade003

「OK」をクリックすると曲線が特殊な線状ポリゴンに置き換えられ、線状ポリゴンを中心軸として次の画像のようなHairBladeが作成される。HairBladeは浮動ポリゴンとも言える未確定のポリゴンで、見えてはいるけど実在はしていない。実在していないので、ワイヤーフレームを表示できないし、サブパッチを適用することもできない。ポリゴンを加工するツール類もほとんど使用できない。

HairBlade004

断面の登録

次に、髪の毛の断面形状を登録する。別のレイヤーなどで断面として登録したいポリゴンを次の画像のように作成し加工する。登録可能なポリゴンはHairBladeの方向とは無関係にXY平面方向のみに限られる。ポリゴンが傾いている場合でも法線方向とは関係なくXY平面に垂直に投影される。

HairBlade005

登録したいポリゴンを選択し、HairBlade Managerを起動すと次の画像の設定パネルが表示される。「Capture Shape」をクリックすると選択中のポリゴンが「Shape List」の最初の行に追加される。「Comment」欄にどんな形を登録したのかわかるように記録しておくと後のBladeEditで困らなくて済む。

各ポイントに付けられている番号はポリゴンの始点と終点をわかりやすくするためにあり、UVの区切りに関係する。この画像の場合だと0番目と7番目がUVの区切りになる。0番目のポイントの位置の都合が悪い場合は右下の「Flip」の「<」と「>」ボタンをクリックすることで循環させることができる。

HairBlade006

なお、エッジが連続していない複数のポリゴンをひとつのShapeに同時に登録して「polygon」スライダーで選択することもできるけど、ややこしくなるので複数登録はしない方針。

HairBladeを編集する

HairBladeを選択した状態でBladeEditを選択すると次の画像のような「Shape」タブで「Shape Type」を先ほど登録した断面に変更できるようになっている。「Shape Type」を変更すると「Procedural」シェイプ用の「Width」と「Height」の各パラメータは無効になる。

HairBlade007

Shape Typeを変更すると次の画像のようにHairBladeの形状も変わる。Shape TypeはBladeEditでいつでも変更できるので、最初はあまり深く考える必要はない。

HairBlade008

BladeEditで「Point」タブを選択すると、次の画像のように各コントロール・ポイントの各種パラメータを編集できる。始点から遠いほどPoint番号は大きくなる。Shapeで登録した断面のXY方向が表示されるので、「+X Scale」、「-X Scale」、「+Y Scale」、「-Y Scale」の各パラメータで断面の大きさを調整できる。十字に出ているコントロール・ポイントを掴んでドラッグすることでも変更できるけど、最初からあまり細かく設定してしまうと後の調整に手間がかかるので、大雑把でいい。

HairBlade009

次の画像のように毛先の断面のスケールを「0%」、以降を「12.5%」、「25%」、「50%」、「75%」といったようにあらかじめ段階的に設定しておき、コントロール・ポイント間の間隔を広げたり縮めたりすることで髪の途中の太さの調整を行うようにするとBladeEditを逐一起動しなくて済む。髪の束の数が増えてくるとコントロール・ポイントの編集の手間が馬鹿にならなくなってくるので、自分なりのテンプレートを決めておいて例外が発生した場合のみコントロール・ポイントを編集するようにする。

HairBlade010

HairBladeの向きは始点とその次のコントロール・ポイントの2点で結ばれる方向のベクトルで決定されるので、髪型によっては毛先に進むほど意図する方向とはよじれてきてしまうことがある。そういった場合は、次の画像のBladeEditの「Global」タブで「Rotate」や「Twist」にバンク角を指定し、HairBlade全体を傾かせることで改善できることがある。コントロール・ポイント単位でバンク角を指定することもできるけど、管理が難しいのでHairBladeの特性に慣れてからにしたほうがいいだろう。

HairBlade035

断面の変更

もし、編集中にHairBladeの断面形状が思わしくなくて髪型の調整に限界を感じてきたら、再度HairBlade Managerを起動し、「Replace Shape」でいつでも断面形状を置き換えることができる。

次の画像は髪の束の背面のボリューム不足が気になってきたので、背面側のポイントを更に後ろ(-Y方向)に移動した例。

HairBlade011

サブパッチによるモデリングで一番問題だったのは、髪の毛のボリューム不足に気付いた場合や、断面形状を維持できなくなった場合に大変な労力をかけて修正しなければならなかったことなんだけど、HairBlade Managerを使うとどんなにたくさんのHairBladeが存在していても一括で断面形状を変更できる。このプラグインで最も気に入っている点のひとつ。

前髪の形成

HairBladeの断面の設定が済んだら、最初に作成したHairBladeをポリゴン選択モードで選択した上でCtrl+Cでコピーし、Ctrl+Vで同じ位置に貼り付けて移動させ、髪の束を増やしつつ髪型を整えていく。複製(Clone)ツール(Cキー)や鏡面複製(Mirror X/Y/Z)ツールなどの複製系のツールを使うと線状ポリゴンの始点と終点がつながってしまうので、少々面倒でもコピー&ペーストで複製していく。

次の画像のように中心軸のみが表示されているので髪の流れや密度を直感的に把握、調整しやすく、ストレスが少ない。FiberFXにおける髪の束の中心軸となるガイドとして使用するストランドの編集によく似ていて、実に使いやすい。FiberFXは一種のシミュレーションなのでパラメータを上手に設定したとしても実用的な髪の束の太さには限界があるのに対し、HairBladeはポリゴンなので太さに事実上限度がない。

HairBlade012

HairBlade DisplayLevelで浮動ポリゴンを三面図に表示させることもできるけど、サブパッチでモデリングしている時のように表示が見づらくなりやすいので、髪型の確認はパースビューで行うようにし、線状ポリゴンのみで編集している。

HairBladeの編集はBladeEditで行うのが基本なんだけど、パラメータが多くコントロール・ポイントの選択にも若干手間がかかる上、一度にひとつのHairBladeしか編集できないので、ポイント選択モードの編集ツールを併用すると複数のHairBladeを一度に編集でき、大幅に省力化できる。

具体的には、ポイント選択モードで移動(Move)ツール(Tキー)、ストレッチ(Stretch)ツール(Hキー)、軸でポイント整列(Align Points to Axis)ツールなどは通常どおり使える。ある程度ポイントをまとめて斜体(Shear)ツール([キー)も使えるので、毛先を斜めに揃えたい場合や場所によってある程度不規則性を持たせたい時に活躍する。他にもポイントを対象として作用するツールは使える可能性が高い。

もし、途中でコントロール・ポイントが足りなくなったと感じた時はポイント追加(Add Points/Insert Vertex)ツールで好きなところに増やすことができる。追加したコントロール・ポイントのパラメータは前後のコントロール・ポイントから自動的に求められる。

HairBlade013

ただし、HairBladeの線状ポリゴンはポリゴンであって厳密にはポリゴンではないので、ナイフツールで複数のHairBladeを一括で分割したりデバイドでエッジを均等に分割することはできない。その他、エッジやポリゴンを対象とするツール群はほとんど使えないと考えていい。

選択拡張ツール(Shift+])も線状ポリゴンに属するすべてのポイントが選択されてしまうので、連続面の選択ツール(]キー)と同じ動作になる。いくつか制限はあるものの、ポリゴンを曲線で管理できる便利さを知ってしまうとその程度の制限は気にならなくなってくる。

後ろ髪の形成

よほど個性的な髪型でない限り、後ろ髪にも前髪と同じ方法を使っているとHairBladeの向き(ベクトル)の調整に苦しむことになるので、ボール状のプリミティブを下地にして等角度方向に広がる放射状の曲線を量産して省力化する。

頭の1割から2割増しくらいの直径の適当な分割数のボールを作成し、底面の三角ポリゴンが集中している箇所は削除する。また、次の画像のようにデフォルトとは異なるスケッチ色を設定しておく。

HairBlade014

ボールの頂上部分のポイントとその下のセグメントにあたるポイントを選択し、ループ選択(Select Loop)、開いた曲線の作成(Make Open Curve)を連続で選択し、ボールを囲むような曲線を作成していく。作成された曲線は次の画像のようにデフォルトのスケッチ色で表示されるので、曲線を作成したところとまだ作成していないところを視覚的に識別しやすくなる。

HairBlade015

前にも書いたけど、ループ選択にはショートカットキーが割り当てられていないので、「˜」(Shift+^)に割り当てている(日本語キーボードには書いてないけど、BackSpaceキーの2つ隣り)。開いた曲線の作成をそのすぐ下の「`(グラーブアクセント記号)」(Shift+@)キーに割り当て、隣り合うキーにショートカットを割り当てることで、Shiftキーを押しながら連続で素早く曲線を作成できるようにしている。

作成できたら、次の画像のようにポリゴン状態ウィンドウ(Wキー)で「曲線」のみを選択する。

HairBlade016

作成した曲線をすべて選択した状態が次の画像。スクリーンショットではわかりにくいけど、曲線の始点を示す緑色の小さい円が頂上に表示されている。ループ選択を使用していても、ポイントが下から順に選択されてしまうことがあるので、始点と終点が予想と逆転していないかここで確認しておく。逆転していたら、ポリゴンの反転(Flip)ツール(Fキー)で始点と終点を入れ換えることができる。

HairBlade017

なお、邪魔なら下地にしたボールは削除してしまっても構わない。

選択した曲線をコピーし、HairBladeで前髪を作っているレイヤーにペーストする。

HairBlade018

新しく後ろ髪としてペーストした曲線を選択し、CurveToBladeでHairBlade化する。

HairBlade019

いずれかひとつのHairBladeのコントロール・ポイントのスケールなどを設定し、HairBladeUtilityプラグインのBladeKnotsCopyでHairBlade1本分のコントロール・ポイントの設定を丸ごとコピーする。これで他のHairBladeにBladeKnotsPasteでペーストできる。BladeKnotsPasteにはEdge、Mirror、Repeat、Resetの4種類があるけど、1本分丸ごとコピーする場合はどれでもいい。BladeKnotsPasteの違いを詳しく知りたい場合は公式マニュアルを参照のこと。基本的な考え方はタイル状テクスチャ・マップの繰り返し設定と同じ。

HairBlade020

HairBladeの複製

HairBladeの複製は基本的にコピー&ペーストで行うと上で書いたけど、主に省力化のためにどうしても左右対称に一括で複製したい場合がある。注意点に気をつければ一括複製はできる。

例えば、後ろ髪の内側に頭髪全体のボリューム不足を補うためのもうひとつの後ろ髪レイヤーを作りたいとする。右半分までは自力で作ったものの、左半分も手作業で作っていくのは負担になる。それほど芸術的なモデリングを必要とするところではないので、できれば右側を左側に複製して省力化したい。

HairBlade021

右側のHairBladeをすべて選択し、コピー(Ctrl+C)して同じ場所にペースト(Ctrl+V)する。そのまま選択を解除せずに反転(Flip It)ツールを使用してX軸を中心に反転する。ポリゴンの裏表を反転するツールとは異なるので注意。

HairBlade022

反転した直後の状態が次の画像。HairBladeの先端と根元の間に右側とは異なる浮動ポリゴンができてしまっている。

HairBlade023

三面図で見ると、次の画像のように始点と終点が閉じてしまっているのがわかる。これがHairBladeに不規則な浮動ポリゴンができてしまっている原因。反転ツールに限らないんだけど、複製系のツールは複製後に曲線の始点と終点を閉じようとするものが多い。

HairBlade024

ただ、内部的にはバッチコマンドのように始点と終点を閉じるステップが独立していることがほとんどなので、アンドゥ(Ctrl+Z)で1ステップだけ戻すと始点と終点が開き、次の画像のように不規則な浮動ポリゴンは表示されなくなる。

HairBlade025

三面図を見ると次の画像のように始点と終点を閉じていた線分が取り除かれているのが確認できる。これで複製ができる。ここでは後ろ髪を例にとったけど、もちろん前髪でも左右対称にしたい箇所がある場合はこの方法で複製できる。

HairBlade026

HairBladeのポリゴン化

HairBladeを編集して次の画像のように所望の髪型に仕上がったら、浮動ポリゴンを実在のポリゴンとして確定する。

HairBlade027

BladeFreezeを選択すると同一レイヤーに次の画像のように確定したポリゴンが生成される。HairBladeはそのまま残っているので、確定したポリゴンのみを選んで別のレイヤーに移すことになる。

HairBlade028

HairBladeの浮動ポリゴンには直接色を着けることはできないんだけど、HairBladeの線状ポリゴンにはマテリアルを設定できるので、髪の毛に使うサーフェースが既に決まっている場合はあらかじめそのサーフェースを色・質感(Change Surface)(Qキー)で設定すると浮動ポリゴンにも間接的に着色できる他、BladeFreezeで確定したポリゴンにもそのサーフェースが自動的に引き継がれて設定される。

HairBladeの線状ポリゴンにはスケッチ色を指定することもできるけど、確定したポリゴンにはそのスケッチ色は引き継がれず、デフォルトのスケッチ色が強制的に設定される。これを逆に利用し、HairBladeと確定したポリゴンを分離する。ポリゴン状態ウィンドウで「面」だけを選択しても場合によってはHairBladeがくっついてきてしまうこともあるので、スケッチ色で区別したほうが確実。

HairBlade029

必要に応じて次の画像のようにサブパッチを適用する。断面形状にもよるけど、総じてサブパッチを適用すると髪の束の太さが痩せる傾向にあるので、髪の束の間に隙間があいてしまうなど不都合が発生した場合は必要なHairBladeをすべて選択し、BladeEditで「Global」タブの「W Scale」と「H Scale」を調整するか、HairBladeを編集し直す。

HairBlade030

問題なさそうなら、次の画像のようにビューをウェイトシェイドに変更し、頭に相当するボーン・ウェイトを設定する。

HairBlade031

「マップ」メニューグループにあるMAP値指定(Set VMAP)ツールを選択し、ここでは頭のボーンである「Head」を指定し、髪の毛全体に100%のウェイト値を与える。

HairBlade032

100%に設定すると次の画像のように全体がオレンジ色に染まる。どこのボーン・ウェイトにも属していないポイントがあるとレイアウトで表示が大幅に崩れるので、とにかくなんでもいいのでウェイト値を指定しておく。

HairBlade033

ここまでできたら、体のモデルやボーンがあるレイヤーに髪の毛をコピーし、オブジェクトを保存した後、レイアウトでレンダリングする。

ハネ毛やアホ毛

今回の例では基本に忠実に菱形の断面を利用したけど、俗に「ハネ毛」とか「アホ毛」と呼ばれる二次元イラストや漫画に特有の細長い髪の毛を再現したい場合は円形の断面を使用したほうがいい場合もある。HairBlade Managerを使えば必要に応じていくつでも断面形状を登録できるので、目的に応じて使い分けるといいだろう。

HairBlade034

ただし、これらの断面形状はオブジェクトのデータとしては一緒に保存されないし、LightWaveのバージョンをアップグレードした場合にも引き継がれないので、「Export All Shape」と「Import All Shape」を使ってデータを移行するか、「Capture Shape」で再登録する必要がある。また、使用中の断面形状を単純に削除すると、リストの行がひとつずつ繰り上がるので、BladeEditで断面形状を再度設定し直す手間が生じるので注意が必要。

途中経過

バナナ状の髪の束を並べてモデリングしていた時には試行錯誤を繰り返しながらあんなに苦労してもまったくイメージ通りのものが作れなかったし、作れるような気さえしていなかったのに、HairBladeを使ったらこうもあっさりとできてしまって自分でも驚いている。やはり髪の毛は曲線で直感的に管理できるのが大事だと痛感した。

HairBlade036

応用

HairBladeはその名のとおり髪の毛のモデリングを想定しているものだけど、断面形状の維持に着目して設計されているので、髪の毛以外の棒状や筒状のものを効率よくモデリングするのにも適している。

例えば、断面形状を維持しながら刀身に絶妙な弧を描かせたい日本刀をはじめとする曲刀のモデリングが典型だろう。直刀でも断面形状が複雑なファンタジックなものをモデリングするのにも利用できるだろうし、曲がりくねった杖のようなものをモデリングすることもできるだろう。

メカのモデリングでも、何らかのパイプを特定のポイントを経由して立体的に配管した後、2点間を接続したい場合にも活躍しそうだ。パイプの配管というのは標準ツールだけでは意外と手間取る。

関連記事

参考記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―肌の質感編―

最終更新:2016/10/01

3DCGにおける肌の質感の設定については本当に色々な方法があって、目的にも大きく影響される。アニメーションやゲームの場合はリアルタイム性が重視されるので、可能な限りレンダリング時間を短縮する目的でテクスチャのカラー・マップを最大限に利用して擬似的に肌の質感を再現する。静止画で写実的表現を重視する場合は拡散レベル(Diffuse)、反射光(Specular)、光沢(Glossiness)などのテクスチャ・マップに加えてSSSを使うこともあるけど、写実的表現を追求すると概してレンダリング時間は長くかかる傾向にある。

テクスチャのカラー・マップによる肌の質感の再現はローポリゴン・モデルなどで一般によく行われているので、ここではSSSについてとりあげる。SSSというのは、サブサーフェース・スキャタリング(Sub-Surface Scattering)の略で、透過性を持つ積層構造と見なせる物体に光が入射した時に反射と散乱を繰り返す現象を模擬する技術のこと。日本語では表面下散乱とも呼ばれる。比較的新しい技術で、2000年くらいまでは肌の質感の再現には大変な苦労があった。

他の哺乳類に比べて無視できるほど体毛が薄い人間の皮膚がそういった現象を起こす最たるもので、最も上にある表皮層(美容分野などでは一般に角質層とも呼ばれる)は実際には乳白色の半透明で表皮そのものが肌色をしているわけではない。光は一度表皮層を透過し、その下の真皮層や血管を通して見える血液の色に反射した後、再度入射した表皮層で散乱することによって肌色に見えている。人物の向こうに強い光源がある、いわゆる逆光の状態にある時、表皮層に浅く入射した光が真皮層に達しないでそのまま通過してしまい、皮膚の外縁部に回折現象を起こすことがある。他にこういった現象を起こす物として大理石や牛乳などがある。

LightWaveでSSSを実現するにはノードを使うしかない。SSSを想定したノードと一口に言っても次のような種類のノードがある。レガシー系のSSSノードは過去の作品で使っていた場合のために残してあると言ってもよく、新しく使う必要性はあまりない。

  • レガシーSSSノード
    • Omega
    • Theta
    • Kappa
    • Kappa2
  • SSSノード
    • Sigma
    • Sigma2
    • SSS
    • SSS2
  • 人間の皮膚に特化したSSSノード
    • Simple Skin
    • Fast Skin

ここでは最も人間の皮膚の再現に適したSimple Skinノードを使うけど、LightWave 11でレンダーの仕様が見直されたため、同じ設定でもLW11の前後でレンダリング出力が異なるようになった。

LightWave 10.x

Simpke Skinの設定は次の画像のとおり。Diffuse Color以外はほとんど初期設定のまま。第一表皮層(Epidermis Distance)と第二表皮層(Subdermis Distance)の深さを100mmと大きく設定してあるのは、影の輪郭が鋭く出ないようにするため。本当の人間の皮膚ならこんな数値はありえないんだけど、あくまでも目指しているのは二次元イラスト風なので、表面が柔らかく見えることを重要視した。

ノードの接続については画像を示さないけど、Simpke SkinノードのMaterial出力をSurfaceのMaterialに入力するだけでいい。

SSS000

サーフェースの基本設定でノードを有効にする。ノードを有効にすると他の設定は無効になるため、この画像のとおりでなくても問題ない。

SSS001

Simple Skinは環境の背景色の影響を強く受ける。LW10では背景色をかなり暗くしておかないと肌の色が白く飛んでしまう。

SSS002

LightWave 10によるレンダリング出力が次の画像。unReal Xtreme2のCelPainterシェーダよりは自然な感じなった。拡大しないとわかりにくいけど、unReal2のサーフェース貫通設定をしてある前髪にノイズが出ている。ノイズは気になるものの、これが基準になる。

SSS003

なお、背景はアルファ・チャネルとして出力したので画像編集ソフトウェアでバージョンの違いがわかりやすいように白に変更してある。

LightWave 2015.x

LightWave 2015ではSimple Skinの設定がLW10とまったく同じではレンダリング出力を近似させられないので、第一表皮層(Epidermis Color)と第二表皮層(Subdermis Color)の色の明度を最大にしてある。

SSS004

具体的には、LightWave 11から新しくなったカラーピッカーでHSVのV値を最大の255にする。また、Diffuse ColorもLW10と同じ設定だとかなり赤っぽく出るので、黄色寄りの乳白色にしている。感覚的にはLightWave 2015のほうがDiffuse Colorの影響を強く受けるように思える。

SSS011

サーフェースの基本設定はLW10と同じ。ノードを有効にすると他の設定は無視される。「Vスタックから除外」のチェックは必ず外しておく。

SSS005

背景色をLW10と同じ設定にしていると次の画像のように肌の色が暗く出る。

SSS010

この問題を回避するため、特殊効果ウィンドウで背景色を白に設定する。

SSS006

次の左の画像がLightWave 2015によるレンダリング出力。右のLW10のレンダリング出力と比較して右足と顔のハイライトの面積が狭くなったけど、スカート下の影などで若干見受けられたシェーディングの不自然さがなくなった。サーフェース貫通設定がしてある前髪のノイズもまったく出ていないわけではないけど大幅に軽減された。SSSに関してだけ言えばレンダーの性能は向上していると言えそう。Simple Skinの設定をバージョンを超えて等価にする方法が今のところ不明のため、LW10とまったく同じ出力を得るのは難しそうだ。

SSS007
LightWave 2015
SSS003
LightWave 10

「Vスタックから除外」について

LW10まではサーフェースの「Vスタックから除外」設定はしてあってもしてなくても結果に違いはなかったので無頓着だったけど、LW2015では厳格化されたようで、「Vスタックから除外」にチェックを入れているとSSSが正常に処理されなくなる。

SSS008

具体的には、レンダリング出力が次の画像のようになる。手や足の露出している部分がDiffuse Colorとは関係ない灰色になり、顔にも顎のあたりに灰色のノイズが出ている。

SSS009

Vスタックというのはヴォリューム・スタッキングのことで、マニュアルを読んだ限りでは片面ポリゴンで囲まれた三次元空間を風船のような何もない空間ではなく固体の塊として扱うものらしい。従来は適切に処理されていなかったSSSや透明サーフェースの屈折レイトレースが最適化されるということらしいけど、Vスタックから除外するほうが良い具体例がないので、ちゃんと理解できてはいない。

途中経過

SSSは通常のレイトレースでは得がたい良好なレンダリング出力を得られるのが長所だけど、unReal2のようにグラディエントでハイライトや影の色を明示的に指定できるわけではないので再現したい肌の色がはっきり決まっている場合にはテスト・レンダリングを繰り返す必要があり、調整に時間がかかるのが短所。

SSS007

関連記事

参考記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―unReal Xtreme2編―

最終更新:2016/12/14

一般に、3Dモデルを二次元イラスト風やセルアニメ調にレンダリングするためのシェーダ群を「セル・シェーダ」又は「セルルック・シェーダ」とか「トゥーン・シェーダ」などと呼ぶ。

3DCGは旧来から「フォト・リアリスティック」と呼ばれる現実のものと見紛うような写実的な表現を目指して制作されることが多いけど、イラストやアニメの世界では現実には起こりえない非写実的表現も多い。日本では写実的CGと同じくらい非写実的表現を再現するレンダリング画像の需要も高い。近年では必ずしもセル・シェーディングのみのことを指さなくなったため、非写実的表現に「アンリアル(unreal)」とか「ノンリアリスティック(non-realistic)」という言葉が使われるようになっている。英語としてはどちらも正しい。

LightWaveでセル・シェーダというと、昔から標準でSuper Cel Shaderが実装されているけど、パラメータが感覚的にわかにくく、所望のレンダリング出力を得るには相当な回数のテスト・レンダリングを要する。また、レイトレースに強く拘束され、曲面を曲面としてシェーディングしようとするためアニメ用語で言うところの「色トレス線」でハッキリと分かれるような境界線が出ないという特徴がある。拡散レベル(Diffuse)を利用したシェーディングであるために影が強く出やすいうえ、明るさでしか階調をつけられないので光の当たっている明るい部分と影の部分で色相を変えられないという欠点もある。

それから、セル・シェーディングには輪郭線がつきものだけど、LightWave標準のエッジ・ライン出力は様々な意味で不足が多い。LightWave 11あたりから改良はされているものの基本性能は変わっていないため不足分を補えているとまでは言い難い。

unReal Xtreme2(以下、unReal2)は、LightWaveユーザーの間では知らない人はいないと言われるくらい有名なノンフォトリアリスティック・レンダリング用外部プラグイン。当初はセルアニメ調のレンダリング出力を意図して開発されたものではあるけど、汎用性が高く他の表現にも応用できる強力なツールを提供してくれる。LightWaveには本来実装されていないレンダーレイヤーを備えているなど、もはやLightWaveの枠を脱しているような完成度の高さに目を見張るものがある。英語にも対応しているので海外でも使用実績があるそうだ。

unReal2をLightWaveに読み込ませると、大量のプラグインがインストールされるけど、大半はその機能を追加ノードで実現するためのもので、より高度な利用を想定して用意されているもの。

高機能すぎるが故にすべてを理解できていないし、理解できているものでも全部を書いているとキリがないため、ここではシェーダに絞ってもっとも簡単な使い方を書いていく。原理や詳しい使い方については公式マニュアルを参照のこと。

CelPainterシェーダ

CelPainterシェーダは、その名のとおりセル・シェーディングを実現するためのもの。エッジを検出するためのEdgeTracerシェーダとは独立していて、どちらか片方だけ使用することもできる。最新バージョンの1.51ではCelPainterシェーダを先に指定しても、EdgeTracerシェーダを先に指定しても同じ結果が出力されるように調整されている(古いバージョンでは順番によって結果が異なる場合があるという特徴があった)。

unReal000

シェーダのプロパティを開くと、次の画像のような設定パネルが表示される。デフォルトではサーフェース色を単に暗くするだけの灰色のグラディエントが設定されている。基本は乗算モードでレイヤーが重ねられているので、任意のグラデーションを指定したい場合はサーフェース色を白にしてこの画面でベースカラーをミキシングしていくことになる。グラディエントのキーのインターフェースはサーフェースの基本設定で使うグラディエント・マップとほぼ同じ仕様。

unReal001

スムージングを「ステップ」に設定することでアニメのようなハッキリとした色の境界線を形作ることができる。アニメ調の場合は意外なほど影の部分は少なくていいので、影に相当する色の開始位置を50%から大きく(右に)しないほうがうまくいきやすい。

ここでは特に設定していないけど、「透明度」タブで透明度の設定も可能。

unReal002

「スペキュラ」タブで光沢用の色も設定可能で、ベースカラーや光源色に影響されない特殊な光沢を表現することもできる。アルファ・チャンネルも備えられているので、ベースカラーとうまくブレンドすることで幻想的なサーフェースを実現することもできるだろう。

注意点としては、基本設定の反射光(Specular)が「0%」になっていると次の画像のように真っ黒なグラディエントになり、まったく効果が現れないので、適当な数値を設定しておく必要がある。

unReal003

「設定」タブは基本的には変更しなくてもいい。シェーダ出力をレガシーLWのシェーダ計算方法の特徴に合わせたものにするためのものと、いわゆる「透明」を意味する灰色の市松模様の色を変更できる。

unReal004

EdgeTracerシェーダ

EdgeTracerシェーダは、モデルの輪郭線を出力させるためのシェーダだけど、サーフェースにグループIDを付加して区分することができる。グループIDの概念は最初はとっつきにくいところがあるけど、慣れてくると実に周到な設計になっていることがわかる。

普通にレンダリングさせる分にはグループIDはすべて「0」でいいんだけど、グループIDをうまく設定すると通常のレイトレースでは後ろに隠れてしまうサーフェースを強制的に手前に表示させるという「サーフェース貫通」を設定できる。アニメなどではよく前髪の上に眉が描かれていたり、前髪に隠れているはずの目が見えていたりするけど、それを実現するためのもの。CelPainterシェーダもとてもよくできているけど、unReal2の本領はEdgeTracerシェーダにあると言っても過言ではない。

次の画像は、左目のサーフェースにグループID「1」を設定したもの。目の他に、眉(Eyebrows)やまつ毛(Eyelashes)などのサーフェースにもグループIDに「1」を設定しておく。肌などのサーフェースはすべてグループID「0」に設定してある。

unReal005

次に、前髪にあたる「Hair」サーフェースにグループID「2」を設定する。後ろ髪にあたる「Hair_Back」サーフェースはグループID「0」等、グループID「1」及びグループID「2」以外にしておく。

unReal006

続けて「Surface Piercing」ボタンをクリックすると、グループID一覧が表示される。ここで、目や眉に設定したグループID「1」にチェックを入れる。すると、グループID「2」の前髪の上に強制的にグループID「1」の目や眉が出力されるようになる。この例では、普通は「0」→「1」→「2」の順番に重なっているものを「0」→「2」→「1」の順に重なっているように見せる。

unReal007

最初はイメージを掴みづらいかもしれないけど、貫通する側ではなく、貫通される側のサーフェースに貫通設定をするということを覚えておくと理解しやすい。

言葉で説明するとわかりにくいので、次のふたつのレンダリング出力を見比べてもらったほうが早い。前髪にサーフェース貫通設定をしていないほうは目や眉が隠れてしまっていて視線や表情が読み取りにくくなっているけど、サーフェース貫通設定をしてあるほうは前髪を無視して目や眉が見えている。

unReal008
サーフェース貫通なし
unReal009
サーフェース貫通あり


ただ、便利だけどサーフェース貫通設定は使い方が難しいところもあって、前髪に裏表や厚さがあってCelPainterシェーダが設定されていると前髪の裏側のエッジも貫通して表示されてしまって正しく出力されないことがある。前髪の裏と表のサーフェースを別にしたり、ノードをうまく使えば回避できるのかもしれないけど、現時点では研究不足で確実な方法はわからない。少なくとも、サーフェース貫通設定を使わないという選択肢はないので、前髪のサーフェースを工夫することになるだろう。(最近原因と改善方法がわかった。「サーフェース貫通設定時の出力の改善」節を参照)

Scene EditorによるグループID一覧表示

多数のサーフェースにグループIDを割り当てているとどのサーフェースに何番のIDを割り当てたのかわからなくなってしまうことがある。そういった場合は、Scene Editorの「サーフェース」タブのプロパティでEdgeTracerを選択すると次の画像のように一覧表示できる。

UVテクスチャの区分のみでサーフェースを分割している人にとっては管理できなくなるほどの数のサーフェースを使用するということ自体が考えられないかもしれないけど、unReal2を使う上では奥行きを考慮しながらサーフェースを割り当てていく必要が少なからず発生する。

なお、Ver. 1.51ではLightWave 2015での日本語対応は不十分で、サーフェースノーマル設定の日本語表記が文字化けを起こす。

unReal021

ToonTracerピクセルフィルター

ToonTracerピクセルフィルターは、EdgeTracerシェーダで検出した輪郭線をどのように出力させるのかを決定するためのプラグイン。これが設定されていないとEdgeTracerシェーダは機能しないし、EdgeTracerシェーダが設定されていないとToonTracerピクセルフィルターは機能しないのでエッジはレンダリングされない。特殊効果ウィンドウで追加するため、EdgeTracerシェーダが追加されているすべてのサーフェースに影響する。

unReal010

ToonTracerピクセルフィルターのプロパティを開くと次の画像のような設定パネルが表示される。「ブラシ設定」タブではエッジをどのように描画するかを指定できる。単色のラインはもちろん、任意の画像からラインにテクスチャを貼り付けることができるなど多くの機能を備えている。

unReal011

パネルの左領域でエッジ描画用のレイヤーを追加でき、グループIDごとにエッジ・ラインの色を個別に管理できる他、レイヤーごとにエッジをあえて表示させないサーフェースをグループID単位で指定することもできる。

「境界設定1」タブではエッジ・ラインを引くべき境界判定をどこで行うかを設定できる。オブジェクトの境界はもちろん、グループIDをうまく設定すればIDの切り替わりを境界に指定することもできる。

unReal012

ここで秀逸なのは「クラスタ境界」で「スケッチ色」を指定できること。スケッチ色は本来レンダリング出力には影響しないものだけど、立体を平面に捉えた時にスケッチ色が異なるピクセル同士が隣り合った場合はそこを境界と判定する。

これは、他の3DCGソフトウェアでカラー頂点マップなどを利用して境界と判定させたいものを極彩色に着色し、それだけをレンダリングさせてAdobe AfterEffectsなどでソーベル・フィルターキルシュ・フィルターといった輪郭検出アルゴリズムを使って輝度の差を輪郭として検出させていた方式をLightWaveのみで実現するものだ。

役に立たないものまで活用する、まさに発想の転換。LightWaveの開発陣もスケッチ色をこういう風に利用されるとは予想していなかったに違いない。

具体的には、同一サーフェースが設定されている手の指や髪の毛が三次元的に至近距離で重なっている部分をレンダリングで平面に投影した場合にエッジが検出されない問題を回避できる。

次の画像は右手の例だけど、灰色の部分はスケッチ色は「なし」に設定されている。スケッチ色「なし」と隣り合っている場合は境界とは判定されない。

unReal013

また、異なるスケッチ色を隣り合わせておくことで意図的に境界線を引かせることもできる。例えば、次の画像のような上着の袖や胸側と背中側の縫い目などだ。パッチの境界線上に制限されるのが短所と言えば短所だけど、最初から縫い目がどの辺になるか考えながらモデリングしていけばそれほど大きな問題にはならない。利用目的にもよるだろうけど、テクスチャに縫い目を描かなくていいメリットのほうがむしろ大きいと感じる。

上着にはひとつのサーフェースしか設定していないので、前の合わせが互い違いになっている部分にはエッジが綺麗に出ないことがある。そこで、右側と左側の生地のスケッチ色を変え、前に垂れている襟のスケッチ色も変えておくことによって確実にエッジが引かれるようにしている。

unReal014

クラスタ境界に「スケッチ色」を指定していないものと指定したものの比較。ちょっとわかりにくいかもしれないけど、手と上着の合わせ部分に注目してほしい。結果の違いをわかりやすくするために「法線の折り目」検出はオフにしている。

unReal019
クラスタ境界未設定
unReal020
クラスタ境界「スケッチ色」指定


モデリングの都合上、鋭角にできなくてエッジを検出させづらい鼻のラインを表示させたい場合などにも活用できる。角度によっては口の輪郭も出づらいことがあるので、口の外側と内側の境界にもスケッチ色を設定している。

unReal015

スカートの縫い目も同様に設定している。このような境界設定をカラー頂点マップを使って実現しようとすると、どの方向から見た時でも同じ色が隣り合わないように工夫して塗り分けなければならず、少なからずパズル状態になる。確実に輪郭検出をさせるためには明確な輝度の差が必要になるため、それほど多くの色も使えない。そのような労力を一挙に解消できる。

unReal016

蛇足ながら、Blenderは無料ながら標準でレンダーレイヤーを備えていて、カラー頂点マップのみのレンダリング出力を別に用意し、輪郭検出をさせた後、コンポジットで通常レンダリング出力と合成できる能力があるけど、スケッチ色による色分けの手軽さはちょっと手放しがたい。もっとも、Blenderの最大の魅力は無料であるが故に世界中にユーザーがいて、新しい使い方が次々に考案されているので情報量が豊富という点なんだけど。

「境界設定2」タブでは隣り合うポリゴンの「法線の折り目」をエッジ検出に利用することができる。標準機能の「鋭角の折り目」エッジ検出よりも強力で、山折り谷折りの区別もある。180°を指定するとすべてのポリゴンのエッジが対象となり、ワイヤーフレームが表示されることになる。0°を指定すればすべてのエッジが無視される。

unReal017

サーフェース貫通設定時の出力の改善

前髪などのサーフェースにEdgeTracerシェーダで貫通設定をしている場合に、そのサーフェースに重ねてCelPainterシェーダを設定すると後ろにあるはずのサーフェースの境界線も貫通して見えてしまったり、ノイズが大量に出力されるという問題があった。長らく原因不明だったけど、最近ようやく原因が判った。

これまでは、次の画像のように、髪の毛のサーフェースが属するレイヤーの「グループ境界」にチェックを入れていた。

同様に、髪の毛の輪郭を出しやすいという理由から、「法線の折り目」検出にもチェックを入れていた。

ところが、上の2つの画像のような設定でレンダリングすると、次の画像のようにエッジ・ラインが必要以上に出力されたり、無視できないほど大量のノイズが出力されたりする。

この現象を回避するもっとも簡単な方法はCelPainterシェーダを髪の毛に使用しないこと、あるいは肌のサーフェースにSSSを使用しないことだった。肌の質感の観点から言えばSSSを使用しないという選択肢はなかったので、髪の毛の質感を犠牲にしていた。

色々試行錯誤しているうちに、「グループ境界」と「法線の折り目」のチェックを外すと出力が大幅に改善されることが判明した。「法線の折り目」は出力されるエッジの量を制御するのに有効なのはかなり早いうちに気付いていたけど、「グループ境界」検出をOFFにすることでノイズ低減につながることにはほぼ偶然気が付いた。連続して隣り合っているポリゴンのグループIDの境界ばかりでなく、三次元的に重なっているグループIDも計算に入るようだった。

「グループ境界」と「法線の折り目」のチェックを外す前と後の比較。不必要なエッジ・ラインは出力されなくなり、ノイズも大幅に低減した。前髪に多少はノイズが出ているけど、顔の肌に使っているSSSがEdgeTracerシェーダのサーフェース貫通設定と相性があまり良くないためのようだ。

「グループ境界」と「法線の折り目」をOFF(パースペクティブ・カメラ)

「グループ境界」と「法線の折り目」をON(上と同じ画像)


また、unReal Xtreme2は、クラシック・カメラでの使用を前提として設計されているため、パースペクティブ・カメラ等の新型カメラを使用するとノイズが出やすくなる。もっとも、クラシック・カメラにするとノイズをほぼ無視できるくらいまで少なくでき、エッジ・ラインも滑らかなになるので綺麗な出力を得られる代わりに、レンダリング時間が大幅に長くなる傾向にあるという欠点がある。クラシック・カメラを使うのは最終レンダリングだけにするか、多少のノイズには目をつぶってパースペクティブ・カメラの高速レンダリングを使うかの選択になる。

クラシック・カメラでレンダリングしたもの。ノイズは目視ではわからないくらいになり、エッジ・ラインも滑らかになっている。

途中経過

ひとまず、ほとんどのサーフェースにunReal2を適用してみた。概ね問題ないんだけど、肌の質感があまりにも平面的なので、もう少し手を加える。もし、EdgeTracerシェーダとCelPainterシェーダが独立していなかったら、ほとんど工夫の余地がなかったところだ。

unReal018

関連記事

参考記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―ClothFX編―

最終更新:2016/09/06

現状、スカートは次の画像のようになっている。とりあえず足がスカートを突き抜けたりはしていないけど、足のボーン・ウェイトにスカートを巻き込んで無理矢理変形させているだけなので、不自然さが拭えない。

ClothFX000

解決策はいくつかある。

  1. スカートのみを別のオブジェクトとして分離してポーズに合わせて固定モデリングする方法。
  2. スカート専用のボーンを新たに組み込み、ボーン・ウェイトを適用して変形させる方法。
  3. スカートに物理演算を適用してポーズをとった後の体のラインに半自動的に沿わせる方法。

1.は服のしわなどを緻密に作り込みたい場合に向いているけど、主にフィギュア向けの方法なので、ここでは使わない。2.はローポリゴン・モデルでよく使われている方法だけど、ここでまたボーン・ウェイトを使うのも芸がない。そこで、3.の物理演算を利用してなんとかしてみる。

スカート用オブジェクトの用意

現状では次の画像のように、スカートは体や他の服装と一緒のレイヤーにひとつのオブジェクトとしてまとめられている。

ClothFX001

スカートのみを選択して切り取り、別のレイヤーに保管しておく。仮にもボーン・ウェイトが既に設定してあるものなので、単純に削除してしまうと後でやっぱり必要になったという時にウェイトの設定をやり直さないといけなくなる。

ClothFX002

体をモデリングした時の初期段階のまま放置してあって下着などをちゃんと作ってないので、とりあえず裸に見えないようにサーフェース色を変えてある。直接見えないところは後回しにしていたわけだけど、いい加減このへんの作り込みもしないといけない段階になってきた。

保管したスカートを元にして物理演算用のスカートを加工する。オブジェクトに厚みがあると物理演算の際に色々と大変なので、ウェスト部分を除いて裏地を削除し、両面の1枚ポリゴンにする。両面になっていないと足にスカートの影が落ちないので注意。サブパッチがかかっているので、レイアウトではもっと多ポリゴンのオブジェクトとして扱われる。このスカートのオブジェクトを「ハイポリゴン・スカート」とする。

ClothFX003

ウェスト部分のポイントを選択し、ポイントセットで選択セットを登録しておく。

ClothFX004

セット名は「Skirt_Waist」とした。この選択セットは物理演算の時に動かない箇所を指定するのに用いる。

ClothFX005

更に上で加工したハイポリゴン・スカートを複製してまったく同じ形のスカートを別のレイヤーに作る。この際、必ずサブパッチを解除しておく。これを「ローポリゴン・スカート」とする。

ClothFX006

今回は簡単な形状のスカートだったので、単にサブパッチを解除しただけのものをローポリゴン・スカートとしたけど、大きさが同じであれば、細部は異なっていても問題ない。

ポイントセットを作った後で複製していれば、ローポリゴン・スカートにも同様の選択セットができている。一応、念のため「Skirt_Waist」選択セットで選択できるか確認しておく。

ClothFX007

以上でモデラーでのオブジェクトの用意は終了。ファイルを保存する。

ClothFX単体の設定

まずはハイポリゴン・スカート単体でClothFXを試してみる。レイアウトに移り、0フレームでハイポリゴン・スカートを呼び出す。モーションオプションで指定する親アイテムはRootボーンがいいだろう。Rootボーンの位置がリグの腰コントロールの設定によって原点になっていない場合は、Rootボーンの座標を参考にして体の位置に合うようにスカートの位置を決める。大抵はZ軸座標を足すか引くかすれば体の位置と一致させられるはず。

ClothFX008

次に、体のオブジェクトに衝突判定用の物理演算を追加する。体のアイテムプロパティから「物理演算」タブを選択し、「Collision」を追加する。パラメータは次の画像のとおり。「Radius/Level」をあまり小さくしすぎると衝突判定が起こらずに貫通してしまうこともあるので、適度にマージンを確保しておく。「Bounce/Bind power」は「100%」が基準。スカートが足に当たってゴムボールのように跳ね返るわけではないけど、あまり小さいと足がスカートを貫通しやすくなる。

ClothFX009

ハイポリゴン・スカートにも物理演算を設定する。ここでClothFXを追加する。

「Fix」にスカートの加工で作成したポイントセットを指定する。「Skirt_Waist」ポイントセットがドロップダウンメニューから選択できるようになっているはず。
「Weight」は単純に重量のことでウェイト・マップとは直接関係ない。1.0がデフォルトだけど、衣服に使うような軽い布の場合は「0.1」~「0.3」程度の低めがいいようだ。
「Viscosity」は粘性、「Resistance」は抵抗のことでこれらの値を大きくすると布の変形を遅らせることができるようになるけど、1.0より小さい値にしても変形が早まるわけではなく、むしろ変形が逆流するようになるので「1.0」が最低値と思ったほうがいいようだ。
「Hold Structure」は構造を維持しようとする力、「Sub Structure」は構造を分散させようとする力。説明が難しいけど、「Sub Structure」は「Hold Structure」の範囲内で規則性を乱すといった感じか。「Hold Structure」が高すぎると伸縮性がなくなるので足とスカートの衝突判定に関係なく足がスカートの裾から出てしまいやすくなる。

ClothFX010

各パラメータには「Fx」というドロップダウンメニューがあり、それぞれオブジェクトに設定したウェイト・マップを利用して場所によって強度を調整できるようになっているけど、今回は省略。ClothFXの挙動はただでさえ難解なので、最初は基本設定だけで試してみることをおすすめする。

「Collision」タブはスカート側の衝突判定設定。「Collision Detect」を「<all>」に設定し、「Collision Offset」もやはり適度に確保しておく。「Bound」は「100%」でなくてもいいけど、「0%」にしてもそれほど大きくは変わらない。

ClothFX011

「Advanced」タブはデフォルトのままで変更しない。

ClothFX012

「Etc」タブもデフォルトのままで変更しない。重力の設定は厳密には必要なんだろうけど、ClothFXの利用目的がスカートの型を維持させたいくらいのものであれば特に設定する必要はない。

ClothFX013

最後にハイポリゴン・スカートの「ジオメトリ」タブを選択し、「サブディビジョン手順」を「一番終り」に設定し、「表示サブパッチレベル」が「3」、「レンダーサブパッチ」レベルが「3.0」になっていることを確認する。

ClothFX015

再び「物理演算」タブに戻り、「演算」ボタンをクリックして演算を開始する。サブディビジョンをする前のスカートに対して演算するため、それほど長くはかからないはず。もし、演算に時間がかかりすぎて待ちきれないようなら次節の「FX_MetaLinkを使って演算時間を短縮する」を試す。

演算が終わったら、「Save Motion」で必ずモーションをファイルに保存しておく。これを忘れると、せっかく演算した結果が消えてしまい、フレームをレンダリングしても演算結果が反映されない。

ClothFX014

演算結果を反映したスカートが次の画像。これで特に問題ないならばシーンを保存する。たまたま良好な結果が得られてしまったけど、これでいつもうまくいくとは限らない。

ClothFX016
サブディビジョン手順:一番終り、表示サブパッチレベル:3、レンダーサブパッチレベル:3.0

単体ClothFXの試行

試しに、次の画像のようにハイポリゴン・スカートの「サブディビジョン手順」を「一番初め」に設定して演算してみる。演算時間が非常に長くかかるようになる。

ClothFX017

演算を中断し、大体同じくらいのフレームをレンダリングしてみたのが次の画像。サブディビジョン手順を「一番終り」にしたものと比較すると結果の差は一目瞭然。サブディビジョンが最初に実行されてしまうので、エッジが細かくなることで布として変形できる箇所が多くなり、くしゃくしゃな結果になる。

ClothFX018
サブディビジョン手順:一番初め、表示サブパッチレベル:3、レンダーサブパッチレベル:3.0

物理演算としては正しいのかもしれないけど、いきなり細かい計算が始まるので極端に時間がかかる上に出力も良好でないとなるとサブディビジョンを最初にするのは賢明ではないということになる。

演算時間を短くするには、演算対象のポリゴンの数を減らせばいいんだけど、表示サブパッチレベルとレンダーサブパッチレベルが一致していないと問題が起こることがある。

表示サブパッチレベルを「1」、レンダーサブパッチレベルを「3.0」とし、サブディビジョン手順を「一番初め」にしてみる。

ClothFX019

演算そのものは速くなるし、レイアウトの表示では問題ないように見えるけど、レンダリングすると次の画像のようにスカートの表面がめくれたり逆立ってしまったように大きく乱れてしまい、とてもではないけど見るに堪えないものになってしまう。

ClothFX020
サブディビジョン手順:一番初め、表示サブパッチレベル:1、レンダーサブパッチレベル:3.0

表示サブパッチレベルとレンダーサブパッチレベルは同様で、サブディビジョン手順を「一番終り」にしてみる。

ClothFX021

演算速度は変わらず、次の画像のように表面の処理そのものは改善した。もっとも、だいぶ前に膨らんでしまっていて良好なレンダリング出力とまでは言えない。

ClothFX022
サブディビジョン手順:一番終り、表示サブパッチレベル:1、レンダーサブパッチレベル:3.0

試した範囲ではたまたま許容できるくらいの結果になったけど、表示サブパッチレベルとレンダーサブパッチレベルが一致していないとレンダリングの時に警告が出て演算結果が出力に反映されないことがある。

FX_MetaLinkを使って演算時間を短縮する

ハイポリゴン・スカートだけでは良好な結果が得られなかった場合や、演算時間が許容できないほど長すぎる場合は、ローポリゴン・スカートを併用することでレンダリング出力の改善と演算時間の短縮の両方を図ることができる。この方法は、ClothFXが実装されてさえいればLightWaveのバージョンに関係なく良好な結果を得られる可能性が高い。

まず、ローポリゴン・スカートを呼び出し、ハイポリゴン・スカートと同様にRootボーンを親アイテムに指定する。

ClothFX023

ローポリゴン・スカートのアイテムプロパティを開き、「ジオメトリ」タブを次の画像のように設定する。「SubPatches」の数値が「0」である点に注目してほしい。サブパッチがひとつもないので表示サブパッチレベルとレンダーサブパッチレベルは意味がないように思えるかもしれないけど、ハイポリゴン・スカートのサブパッチレベルと同じかそれ以上のレベルであることが重要。サブディビジョン手順は「一番初め」にしておく。

ClothFX024

ローポリゴン・スカートにサブパッチが適用されていると演算時間は短縮されないし、サブパッチレベルがハイポリゴン・スカートより低いと、次の画像のような陥没が生じることがある。ハイポリゴン・スカートのサブディビジョン手順を「一番終り」に設定しておけば回避できるけど、サブディビジョン手順の初期設定は「一番初め」なので、うっかりするとこのようなミスをしやすい。

ClothFX033
(ローポリゴン・スカート)サブディビジョン手順:一番初め、表示サブパッチレベル:1、レンダーサブパッチレベル:1.0(ハイポリゴン・スカート)サブディビジョン手順:一番初め、表示サブパッチレベル:3、レンダーサブパッチレベル:3.0

ローポリゴン・スカートにClothFXを設定する。ハイポリゴン・スカートにClothFXを設定済みならそれを「File」タブからコピーしてペーストすると簡単に転写できる。「Basic」タブ以外の設定は省略するけど、上で書いた設定と同じ。

ClothFX025

ローポリゴン・スカートは物理演算のためだけに使うので、レンダリング出力に映らないようにScene Editorで「A」欄のチェックを外し、ローポリゴン・スカートそのものをレンダリングの演算対象外にする。

あるいは、次の画像のようにアイテムプロパティの「レンダリング」タブで「オブジェクトディゾルブ」を「100%」、「光線無効」、「カメラ無効」、「ラジオシティ無効」、「フォグ無効」にしておく。光線とカメラが無効なのでそもそも影は生じないから影の設定は任意。

ClothFX026

ハイポリゴン・スカートのモーションオプションで親アイテムをローポリゴン・スカートに指定する。「その場でペアレント(Parent in Place)」がオンになっていれば特に移動させる必要はないはず。

ClothFX027

ハイポリゴン・スカートのアイテムプロパティを開き、「変形」タブで変位プラグインに「FX_MetaLink」を追加する。「プロパティ」かFX_MetaLinkをダブルクリックして「Smoothing」にチェックが入っていれば問題ない。

ClothFX028

FX_MetaLinkは、親に指定したアイテムの変位情報を子アイテムに移し替えるプラグイン。LightWaveには結果の厳格さを求めない代わりに物理演算を簡素化する方法がいくつか用意されている。

ハイポリゴン・スカートの物理演算はすべて削除しておく。

ClothFX029

続けて「現在のオブジェクト」からローポリゴン・スカートを選択し、ClothFXを演算させる。演算が終わったら、「Save Motion」でモーションを必ずファイルに保存しておく。

ClothFX030

ローポリゴン・スカートにはサブパッチが適用されていないため、サブパッチレベルの設定は3ではあるけど実質レベル0と同じなので演算時間を短縮でき、かつハイポリゴン・スカートに適用されたサブパッチにより良好なレンダリング出力を得られる。

ClothFX031
(ローポリゴン・スカート)サブディビジョン手順:一番初め、表示サブパッチレベル:3、レンダーサブパッチレベル:3.0(ハイポリゴン・スカート)サブディビジョン手順:一番終り、表示サブパッチレベル:3、レンダーサブパッチレベル:3.0

途中経過

今回は結構微妙な差なので、比較画像。左がボーン・ウェイトのみ。右がスカートにClothFX使用。歪んでいた裾がだいぶすっきりした。ミニスカートなので特に大きな問題は起きなかったけど、ロングスカートだとどうなるだろうか。

ClothFX032

関連記事

参考記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―上半身IK編―

最終更新:2016/09/06

上半身のIKを設定する。上半身系のボーン構造は次のとおりになっていることを前提とする。手首から下のボーンは今回のIKには関係ないけど、すべて記載した。

  •  Root
    • Spine
      • Breast
        • Chest_L
          • ChestIK_L(IK用)
            • Upper_Arm_L
              • Lower_Arm_L
                • Wrist_L(IK用)
                  • Hand1_L
                    • Finger11_L
                      • Finger12_L
                  • Hand2_L
                    • Finger21_L
                      • Finger22_L
                        • Finger23_L
                  • Hand3_L
                    • Finger31_L
                      • Finger32_L
                        • Finger33_L
                  • Hand4_L
                    • Finger41_L
                      • Finger42_L
                        • Finger43_L
                  • Hand5_L
                    • Finger51_L
                      • Finger52_L
                        • Finger53_L
        •  Chest_R
          • ChestIK_R(IK用)
            • Upper_Arm_R
              • Lower_Arm_R
                • Wrist_R(IK用)
                  • Hand1_R
                    • Finger11_R
                      • Finger12_R
                  • Hand2_R
                    • Finger21_R
                      • Finger22_R
                        • Finger23_R
                  • Hand3_R
                    • Finger31_R
                      • Finger32_R
                        • Finger33_R
                  • Hand4_R
                    • Finger41_R
                      • Finger42_R
                        • Finger43_R
                  • Hand5_R
                    • Finger51_R
                      • Finger52_R
                        • Finger53_R
        • Neck
          • Head

以下、特に断りがない限り、0フレームで操作する。

左腕IKの設定

腕のIK設定のおおまかな流れは足とほぼ同様で、ゴールオブジェクトになるNullオブジェクトの作成、IK用のボーンからゴールオブジェクトを参照する設定、IKで動くボーンの指定、及びIKが及ぶ範囲の限定という4つの手順からなる。

まず、胸の位置に新しいNullオブジェクト「Breast_Null」を作成する。

IK046

Breast_Nullを下半身IKで作成したWaist_Nullの子オブジェクトにする。

IK047

Altキーを押しながらBreast_Nullを移動させ、Neckボーンの根元にスナップさせる。位置が決まったら、モーションキーを作成しておく。

IK048

左腕ゴールオブジェクト

次に、左肩コントロール用のNullオブジェクトを作成する。名称は「ChestIK_Null_L」とした。腕はX軸方向に伸びているので、向きがわかりやすいように「Axis」を「X」にした。

IK049

ChestIK_Null_LをChestIK_Lボーンの根元にスナップさせ、モーションキーを作成する。

IK050

ChestIK_Lボーンを選択する。IK用のボーンでモデルのボーン・ウェイトに極力影響を与えないように短くしているため少しわかりにくいけど、次の画像の位置にある。

IK051

モーションオプション(Mキー)を開き、「ゴールオブジェクト」をChestIK_Null_Lに指定する。

IK052

「Wrist_Null_L」オブジェクトを作成し、Wrist_Lボーンの根元にスナップさせる。

IK053

Wrist_Lボーンを選択し、モーションオプション(Mキー)で、「ゴールオブジェクト」をWrist_Null_Lに指定する。

IK054

左腕IKの屈伸設定

IKで自動的に屈伸するボーンを指定する。左上腕にあたるUpper_Arm_Lボーンを選択する。

IK055

モーションオプション(Mキー)で「制御と制限」タブを選択し、「ヘディング制御」と「ピッチ制御」を「インバースキネマティクス」に指定する。バンク制御は変更しない。肩関節にあたる部分の設定で、腕の垂直方向に上げ下ろしする方向と、水平方向に広げる方向の両方についてIKを有効にする。

IK056

続けて左下腕にあたるLower_Arm_Lボーンを選択する。

IK057

モーションオプション(Mキー)の「制御と制限」タブで「ピッチ制御」のみを「インバースキネマティクス」に指定する。ヘディング制御及びバンク制御は変更しない。肘は曲がる方向が決まっているので、前後に曲げる方向だけに制限する。

IK058

最後に左肩に相当するChest_Lボーンを選択する。

IK059

モーションオプション(Mキー)で「制御と制限」タブを選択し、「ヘディング制御」と「ピッチ制御」を「インバースキネマティクス」に指定する。バンク制御は変更しない。鎖骨にあたる部分の設定で、腕に連動して肩を動かすことができるようになる他、肩で息をするような肩だけ上下させるような動作が可能になる。

IK060

左腕IKの停止設定

再びChestIK_Lボーンを選択し、モーションオプション(Mキー)で「子孫のIK効果を及ぼさない」にチェックする。これでWrist_Null_Lの移動によるIKの影響範囲は肩までに限定される。

IK061

親子関係の設定

作成したNullオブジェクトに親子関係を結ばせる。次の画像をとおり、Waist_Nullの配下にBreast_Nullを配置し、Breast_Nullの子にChestIK_Null_LとWrist_Null_Lを配置する。

IK062

足と異なるのは、肩と手首のNullオブジェクトに親子関係を結ばせないという点。足の場合は足首に必ず爪先が追随してくることを前提としているけど、手首が必ずしも肩に追随しない設定になっている。

右腕IKの設定

左腕の設定を右腕にも設定する。ChestIK_Null_LとWrist_Null_Lをそれぞれひとつずつ複製(Ctrl+C)し、X座標を反転させて右腕のゴールオブジェクトを作成する。名称をそれぞれChestIK_Null_RとWrist_Null_Rに変更し、モーションキーを作成しておく。

IK063

右腕ゴールオブジェクト

右腕のゴールオブジェクトは未設定なので、ChestIK_LボーンとWrist_Lボーンを選択し、それぞれ次の画像のように複製したNullオブジェクトをゴールオブジェクトに設定する。

IK064
ChestIK_Rボーン
IK065
Wrist_Rボーン

右腕IKの屈伸設定

左腕と同様に右腕の各ボーンにIKで自動的に屈伸する設定をする。

IK066
Upper_Arm_Rボーン
IK067
Lower_Arm_Rボーン
IK068
Chest_Rボーン

右腕IKの停止設定

左腕と同様に、肩関節のボーンにIKの及ぶ範囲を設定する。

IK069
ChestIK_Rボーン

上半身IKのチェック

すべての設定が終わったら、シーンを保存する。Wrist_Null_L又はWrist_Null_Rを選択し、XZ平面方向に動かしてみる。肩を軸にして肘が曲がってくれたら成功。手首のNullオブジェクトの移動につられて肩のボーンも動いてしまう場合は肩のIK停止設定を忘れている可能性が高い。

IK070

チェックが終わったら、フレームを0から1に移し、再び0に戻すとWrist_Null_L/Rは初期位置に戻っている。モーションキー自動作成モードにしていると移動したNullオブジェクトの位置に0フレームのキーが作成されてしまうので、別のフレームでチェックする。

スケマティックビューの整理

オブジェクト本体から読み込まれたボーン構造は、最初はスケマティックビューで一列の直線状に並んでいるので、左右にわけて階層構造がわかりやすいように並べ替えておくと後でモデルに動きをつけたい時にボーンやオブジェクトを視覚的に探すのが容易になる。

IK071

ウェイトの正規化

チェックが済んだら一時退場させていたオブジェクト本体を表示し、0フレーム以外の任意のフレームに移動する。一連の操作で作成した各ゴールオブジェクトを動かすとモデルに様々なポーズをとらせることができるようになっているはずだ。

ただ、肩関節など大きく動く箇所でモデラーのVertex Paintで設定したボーン・ウェイトのとおりに変形してくれないことがある。そういう場合は、対象のボーンのアイテムプロパティを開き、次の画像のように「フォールオフ種」が「反比例 ^ 32」になっているか確認し、「ウェイトのみ使用」と「ウェイト正規化」にチェックを入れると大抵の場合改善する。

IK072

回避方法はあるとしても、レイアウトの独立という特徴を持ちながら、モデラーの設定と同期できていないという難点がある。また、標準機能のボーンを使用していると、リグを途中で変更したくなった時に一度すべてのボーンを入れ換えてから再設定しなければならないという問題もある。これらの問題がLightWaveをアニメーション制作用のツールとしての第一線から遠ざけている要因にもなっている。これらの問題を解決するリグ用ツールとしてLightWave 11からGENOMA/GENOMA2が追加されたけど、実用例が少ない上に、詳細に解説した書籍がないため、一般に広く知られた機能とまでは言い難い。

途中経過

IKの効果を端的に示しているかどうかは微妙だけど、背骨にもIKを組み込み、胸を反らした姿勢ができるようになった。また、腰コントロールにより足にポーズをつけても地面との距離の調整が容易になった。今までは何もない空白の空間に立たせていたけど、地面と背景に相当するオブジェクトを追加してみた。足下に影が落ちてようやくCGらしくなってきた。

IK073

補足

今回のIKでは指に関する設定をしていない。指は関節が集中する箇所なので、5本の指にそれぞれIKを設定すれば指先のゴールオブジェクトを動かすだけで良くなり、キーフレームの操作が楽になるだろうと考えるのが人情というもの。しかし、指の関節は他の指の動きによっても動きを制限されたり、力の入れ具合によってはすべての関節が均等に曲がるとは限らないため、IKに適さないことが多い。もちろん、目的によりけりの部分も大いにあるため、アニメーションを作る上で指の動きが大きなウェイトを占めるのであれば、指のモーションの効率化が課題になるので指のIK設定に挑戦してみてもいいかもしれない。

それから、背骨に関するIKの設定もしていない。Breast_Nullオブジェクトはゴールオブジェクトに指定されていないため、上半身をWaist_Nullに追従させることと両肩をリンクさせて同時に動かすためだけにしか使われていない。背骨にもIKを設定すればBreast_Nullをゴールオブジェクトとして胸を反らしたり前屈みの姿勢をとらせることもできるようになる。

手順は多いけど、ボーン単位でテクニカルに設定できるので、一度慣れてしまえばボーン・ウェイトをポリゴン単位で緻密に設定するよりは精神的疲労は少ない。惜しむらくは片側の設定を反対に対称コピーする方法がLightWave標準機能にはないことくらいか。各関節の可動角度の制限も特にしていないので、あまり極端なポーズをとらせると関節が逆に曲がることもあり、これでも必要最小限。

もちろん、IKにも欠点はある。FKは特に何も設定しなくてもモデルをとりあえず動かすことができるのに対し、あらかじめIKを使う設定を一定の手続きに従って済ませておかなければならないし、上位階層の構造が制作者の思ったように動いてくれないケースもある。

IKを設定したからといって万全というわけでもなく、膝を外に向けて歩く「がに股」歩行やバトルシーンのような大胆なアクションには対応できないこともある。爪先のゴールオブジェクトが邪魔に思えることもあるだろう。リギングのみを専門に担当するエンジニアがいると言われるくらいなので、目的に応じたIKの設定が必要になるわけだけど、基礎さえおさえておけば工夫のしようもある。LightWaveではIKで実現できない部分にFKをブレンドすることもできるけど、高度なのでここでは割愛する。

そういった短所があるとしても、部分的にでもIKを取り入れると後の作業効率は劇的に改善する。

関連記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―下半身IK編―

最終更新:2016/09/12

次はレイアウトに移っていよいよIKを設定する。一般には略してIKと呼ばれるけど、正式にはインバース・キネマティクス(Inverse Kinematics)と言い、関節等によって多重階層構造を持つモデルの末端部分の位置を先に決めることによってその上位階層の要素の位置を逆算的に求める技法。

普通、階層構造を持っているモデルの場合は上位の要素から順に位置を決めていかないと末端要素の位置は決まらないものなんだけど、例えば人間の足のように全長が決まっていて基本的に伸び縮みしないものである場合、目測を誤ると足が宙に浮いてしまったり、逆に地面に埋まってしまったりといった事態が起こる。すると、上位階層に戻って調整をやり直すことになり、単に歩くだけの動作ひとつにも非常に手間がかかる。

上位階層から順に位置を決めていく方法をIKに対してFK(Forward Kinematics)と言う。FKはアクション・フィギュアのような人形や人型ロボットのプラモデルにポーズをとらせる時に手足の関節を上から順に曲げていく感覚に近い。ただし、CGの世界には物理演算を使わない限り重力がないため、重心の位置や左右の荷重バランスをとらなくても立ってしまい、作品として捉えた時に違和感のないポーズをとらせるのが逆に難しい。

一方、実際の人間は自分の手を差しだそうとした場合や、足を一歩踏み出そうとした場合に、手や足の未来位置を意識することはあっても、その時に肩、肘、股や膝の関節をどのくらい曲げようかということまでは通常意識しない。IKは「足を持ち上げて50cm前へ進ませる」といった人間にとっては当たり前の動作を上位階層を必要以上に意識せずに実現するものだと思ってもらえれば一番わかりやすい。動画などで反復運動が多い作品を作る際に非常に役立つものだけど、静止画の場合でも有用なことが多い。

準備と前提

IK000前置きはこのくらいにして、レイアウトを起動する。まず最初に、「その場でペアレント(Parent in Place)」がオンになっているかどうかを確認する。オフになっている場合はボタンをクリックし、トグルしてオンにしておく。

これがオンになっていないと、2つのオブジェクトに親子関係を結ばせた時に親オブジェクトの座標を基準とした相対座標が計算されず、子オブジェクトの絶対座標がそのまま相対座標に代入されるため、子オブジェクトの位置が動いて定まらなくなってしまう。親子双方のオブジェクトが原点から離れている場合、子オブジェクトが画面外へ飛んでいってしまうこともあるので、親子関係を設定したと同時にオブジェクトの挙動がおかしくなったらまずこの設定を疑う。

また、普段からモーションキーを手動で作成するのを習慣にしているため、新しいオブジェクトを配置するたびにモーションキーを作成している。自動作成モードにすればモーションキーを作成する煩わしさから解放されるけど、常に自動にしているとモーションキーのことを意識しなくなることがあるので要注意。不自然な動きをする時はキーを手動で作成し直すとオブジェクトの挙動が改善することがある。

なお、記述が煩雑になるのを防ぐため、下半身系のボーン構造は次のとおりになっていることを前提とする。

  • Root
    • Hip
      • Coxa_L
        • Upper_Leg_L
          • Lower_Leg_L
            • Ankle_L(IK用)
              • Foot_L
                • Toe_L
                  • FootIK_L(IK用)
      • Coxa_R
        • Upper_Leg_R
          • Lower_Leg_R
            • Ankle_R(IK用)
              • Foot_R
                • Toe_R
                  • FootIK_R(IK用)

以下、特に断りがない限り、0フレームで操作する。

スケルゴンからボーンへの変換

モデラーでスケルゴンとしてボーンを組み込み、ボーン・ウェイトを設定したオブジェクト本体を呼び出す。体や髪の毛はもちろん、服装も含むオブジェクトのすべての構成要素がひとつのレイヤーにまとめられていて、更にボーンも同一レイヤーに組み込まれていることが前提。

IK001

オブジェクト本体のプロパティを開き、「表示サブパッチレベル」を「1」又は「0」にする。マシンパワーに余裕のあるPCの場合は「3」のままでも問題ないけど、ボーンの旋回などの結果が反映されるまでに時間がかかるので、表示品質は落ちるけど表示サブパッチレベルは下げておいたほうが能率は良くなる。「サブディビジョン手順」は「一番終り」に設定する。サブディビジョン手順をボーンによる変形などの後にすることによって、まっすぐなストローを無理に折り曲げた時のような関節の潰れを防止できる。

IK002

オブジェクトを選択した状態で、「ユーティリティ」メニューグループからプラグインを選択し、「SkelegonReader」を選択する。普通は「スケルゴン変換」を使うんだけど、ボーンを組んだ時にスケルゴンエディターでバンクをZ軸方向に揃えた操作が反映されないため、SkelegonReaderを使う。

IK003

次の画像のようなダイアログが表示されるけど、「Yes」で問題ない。

IK004

ボーンがオブジェクト本体に完全に埋まっている場合は見た目にはわかりにくいかもしれないけど、組み込まれたボーンはモデラーで組んだ階層構造のとおりにすべてオブジェクト本体の配下に設定されている。

IK005

ボーンが読み込まれたら、オブジェクト本体は一時的に必要なくなるので、Scene Editorを使ってオブジェクト本体を「Hidden」に設定して、レイアウト画面に表示されないようにする。

腰コントロールの設定

次に、すべてのオブジェクトの頂点に位置する最初のNullオブジェクトを作成する。「アイテム」メニューグループの「追加」から「Null」を選択する。名称はなんでもいいけど、「TOP_Null」とした。「Shape」は「Ring」、「Axis」は「Y」に設定する。「Scale」はモデルの大きさに対して見やすい大きさにしておく。後でアイテムプロパティの「ジオメトリ」で変更することもできるので、間違ってデフォルト設定で作成してしまっても削除してやり直す必要はない。

IK007

次の画像のように足下にNullオブジェクトが作られた。

IK006

作成したNullオブジェクトをひとつ複製(Ctrl+C)し、名称を変更する。腰の高さに設定するものなので、「Waist_Null」とした。

IK008

Rootボーンを選択し、Y座標をコピーする。コピーした座標をWaist_NullのY座標にペーストする。次の画像はRootボーンを横から見た図。

IK009

Waist_NullがRootボーンと同じ高さになったら、Enterキーを何回か押し、モーションキーを作成する。更に、RootボーンのZ座標をコピーし、同様にWaist_NullのZ座標に貼り付ける。再度モーションキーを作成するのを忘れずに。

IK010

モーションキーを自動作成モードにしている場合は逐一キーを作成する必要はないけど、何か操作する度に勝手にキーが作られてしまうので、操作すべきフレームを間違えた時にキーを削除しなければならず、どちらが便利とは一概には言い難い。

Waist_Nullの座標が決まると、次の画像のようになっている。

IK011

再びRootボーンを選択し、モーションオプション(Mキー)を開く。「モディファイヤ追加」をクリックし、ドロップダウンメニューから「Follower」を選択する。追加できたら、名称欄を右クリックして「プロパティ」を選択する。

IK012

Followerコントロールを開くと、次の画像のように表示される。

IK013

「After IK」のチェックを外し、「Item to Follow」に「Waist_Null」を指定する。また、Z PositionにRootボーンのZ座標を入力する。左下に表示されているので、それをそのまま入力すればいい。メートル単位なので、600mmならば「0.6」と入力する。回転角度やスケールの設定は三角をクリックし、「(none)」を選択して無効にしておく。

IK014

「続行」をクリックすると、RootボーンはWaist_Nullの動きに追随するようになる。

左足IKの設定

足のIK設定のおおまかな流れは、ゴールオブジェクトになるNullオブジェクトの作成、IK用のボーンからゴールオブジェクトを参照する設定、IKで動くボーンの指定、及びIKが及ぶ範囲の限定という4つの手順からなる。

左足ゴールオブジェクト

まず、ゴールオブジェクトになるNullオブジェクトを追加する。くるぶしに当たる箇所に使うので、名称は「AnkleIK_Null_L」とした。形状は「Ball」にしたけど、好みで変更して構わない。後で選択しやすいように大きさは足の幅よりも大きくなるようにする。

IK015

原点に作成されたAnkleIK_Null_LをAnkle_Lボーンの根元に配置する。矢印を掴むとひとつの軸方向にしか動かせなくなってしまうので、中間の円弧あたりをAltキーを押しながら掴み、ボーンの根元にスナップさせる。Ankle_Lボーンは短いので、根元にスナップできているかわかりづらい時は拡大して確認する。位置が決まったらモーションキーを作成する。

IK016

同様にして「FootIK_Null_L」オブジェクトを作成し、Altキーを押しながらFootIK_Lボーンの根元にスナップさせる。しつこいようだけど、モーションキーも忘れずに作成する。

IK017

Ankle_Lボーンを選択し、モーションオプション(Mキー)を開く。「ゴールオブジェクト」に先ほど作成したAnkleIK_Null_Lを指定する。

IK018

同様にFootIK_Lボーンを選択し、モーションオプション(Mキー)で「ゴールオブジェクト」をFootIK_Null_Lに指定する。

IK019

左足IKの屈伸設定

次に、IKで自動的に屈伸するボーンを指定する。太ももにあたるUpper_Leg_Lボーンを選択する。

IK021

モーションオプション(Mキー)で「制御と制限」タブを選択し、「ヘディング制御」と「ピッチ制御」を「インバースキネマティクス」に指定する。バンク制御は変更しない。股関節にあたる部分の設定で、足を前後に持ち上げる方向と、足を左右に広げる方向の両方についてIKを有効にする。

IK020

続けてふくらはぎ又は脛にあたるLower_Leg_Lボーンを選択する。

IK023

モーションオプション(Mキー)の「制御と制限」タブで「ピッチ制御」のみを「インバースキネマティクス」に指定する。ヘディング制御及びバンク制御は変更しない。膝は曲がる方向が決まっているので、前後に曲げる方向だけに制限する。

IK022

足首から下にもIKを設定する。足首から下の足にあたるFoot_Lボーンを選択する。

IK025

モーションオプション(Mキー)の「制御と制限」タブで「ピッチ制御」のみを「インバースキネマティクス」に指定する。ヘディング制御及びバンク制御は変更しないけど、ピッチ制御だけだと足首は曲げ伸ばしの方向にだけしかIKが効かないことになるため、足を大きく投げ出すようなダイナミックなポーズをとらせたい場合などはヘディング制御にもIKを有効にしておく。

IK024

爪先にあたるToe_Lボーンを選択する。

IK027

モーションオプション(Mキー)の「制御と制限」タブで「ピッチ制御」のみを「インバースキネマティクス」に指定する。ヘディング制御及びバンク制御は変更しない。

IK026

左足IKの停止設定

太もものUpper_Leg_Lボーンの更に上位に位置する、腰骨にあたるCoxa_Lボーンを選択する。モーションオプション(Mキー)で「子孫のIK効果を及ぼさない」にチェックする。これは、IKによる足の屈伸が腰から上のボーンに影響を及ぼさないようにするための設定。IKでは「IKによる自動変形をどこで止めるか」という情報が必要になる。言い換えると、IKの固定軸をどこにするかの指定ということになる。

IK028

再びAnkle_Lボーンを選択し、モーションオプション(Mキー)で「子孫のIK効果を及ぼさない」にチェックする。

IK029

親子関係の設定

作成したNullオブジェクトに親子関係を結ばせる。TOP_Nullの配下にWaist_Null、ボーンを含むオブジェクト本体、AnkleIK_Null_Lを配置し、AnkleIK_Null_Lの子にFootIK_Null_Lを配置する。次の画像を見てもらったほうが早いだろう。

IK030

オブジェクトの親子関係の設定にはScene Editorを使うと簡単だけど、うっかり既存の親子関係を壊してしまうと修復に苦労することにもなりかねないため一長一短。モーションオプションの「親アイテム」でも設定できるので、数が少ない場合はこちらを利用したほうが間違いが少なく、結果的に早い場合もある。

IK031

これまでは各Nullオブジェクトが独立していたので何の効果もなかったけど、親子関係を結ばせることにより、TOP_Nullを動かせば全体が移動するし、Waist_Nullを動かせばTOP_Nullに重心は拘束されるもののAnkleIK_Null_Lによって足を地面方向に拘束させて胴体を動かせるようになる。

右足IKの設定

左足の設定を右足にも設定する。AnkleIK_Null_Lを選択し、「階層の複製(Clone Hierarchy)」でFootIK_Null_Lと一緒に複製する。

IK032

TOP_Nullとの親子関係は維持されるので、Scene Editorで確認するだけでいい。

IK033

「AnkleIK_Null_L (2)」と「FootIK_Null_L (2)」をそれぞれ「AnkleIK_Null_R」と「FootIK_Null_R」に名称を変更し、AnkleIK_Null_RのX座標を正負反転させると右足のボーンの上に配置されるので、モーションキーを作成しておく。

IK034

右足ゴールオブジェクト

右足のゴールオブジェクトは未設定なので、複製したNullオブジェクトをゴールオブジェクトに設定する。

IK035
Ankle_Rボーン
IK036
FootIK_Rボーン

右足IKの屈伸設定

左足と同様に右足の各ボーンにIKで自動的に屈伸する設定をする。

IK037
Upper_Leg_Rボーン
IK038
Lower_Leg_Rボーン
IK039
Foot_Rボーン
IK040
Toe_Rボーン

右足IKの停止設定

左足と同様に、股関節と足首のボーンにIKの及ぶ範囲を設定する。

IK041
Coxa_Rボーン
IK042
Ankle_Rボーン

下半身IKのチェック

すべての設定が終わったら、シーンを保存する。Waist_Nullを選択し、Y軸方向に動かしてみる。マイナス方向に動かすと足首の位置はほぼそのままに腰を落とし、膝を曲げてしゃがむような姿勢になる。この時点で足を構成するボーン群の動きが左右で食い違っていたり、膝が逆に曲がったり、爪先の方向がおかしかったりした場合はIKの設定をどこか忘れている可能性が高い。

IK043

Waist_NullをY軸プラス方向に動かすと足を伸ばし、爪先を下に向けてジャンプする。足首と爪先のボーンはゴールオブジェクトのほうを常に向いているけど接着はしていないので、ゴールオブジェクトを離れることができる。MMDで人物オブジェクトが基幹ボーンをY軸方向に動かすだけでジャンプできたりするのもこれと原理は同じ。

IK044

チェックが終わったら、フレームを0から1に移し、再び0に戻すとWaist_Nullは初期位置に戻っている。モーションキー自動作成モードにしていると移動したWaist_Nullの位置に0フレームのキーが作成されてしまうので、別のフレームでチェックする。

途中経過

下半身IK設定完了。下半身のIKが設定されているだけでもポーズはとりやすくなるし、歩行アニメーションを作る時に足が地面から離れないように腰の高さを調節することもできるようになる。

IK045

関連記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―UV編―

最終更新:2016/10/09

ボーン・ウェイトの設定が終わったので、次はIKの設定なんだけど、レイアウトに移る前にLightWaveにおけるUV展開について簡単にまとめておこうと思う。普通はUV展開後、テクスチャを用意してからリギングをするものなんだろうけど、動くかどうかわからないモデルに一生懸命テクスチャを塗っても意味がないのでIK以外のリギングを先に済ませておいた。

UV展開

LightWave標準機能にもUV展開用のツールが備えられているんだけど、平面状、円柱状、球状、アトラスの4種類からしか選べなくて、人物モデルのような複雑な形状のUV展開には向いていない。もっと言ってしまうと、その4種類しかないのであれば、UVマップである意義はあまりない。ただ、平面状であってもUVを使用するとバンプ・マップやノーマル・マップの凹凸がはっきり出るようになるので無意味とまでは言わないけど、必要性はかなり薄い。

そこで、フリーソフトウェアのLightWaveモデラー用プラグインplg_Make_UV_Editを使用する。LightWave関連書籍には大抵使い方が載っているLWユーザー必携のプラグインのひとつ。WEBサイトからプラグインのZIPファイルをダウンロードして解凍し、適当なプラグインフォルダにコピーしてモデラーに読み込ませる。x64ベースのWindowsでは動作を確認していないそうだけど、64bit版のLightWave 10で特に問題なく動作している。

本当はモデル全体のUVを展開する必要があるんだけど、ひとまず例として次の画像のジャケットのUVを展開してみる。

UV000

UVを分割する境界線をエッジで選択していくので、サブパッチはいったん解除しておいたほうが作業しやすい。図解のためにワイヤーフレームにしているけど、エッジの位置が確認しやすいものであればビューモードはなんでもいい。

UV001

plg_Make_UV_Editを起動し、次の画像の数値入力ウィンドウでUVマップ名を決めたらマップを分割するエッジを選択していく。Ctrlキーを押しながら選択すると最後に選択したエッジから最短距離の連続したエッジが選ばれるので、ポリゴン数が多い場合は幾分省力化できる。

UV003

どのように区切ったらテクスチャを塗りやすいかを考えながらエッジを選択していく必要があるんだけど、できるだけUVの分割線を目立たないところに設定しておくとテクスチャを描くときに継ぎ目の調整に苦労しなくて済む。テクスチャ・ペイント(3Dペイントとかポリペイントとか呼び方は様々)ができるソフトウェアを持っている場合は継ぎ目のことはあまり考えなくてもいいんだけど、UV展開をソフトウェア任せにしていると必要以上に細切れにされてしまい、テクスチャのどの部分がモデルのどこに相当するのかわからなくなり、画像編集ソフトウェアでの微調整ができなくなる恐れがあるので、一度は自分で工夫しながらUV展開する経験をしておくのをおすすめする。

UV分割があまりに大雑把すぎても、逆に細分化しすぎてもテクスチャを塗りにくくなるので、どんなテクスチャが必要なのか事前にイメージしておくことが重要になる。最初は加減がわからないと思うので、ざっくり前後に区切ってどのようにUV展開されるのか確認しながら分割するエッジを変更したり増やしたりしていってもいいと思う。展開時に無理があるところはプラグインが適当に補間してくれるので、すべての分割エッジが一筆書きのように連続している必要はないけど、エッジ選択をひとつ増減しただけでUV展開図が大きく変わることもある。

UV002

何かの拍子に選択したエッジがすべて解除されてしまうことがあるので、選択したエッジが複雑になってきたら適当なところで「Save Edge」でエッジ・データを保存しておく。

LightWave 11.5からようやく標準でもUVアンラップ機能が追加されたけど、ポリゴンの「パーツ」やポイントの「ポイントセット(選択セット)」のように過去に選択したエッジをまとめて保存しておく方法がなく、どこのエッジでUVを切り分けたのかを記憶しておいてくれないので、LightWave 7.5の時代に作られたplg_Make_UV_Editのほうがまだアドバンテージがある。

モデリング中のエッジ選択の方法とは異なり、選択判定が結構シビアでエッジの中央付近を正確にクリックしないと選択されないので、選択しにくい場合は、数値入力ウィンドウの「Hide Handle」のチェックを外してハンドルを表示させるとどこをクリックすればいいのかわかりやすくなる。次の画像のような静止画だと表示がゴチャゴチャしてかえってわかりづらくなっているように見えるかもしれないけど、プレビューを回しながら見てみるとハンドルがあるのとないのとでは相当違う。

UV004

また、「Ignore Backface」のチェックを外すと表側に見えていないエッジも選択できるようになるので、裏手に回り込んでいて選択しにくいエッジを選択したい場合などその都度使い分ける。

UV005

エッジの選択が終わったら、念のためエッジ・データを保存し、「Make UV」をクリックすると次の画像のようにUVが展開される。塗り分けテストのためにジャケットの本体部分と肩の部分を別のサーフェースにしていて、「Divide by Surface」を選択していたので、次の画像のようにジャケット本体から肩と襟がバラバラに展開されてしまった。

UV006

これではテクスチャを塗る時に都合が悪いので、肩のサーフェースをジャケット本体のサーフェースに統一し、再度「Make UV」すると次の画像のように展開された。肩とジャケット本体がつながっているのがわかる。「Divide by Surface」のチェックを外してもいいんだけど、それはそれで別の問題が起きることがあるので、モデルの都合で判断する。

UV007

このように、展開図が気に入らなかった時に何度でもUV展開をやり直すことができるので、plg_Make_UV_Editは非常に便利。エッジ・データさえ残っていれば、テクスチャを描いていて不具合に気付いた時にUV展開からやり直すこともできる。

現状ではUVマップに余白が多い。この余白を有効利用したい場合は、plg_Make_UV_Editと制作者が同じplg_Pack_UV_Chartプラグインで再パッキングできる。UVマップはモデルのジオメトリをUV平面に投影したものだけど、三次元空間とは独立した概念なので、UVマップ内にあるポイントを動かしてもモデルの形状には影響しない。最初は理解に苦しむかもしれないけど、色々試してみて少しずつ体感として理解していってもらうより他にない。

また、テクスチャを塗る時にポリゴンが左右対称、上下対称や直線状に並んでいたほうが何かと都合がいいので、あらかじめUVマップを整然と整列させておくという作成スタイルもある。ただ、テクスチャ作成が楽になる代わりに最終的にポリゴンに貼り付けた時に実際のジオメトリに合わせてテクスチャの伸縮が起こるので、文字や記号など模様に意味のあるものについては判読できなくなる可能性がある。

文字や記号の可読性とテクスチャ作成の簡略化を両立させることもできるけど、UVの特性を把握した上で、市松模様や水玉模様の歪み調整用のテクスチャを別に用意してテクスチャの歪みを丹念に修正しなければならないため、技術的にはむしろ高度になる。

今回はそれほど難しいテクスチャを作成する予定がないので、パッキングとUV編集は省略する。所望のUVマップが得られたら、Enterキーを押すか、plg_Make_UV_Editを割り当てたメニューボタンをクリックして編集モードを終了してUVマップを確定し、オブジェクトファイルを保存する。

テクスチャを描く

UVマップができあがったら、画像データに出力して画像編集ツールでテクスチャを描くんだけど、その画像出力でつまづき、結構悩んだ。LightWave 10からUVマップ(厳密には三面図のワイヤーフレームも含めて全部)をEPS形式で出力できるようになっている。「ファイル」メニューから「出力」を選ぶとEPSファイルにエクスポートできる。

UV008

次の画像のようなEPS出力ダイアログの「View」を目的のUVマップに設定し、ページサイズを選択する。インチスケールなので面食らうかもしれないけど、300dpi固定の解像度で出力されるので、デフォルトの6インチ四方だと1800×1800ピクセルの画像になって出力される。「Draw Grid」はグリッドを出力画像に埋め込むためのもので、必要に応じて指定する。「Draw Points」はよほど特殊な用途でない限り使う機会がない。

UV009

EPS形式はポストスクリプトに基づく画像形式なんだけど、ポストスクリプトの権利をアドビシステムズが保有していることもあり、対応している画像編集ソフトウェアが限られていて、メジャーなところではAdobe PhotoshopかIllustratorくらいしかない。GIMP2も一応ファイル形式の名前だけは表示されるけど、どういうわけか、正しく読み込まれない。

Illustratorの場合はUVマップがベクター画像として解釈されるので拡大縮小に強くなるという利点があるけど、ページのサイズは考慮されないので、上のダイアログでグリッドを出力しておかないと余白も含めたUVマップにピッタリ合う正方形の画像に形成するのでさえ負担になる。

ここでは、オーソドックスにPhotoshopでの編集方法を書いていく。PhotoshopでEPS形式ファイルを開こうとすると、次の画像のようなダイアログが表示される。6インチ四方、300dpiなので1800×1800pxのサイズになっている。これで特に問題なければ、「OK」を押すとラスタライズされる。アンチエイリアスはお好みで。マスクなどに自動選択ツールを使いたい場合はアンチエイリアスしないほうがいい場合もある。

UV010

ラスタライズが完了すると次の画像のようにUVマップがPhotoshopに表示される。これにレイヤーを重ねてUVマップをアタリにしてテクスチャを塗っていく。UVマップがラスタライズされたレイヤーは誤って編集してしまわないようにロックしておくのが無難。

Photoshopの場合はページサイズの設定や画像の位置調整が必要なく、すぐに描き始められるのが長所なんだけど、ラスター画像なのでPhotoshopをそれなりに使いこなす二次元作画スキルが必要になる。もっとも、最近のPhotoshopはスマートオブジェクト化が進んでいるので、幾何学的模様を任意の時点でパスによって変形・編集でき、さながらベクター画像のように作画することもできるようになっていて、Illustratorとの境目が曖昧になりつつある。

UV011

ひとまず、何も塗らずにPNG画像に出力してジャケットに合わせてみる。色・質感編集(Surface Editor)からジャケットのサーフェースを選択し、「色」設定の「T」ボタンをクリックしてテクスチャ設定画面を開く(テクスチャを完全に削除したい場合はShiftキーを押しながら「T」ボタンをクリックする)。

レイヤー種に「画像マップ」を選択し、投影は「UV」、UVマップは作成したUVマップ名、画像はPhotoshopで出力したPNG画像を指定する。なお、透過PNGを指定することもできるので、透明ピクセルに相当する箇所はサーフェース色か直下に位置するレイヤーが透けて見える。

UV019

「テクスチャ使用」をクリックするとモデルにテクスチャが貼り付けられる。次の画像のとおり位置はピッタリ合っているのは確認できた。ただ、サブパッチの都合で肩の部分が歪んでいるので、UVマップのポリゴン境界のとおりにテクスチャを塗ったとしても肩の塗り分けは綺麗にできないことが予想される。

UV012

とは言え、サブパッチによる歪みを計算に入れてテクスチャを描くのは困難なので、Photoshopでは素直にUVマップのポリゴン境界に沿ってテクスチャを作成していく。主に肩の塗り分けと、前に垂れている襟の輪郭の塗り分け、ジャケットの合わせ部分の装飾と裾の塗り分けをしている。ほとんどベタ塗りだし、テクスチャの描き方はそれこそ千差万別なので細かい描き方は省略する。

UV013

UVマップの境界線から余白にはみ出している箇所は無視され、モデルの表面には反映されないので境界線ギリギリに塗って継ぎ目にサーフェース色が一部残ってしまったりするよりは若干はみ出すくらいがちょうどいい。必要最低限の塗り分けが終わったら、UVマップのレイヤーを非表示にし、PNG画像に出力する。

LightWaveに戻り、着色前のテクスチャを着色済みのテクスチャに差し替える。前の画像に上書き出力して「画像編集」から再読み込みしてもいい。

UV020

歪みの修正

UVマップのポリゴン境界線に沿って色を塗ったので、サブパッチの影響により次の画像のように色の境目が歪んでいる。着色前のマップで予想できていたし、ある程度はやむを得ないんだけど、このままではさすがに目立つし格好悪いので、放置するわけにもいかない。良い方法か悪い方法かは別にして、テクスチャではなくUVマップを編集して歪みを修正する。

UV021

UVマップにテクスチャ画像を重ね、ポイントを選択して青色に塗られている方へ移動させる。ポイントの移動に従って色の境界が前方に動いていくのがわかるはず。

UV022

近傍のポイントも移動させて青色の面積をやや拡大させながら色の境目の歪みが許容できるくらいになるまで調整する。左肩が終わったら、右肩も同様に修正する。こういう時にUVマップを左右(上下)対称に整列させてあるとポイントの移動量は単純に正負を反転するだけでいいので、どちらへ移動させればいいのか悩まなくて済む。今回は対象が片側4ポイント程度だったので軽微な調整で済んだけど、事前のUVの整理にかける労力と天秤にかけてどちらが気楽かその都度判断する。

UV023

UVマップによるテクスチャの貼り付けが終わり、歪みの修正も済んだのが次の画像。ようやくジャケットらしくなってきた。

UV014

古典的なテクスチャ画像作成法

EPS形式の画像ファイルを読み込めるソフトウェアを持っていない場合や、どうしてもベクター画像で幾何学的にテクスチャを描きたいことがある。そういう場合は、LightWave 9.6以前から使われてきた古典的な方法でUVマップからテクスチャ画像を作成する。

まず、UVマップを表示しているビューの右上の最大化ボタン(虫眼鏡ボタンの右隣り)をクリックし、UVマップをディスプレイの解像度の許す限り大きく表示させる。

UV015

Alt+PrintScreenキー(F12キーの隣り)でウィンドウ全体のスクリーン・ショットを撮り、GIMPなどの画像編集ソフトウェアに貼り付ける。UVマップいっぱいで正方形にトリミングし、画像サイズを計測する。上の画像の場合は、984×984pxだった。トリミング後の画像をPNGなど圧縮で画質が劣化しない画像形式で保存する。

UV016

次に、Inkscapeを起動し、ドキュメントのプロパティを開く。ページのサイズをスクリーン・ショットと同じ984×984pxに設定し、トリミングしたUVマップ画像をインポートする。

UV018

インポートした画像はひとつのオブジェクトとして扱われるので、X座標とY座標をともに0に設定するとページの左上隅ピッタリに合わせられ、ページサイズとも一致させられる。

UV017

スクリーン・ショットの色が濃い場合は、当該オブジェクトを選択した状態で左下の「O:」(Opacity)の数値を下げてオブジェクトの不透明度を下げる。スクリーン・ショットを置いたレイヤーは間違って編集しないようにロックし、新しいレイヤーを用意してそこにテクスチャを描いていく。テクスチャ画像をビットマップに出力する際にはスクリーン・ショットのレイヤーを非表示にすればいい。

スクリーン・ショットを土台にするなんて、すごく大雑把な方法に思えるかもしれないけど、LightWaveではなかば公式に利用されてきた伝統的な方法なので、結構正確にマッピングできる。

この方法に限ったことではないけど、UVマッピングは厳格な位置やサイズの調整が必要なマッピングにはあまり向いていないので(UVを綿密に設計すれば不可能ではないけど)、別のマッピング方法を試すか、LightWaveではメモリの許す限りいくつでもUVマップを作れるので新しいUVマップを用意してそちらを使用してレイヤーを複数重ねるかを選ぶことになる。

途中経過

取り急ぎ、無地のままでUV展開が必要だったジャケットだけテクスチャを作成した。二次元イラスト風にしたい場合はレイトレースやシェーディングに頼らずに影なども直接テクスチャに描き込んでしまうのが定石になっているけど、それは最後の手段に残しておいて、LightWaveならではのアプローチで非写実的出力を目指す。

UV024

関連記事

参考記事

LightWaveで二次元キャラ系人物モデリング奮闘記 ―ボーンウェイト編―

最終更新:2016/09/06

ウェイト・マップと一口に言っても用途は多岐にわたるので、ボーンが移動又は旋回することによってモデルが変形する影響範囲を決めるウェイト・マップをボーン・ウェイトと呼ぶことにする。

ウェイトの設定には「マップ」メニューグループにあるVertex Paintを使用する。簡単なウェイト・マップの設定の場合は同じグループのエアブラシツールやMAP値指定などを使用して設定していくこともできるんだけど、それらのツールは結果がプレビューに反映されるまでに時間がかかり、関節が多く多数のボーン・ウェイトを調整しなければならない人物モデルの場合は作業効率が悪く、微調整くらいにしか使えない。

Vertex PaintがあるおかげでLightWaveはなんとか実用的な3DCGソフトウェアとしての地位を保っていられると言っても過言ではない。古いLightWaveではボーンの組み込みはレイアウトで一発勝負だったため、左右の足のボーンの影響範囲がお互いに干渉し合わないように保険をかける意味で大の字型に人物モデルを作らなければならなかったりなど、今では笑ってしまうような苦労が多かった。

もっとも、そのVertex Paintも動作を軽くするためにサブパッチを適用した状態での表示ができず、厳密を期そうとすればするほど熟練を必要とし、最後にはやはり勘に頼らざるを得ないところが欠点と言えば欠点。サブパッチ適用後の状態を想像しつつトライ・アンド・エラーで補うより他にない。それでも、Vertex Paintがなかった頃よりはセットアップは遥かに楽になった。

ボーン・ウェイトの自動算出

何はともあれVertex Paintを起動する。表示モードは「Weight Value」にし、「Weight」タブを選択する。透視投影の「Pers」モードよりは平行投影の「Ortho」モードのほうが細部は見やすいかもしれない。モデルにはまだウェイトが設定されていないので全体が灰色で表示される。

Weight000

今回扱っているモデルにはIK用のものも含めて68本のボーンが組み込まれていて、ひとつひとつ手作業でウェイトを設定していくのは非常に骨が折れる。そこで、ある程度まではボーンの情報を元にVertex Paintに自動でウェイトを計算してもらう。「Calc」タブでフォールオフを「Distance ^ 32」に設定し、「Calculate Weights」ボタンをクリックするとすべてのボーンのウェイトが計算され、ボーンと同数だけのウェイト・マップが作成される。

Weight001

ウェイトが設定された箇所は赤く染まる。ただし、ウェイトを算出するとすべてのボーンのウェイトが再設定され、手動で設定したウェイトは失われてしまうという点には注意しなければならない。

ボーン・ウェイトの手動修正

まずは小手調べにRootボーンのウェイトを変更する。

Weight002

Rootボーンはモデルの変形には関係がないので、ウェイトを消してしまう(消さなくても特に問題にはならないけれど)。「Paint」タブを選択し、「Operation」を「ERA」にして赤い部分をマウスでなぞってみる。ウェイトは頂点に設定されるものなので、頂点付近をなぞると赤い部分の面積が少なくなっていく。グラデーションはあくまでも目安で結構いい加減なので、面の色よりもどの頂点までウェイトの範囲が及んでいるかに注目してペイントするようにする。

Weight003

ペイント・オペレーションには5種類あり、動作は次のとおり。

  • ADD
    加算オペレーション。元のウェイト値にValueで設定したウェイト値を足す。
  • SUB
    減算オペレーション。元のウェイト値からValueで設定したウェイト値を引く。
  • REP
    置換オペレーション。元のウェイト値に関係なく、Valueで設定したウェイト値で置き換える。100%など一定の値で塗りつぶしたい時に便利。
  • ERA
    消去オペレーション。元のウェイト値に関係なく、Valueで設定したウェイト値で塗りつぶす。普通は「0%」に設定して使う。REPオペレーションで「0%」を指定しても同じ。
  • OVR
    上書きオペレーション。Valueで設定したウェイト値が元のウェイト値を上回っている場合だけValueのウェイト値で上書きする。使いどころがあまりない。

Strengthなどの設定はエアブラシのように少しずつペイントしていくためにあるものだけど、RGBAの4チャネルで設定した色をブレンドしていくカラー頂点マップとは異なり、ボーン・ウェイトではパラメータがひとつなのであまり意味がない。

なお、「Brush Size」の隣りにある「Front」ボタンをトグルしてオンにしておくと表面に見えている側だけペイントされる。オフにしていると直接見えていなくてもブラシの範囲内に入った頂点はすべてペイントされる。

「Object」の隣りにある「Save」ボタンをクリックすると実際にモデルのボーン・ウェイトに反映される。ウェイトを変更している状態でVertex Paintを終了しようとすると次の画像のような確認ダイアログが表示される。ここで「Yes」を押せば同様にボーン・ウェイトに反映されるけど、変更の反映は「Save」ボタンで、変更を破棄したい時はダイアログで、と使い分けるようにしておくとうっかり大事な変更を破棄してしまったり、必要ない変更を反映してしまったりするミスを防げる。

Weight004

Vertex Paintが終了したら、モデラーウィンドウ右下の「W」ボタンを押し、頂点マップ名を選択するとボーンと同名のマップが大量にできているはず。

可動部分のボーン・ウェイトの修正例

ひとまずボーン・ウェイトはできたけれど、あくまでも自動算出なので必ずしも想定どおりのウェイトになっていないことがある。ここでは左肩を例にあげてウェイトを修正する。

左上腕のボーンを選択し、スケルゴン回転(Rotate Skelegon)でヘディングを適当な角度まで回して腕を降ろしてみる。サブパッチ適用状態でマウスのドラッグで回転させようとすると動作が重いので、数値入力ウィンドウ(Nキー)を利用するといい。

Weight005

左腕を降ろしてみたところ、次の画像で赤い矢印で示した部分に不具合があった。まず、髪の毛にも左上腕のボーン・ウェイトが影響してしまっていて、想定外の膨らみができている。次に、肩章にあたる部分が強く引っ張られて伸びきってしまっている。伸縮性の高い素材という設定なのであればこれでも問題ないけど、制服のようにほとんど伸び縮みしない服装の場合は型崩れと捉えられる。更にもっと問題なのは、ジャケットの脇に大きな陥没が生じていてインナーが見えてしまっている。重ね着はこのような問題を生じることがあるため、できる限り避けたほうがいい。場合によってはインナーは襟と裾を残して際どいところは削除してしまったほうがいいかもしれない。

Weight006

アンドゥ(Ctrl+Z)でスケルゴン回転を元に戻し、再度Vertex Paintを起動する。スケルゴン回転を元に戻さないとスケルゴンが回転したままのモデルが表示されるので注意。左上腕のボーンを選択し、Shift+Aで当該ボーンを中心にして拡大する。確かにボーン・ウェイトの範囲がかなり広いことがわかる。髪の毛にもうっすらではあるけど赤い範囲がある。

Weight007

Ctrlキーを押しながら赤いリングを掴んでボーンを回してみる。LightWaveでは赤リングはヘディング(H)、緑リングはピッチ(P)、青リングはバンク(B)と統一されているので、この際レイアウトに移る前に覚えてしまったほうがいい。

プレビューで確認済みだけど、肩章が肩に食い込むように大きく沈み込んでいるのがわかる。髪の毛の変形やジャケット脇の陥没も見受けられる。この状態でサブパッチがかかった状態を容易に想像できるようになれればいいんだけど、慣れが必要なのでVertex Paintの起動と終了を繰り返すことになるのは最初のうちは仕方がない。

Weight008

ひとまず、肩章の端に設定されているウェイトを消去して所定の場所に戻す。ボーン・ウェイトを消去する度に変形が復元されていく様子は少し面白い。

Weight009

左上の「Edit」ドロップダウンメニューから「Reset All Bones」を選ぶか、Shift+Rでボーンを最初の位置に戻せる。ジャケット脇を陥没させた原因になっていたウェイトも消去すると同時に、左上腕のボーン・ウェイトの範囲を狭くする。ボーンを回してみて、様子を見ながら袖のポリゴンがジャケットにめり込まない程度にウェイトを少し足しておく。ほんの10%程度なので、スクリーンショットではわかりづらい。

Weight010

右側へのボーン・ウェイトの複製

左上腕のボーン・ウェイトが設定できたので、右上腕にウェイトを複製する。「Edit」ドロップダウンメニューから「Copy」を選ぶか、Cキーでボーン・ウェイトをコピーする。

Weight011

右上腕のボーンを選択する。ボーンを回すまでもなく、左上腕のボーン・ウェイトと同様の問題が起こっているのがわかる。

Weight012

左上腕のボーン・ウェイトを左右反転してペーストする。「Edit」ドロップダウンメニューから「Paste -X」を選ぶか、Shift+VでX軸対称ペーストができる。

Weight013

左上腕のボーン・ウェイトが右上腕のボーン・ウェイトにも反映された。ただ、右上腕のボーン・ウェイトはジャケットの襟も巻き込んでいるようなので、ERAオペレーションで消去しておく。

Weight014

ボーン・ウェイト修正の確認

「Save」でボーン・ウェイトをモデルに反映し、Vertex Paintを終了する。再度、スケルゴン回転で左腕を降ろしてみる。今度は髪の毛の変形、肩章の異常な伸長、ジャケット脇の陥没は見られなくなった。脇が若干苦しいけど、これ以上はボーン・ウェイトでなんとかするのは難しそうなので、どうにもならなくなった時はジャケットのオブジェクトを再検討して修正したほうが良いような気がする。

Weight015

このような作業を繰り返して全身のボーン・ウェイトを設定していくわけだけど、慎重な設定を要求されるのは可動範囲の広い肩関節と股関節くらいで、膝、肘、指など曲げ伸ばしが特定の方向のみに決まっている部分は最初の自動算出の時点で大体できてしまっている。

途中経過

ボーン・ウェイトの設定が終わってしまえばリギングはほとんど終わったようなもの。レイアウトでのIKの設定をしなくても次の画像のような簡単なポーズをとらせることはできる。ひとまず両手を水平に広げて両足を揃えた棒立ちの状態からは卒業できた。

Weight016

補足

話が混乱するのでボーン・ウェイトのみに絞って書いたけど、ウェイト・マップの応用範囲は広い。これまでにも軽く触れてきたエッジ・ウェイトやサブパッチ・ウェイトの他にも、軟体シミュレーションであるSoftFXを利用してプルプル震えるゼリーを作ったり、布地シミュレーションであるClothFXを利用して足の動きには影響されるけどボーン・ウェイトだけでは実現が難しいスカートの「裾捌き」の再現などの物理演算の影響範囲をウェイト・マップで文字通り「重み付け」することができる。

また、グラディエント・マップにウェイトを入力してサーフェースの各種パラメータに変化を加えることもできる。例えば、自己発光度にウェイトを入力することで、同一のサーフェースを割り当てられた平面上にありながら自己発光度の輝度が異なる部分を作ることができる。そうすることによって、電球のような発光体を奥に仕込んだり、半透明のポリゴンの屈折率を設定したりといった微細な加工を簡略化できる。大きく拡大して見ることが少ない灯火類や人型ロボットの目などの細かな部分に有効。

関連記事

参考記事