LightWave において、光源の方向や位置をもとにして線に強弱をつける方法について。ソフトウェアの使用バージョンは LightWave 2015.3 日本語版である。
事前準備
あらかじめ、Layout のビュー表示をVPRにしておく。そしてオブジェクトとカメラの位置を決める。さらに、背景を標準の黒から白にしておく。Layout 画面左上の[ウィンドウ]>[背景オプション](ショートカット【Ctrl+F5】)>[特殊効果]ウィンドウ>[背景]タブ>[背景色]で、カラーボックスをクリックして白 (RGB: 255, 255, 255) に設定。済んだら[特殊効果]ウィンドウは閉じてよい。
さらに、出す輪郭線の種類を決めておく。左下で[オブジェクト]を選択して右の[プロパティ]から[オブジェクトのアイテムプロパティ]ウィンドウを出し(ショートカット【p】)、[輪郭(Edges)]タブの欲しい輪郭線項目にチェックを入れて有効化する。線の太さは任意だが、太めの方が分かりやすい。ウィンドウの上部にある[現在のオブジェクト]から続けて選択して、すべてのオブジェクトごとに欲しい輪郭線項目を設定する。しかし、このままだと均一な線になってしまうので、この線に手を加えていく。
[輪郭(Edges)]タブの[ノード編集]ボタン右隣のチェックボックスをオンにし、[ノード編集]ボタンを押して[Node Editor]を開く。
方法その1
[Node Editor]の左に並んだ中から[Layers]>[Scalar Layer]を選択して、[Scalar Layer]ノードを出す。
[Scalar Layer]ノードの右にある[Alpha]から矢印をドラッグし、[Edge]ノードに並んでいる[Silhouette Edges Taper]や[Sharp Creases Taper]など、手を加えたい線の項の[~Taper]に矢印をそれぞれ接続していく。
[Scalar Layer]ノードをクリックして編集パネルを開く。[レイヤー種(Layer Type)]を[グラディエント(Gradient)]にする。[入力パラメータ(Input Parameter)]を[Light Incidence](ライトの入射)にして、[ライト(Light)]で適用するライトを選択。
グラディエントバー(左にある縦長の帯)をクリックしてグラディエントのキーを1つ作成する。キーの[値(Value)]は「0.01」、[パラメータ(Parameter)]は「90.0」にして、白から黒へのグラデーションを設定する。これで明るい部分の線が細くなる。
方法その2
[Node Editor]の左に並んだ中から[Shaders]>[Diffuse]>[Lambert]を選択し、作業領域に[Lambert]ノードを追加する。Lambert というのはランバート反射のことで、面から光源を指すベクトルと法線ベクトルとの内積(ドット積)を使って計算される。要するに、光の当たり具合を0-1の階調で表現できる。
なお、[Lambert]ノードは LightWave 2018 で消えてしまったらしいが、配布プラグイン「Single Light Lambert」で代替できる。
この[Lambert]ノードの[Color]出力を[Edge]ノードの[~Taper]に繋いでみると分かるが、光が当たっている方が太く、当たっていない方が細い線になる。これは光の当たり度合いがそのまま線の太さに入力されるためだ。これを逆にして、光が当たっている方を細く、当たっていない方を太くしたい。そこで使うのが、入力値を反転させる[Invert]ノードである。[Math]>[Scalar]>[Invert]で[Invert]ノードを出す。
[Lambert]ノードの[Color]出力を[Invert]ノードの[In]に繋ぎ、[Invert]ノードの[Out]から、[Edge]ノードの任意の[~Taper]へと繋いでいく。これで光が当たっている方を細くすることができる。なお、[~Opacity]へ繋げば光が当たっている方の輪郭線の不透明度も下がるので、光の影響を受けた濃淡を線につけられる。
直方体の輪郭線で妙に太くなっている箇所があるが、おそらくこれは影のせいだろうと思い、[オブジェクトのアイテムプロパティ]>[レンダリング]タブ>[影を落とす]と[影を受ける]のチェックを外して再レンダリングすると消えた。
ちなみに、[Shaders]>[Diffuse]>[OrenNayer]で出る[OrenNayer]ノードがオーレン・ネイヤー反射というランバート反射の改良版らしく、こちらを使っても同じようなことができる。
方法その3
[Node Editor]の左に並んだ中から[Item Info]>[Light Info]ノードを出す。ライトの設定を出力するノード。
[Light Info]ノードをクリックして編集パネルを開き、[Light]で適用するライトを選択して閉じる。
[Gradient]>[Tools]>[Incidence]ノードを出す。このノードにベクトルを入力すると、そのベクトルと現在のヒットポイント(光線が当たった位置)間の角度が出力される。
[Light Info]ノードの[Direction]から、[Incidence]ノードの[Vector]へと繋ぐ。この[Direction(方向)]というのは、ライトの方向を表すベクトルを出力する。
[Gradient]>[Gradient]ノードを出す。
クリックして編集パネルを開く。グラディエントバー(左にある縦長の帯)をクリックして下方にキーを1つ作成する。色は黒のままで、[Position]はとりあえず「1.0」に。そして上のキーを選択したら[Color]のカラーボックスから色を白にして、グラディエントバーの上を白、下を黒にする。
[Incidence]ノードの[Result]から、[Gradient]ノードの[Input]へ繋ぎ、[Gradient]ノードの[Color]を[Edge]ノードにある任意の[~Taper]へと繋ぐ。
この方法の場合、[Gradient]ノードを開いてキー位置をずらしたり、任意の位置に新たなキーを追加することで、線の抜き具合を調整できる。
例えば上のような位置にキーを追加した場合、このような画になる。
線に粗さを入れる
また、線に粗さを入れたくば、[Turbulent Noise]ノード([3D Textures]>[Turbulent Noise])などのノイズ系テクスチャのノードを利用すればよい。
このとき使うのが[Multiply]ノード([Math]>[Scalar]>[Multiply])。これを使えば、ひとつのスカラー値を他の値で乗算できる。要するにノードの出力結果を掛け合わせられる。
方法その1なら[Scalar Layer]ノードの[Alpha]から、方法その2なら[Invert]ノードの[Out]から、方法その3なら[Gradient]ノードの[Color]から[Multiply]ノードの入力へ繋ぎ、ノイズ系テクスチャのノードをもうひとつの入力に繋ぐ。そして[Multiply]ノードの[Result]を[Edge]ノードにある任意の[~Taper]へと繋げばよい。
以上、調べた限りの方法を紹介したが、これ以外にもあるかもしれない。どれも球体や曲面の場合はよさそうだが、それ以外では線を太くすると角部分にはみ出してしまうのが難点。以下の記事のように、ノイズ系テクスチャのノードを利用した手描き風の粗い表現でなら使えるかもしれない。
参考
- NPR Line creation test!!! Challenge - NewTek Discussions
- Lightwave2018 シェーディング: Hand to Mouse.(刹那日記)
- Lightwave2018 Lambertによるセル調表現: Hand to Mouse.(刹那日記)
- Lightwave2018 Lambertによるセル調表現(続報): Hand to Mouse.(刹那日記)
- The Single Light Lambert node in db&w Tools 2018.0.3 - db&w
- https://twitter.com/4410emon/status/949633766779101185
- Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
- リアルタイムレンダリングでのNPR表現
- 数学:内積ってなんぞ? その2(角度とCG編) | No More Retake
- LightWave3D・雑談スレ69 (962-972)