モデルに色を付ける
キャラクターに色を付ける「シェーディング」という工程に入る。
ここまでずっと無色で作業してきたが、この先アニメーションの検証をするにあたっては色がついていた方がやりやすいし、何より気分が上がる(笑)。
今回目指しているのは「セル画アニメのような外観」である。このような外観は「セルルック」と呼ばれる。今のアニメーションではもうセル画は使わないが、この呼称が一般的になっている。
シーンの設定
まずは全体のシーンとして「光源」と「レンダー」の設定を行う。
光源は「サン」。
いわゆる「太陽光」で、角度の変化はオブジェクトに対して影響を与えるが、位置の変化は影響しない=光の向きはワールドの原点からの角度で決まる・光源の位置は関係ないという特性を持つ。
ライトのデータプロパティーで、強度を「5」角度を「0」にする。

次にレンダープロパティーのカラーマネージメントを開き、ビューを「標準」に設定する。

トゥーンシェーダー
「アニメ調」にするために必要なことは2点。
ひとつは陰影の境界をグラデーションではなくはっきりさせること。
もうひとつは輪郭線(外形線)を描くこと。
ひとつ目の「陰影をはっきりさせる」シェーダーは「トゥーンシェーダー(toon shader)」と呼ばれる。
配布しているサイトもあるが機能過多だったりするので、下記のサイトを参考にしながら自分で組むことにした。

ページ中央の「テクスチャで陰影を表示」からは不要なので、それまでのノードをグループ化してインプットを設定して自分用のトゥーンシェーダーを用意した。

ハイライト、ノーマル、影1、影2とそれぞれのスレッショルドを設定できるようになっている。
あとはこのシェーダーを使ってキャラクターや服に色を付けていくと…

こんな感じに。
ちなみにデフォルトのシェーダー「プリンシプルBSDF」を使ってこのモデルを色付けすると

こんな感じ。肌色の質感はシェーダーを組み合わせれば調整すればもう少し良くすることはできるが、違いは歴然だ。
輪郭線(外形線)
方法1:ソリッドモディファイアを使う
セルルックでのもうひとつの大切な要素「輪郭線(外形線)」については、簡易的に実現できて動作が軽い手法が確立されている。それが「ソリッド化モディファイア」を使う方法。
線を描く手法としては他にも「グリースペンシル」「freestyle」「ラインアート・モディファイア」がある。これらは細かい設定や描画が可能であるが処理に時間がかかるのでマシンが貧弱な僕の環境だとちと厳しい。
ソリッド化を使う手法はお手軽だが細かな調整はできず基本的には「できたなり」で妥協することになる。でもとりあえずの取っ掛かりとしてはこれで十分だ。先々技術が上がってきたら別の方法に乗り換えるかもしれないが、まずはこれでやってみる。
- 幅:輪郭線の幅はここで決める
- オフセット:モデルの分割線に対して輪郭線をどこに描くかを決める。
「0」が中心線上、正負に振ると輪郭線が動くので好みの位置に。 - ノーマル:逆転にチェック
- マテリアルインデックスオフセット:オブジェクトのマテリアル設定で何番目のマテリアルを割り当てるかを選択する。今回は上から5番目に「outline」というマテリアルを置くことになるので「4」。

選択したモデルに輪郭線用のマテリアル「outline」を追加する
- サーフェス:デフォルトのプリンシプルBSDFでもいいが、単純な黒色なのでディフーズBSDFでいい。
- カラー:普通は黒色。
- 設定:「サーフェース>裏面を非表示」のカメラ、影にチェックを入れる。
- ビューポート表示:レンダープレビューで表示させるためにここでもカラーを設定する。

するとビューに追従する輪郭線が生成される。

輪郭線を追加したい他のオブジェクトも同様に。
マテリアル「outline」は使いまわしができるので最初に作ったもの読み込んでもいいし、オブジェクトごとに色を変えたい(あまりないと思うが)場合は別のマテリアルを用意してもいい。

方法2:ジオメトリノードを使う
「背面法を使う」という考え方においては方法1と同じなのだが、ソリッド化がモデルからのオフセット量で輪郭線を形成するのに対して、このジオメトリノードでは視点やカメラからの距離を考慮して輪郭線を作る。このため、視点がオブジェクトから遠くなっても画面上での線の太さを一定にすることができる。
輪郭線を付けたいオブジェクト内にマテリアルを作る。
- 色は単色黒でいいのでディフーズBSDFでじゅうぶん。
- 設定:「サーフェース>裏面を非表示」のカメラ、影にチェックを入れる。
オブジェクトに「ジオメトリノード」モディファイアを適用し、下記のようにノードをつなぐ。
- グループ入力
- 位置設定
- グループ入力の
Geometoryを入力のジオメトリに接続
- グループ入力の
- ベクトル演算
- 出力を位置設定のオフセットに接続
- 演算は乗算を選択
- ノーマル
本来の法線をベクトル乗算の入力上側のベクトルに接続
- 数式
- 出力の値をベクトル乗算の入力下側の
ベクトルに接続 - 入力下側の値に、輪郭線の太さを入力
- 出力の値をベクトル乗算の入力下側の
- 数式・距離
- 出力の値を乗算(数式)の入力上側に接続
- 位置
- 出力の位置を、距離の入力上側の
ベクトルに接続
- 出力の位置を、距離の入力上側の
- オブジェクト情報
- 出力の位置を、距離の入力下側の
ベクトルに接続 - オリジナルを選択
- 輪郭線の生成位置を決めるカメラを選択
- 出力の位置を、距離の入力下側の
- 面反転
- 入力の
メッシュに位置設定の出力を接続
- 入力の
- マテリアル設定
- 入力の
ジオメトリに面反転の出力を接続 - マテリアルに輪郭線用のマテリアルを指定
- 入力の
- マテリアル統合
- 入力にマテリアル設定の出力を接続
- 入力にグループ入力の
Geometryを接続
- グループ出力
- 入力にマテリアル統合の出力を接続

輪郭線を付けたいオブジェクトに輪郭線用のマテリアルを追加し、ジオメトリノードのモディファイアを追加して上記で組んだノードを選択すれば輪郭線が生成される。ただし、線の幅を変更するためにはノードの編集画面にはいらないといけない。これを通常のモディファイアのプロパティから操作できるようにするためには、操作したいパラメーターを入力グループに接続しておけばよい。
今回は線の幅を決める値と、線の作成の基準となる対象となるカメラをプロパティから選べるようにした。

今製作中のモデルでは線幅の値を0.0003くらいにしたいのだが、blenderは小数点以下3桁までしか表示されない。でも表示がされないだけで値は入っている。なので輪郭線は表示される。
これをプロパティから操作するためにもうひとつ数式の乗算を挟んで、片方の値に0.0001、もう一方の値を入力グループにつないでプロパティで「3」と入れれば0.0003が出力される…はずなんだけど、何故か線が消えてしまった。
では、ということで乗算の値を0.001にしてプロパティでは0.3としたら無事0.0003の輪郭線が表示された。


次回は…
モーションデータをインポートしてモデルの動きをテストする

コメント