異方性反射(Anisotropicノード)

最終更新:2016/09/06

異方性(アニソトロピー、Anisotropy)というのは、物質の物理的性質が何かの方向により変わる特質のこと。宝石をはじめとする鉱物に光が入射する角度によって色が変わって見えたり、偏光性のある結晶のように角度によって光の透過率や屈折率が変わることなんかをひとまとめにして異方性という。異方性反射もそのひとつ。金属の表面に何らかの加工が施されていると、ピカピカに磨いたものとは異なる光の反射の仕方を見せることがある。

身近なところでは、CDやDVDの裏面なんかがそれにあたる。音楽や映像のデータを刻むために薄いアルミニウムの板に目に見えないほどの細かい同心円状の加工がしてあることで、光の当たり方によって虹色に光って見える。新旧を問わず、光ディスクは同様の特徴を持っている。

また、アルミニウムやステンレスなどの金属製品の表面を一定方向にわざと荒らして独特の風合いを出すヘアライン加工(ヘアライン仕上げ)が有名。同心円状にヘアライン加工をすると円の中心で交わる扇状の異方性反射を生じ、放射状に加工を施すと同心円状の異方性反射を生じる。加工と反射がちょうど直交するのが特徴。特に、ヘアライン加工による異方性反射というと同心円状の加工をイメージする人も多いはず。

一応、どんな3DCGソフトウェアでも、オブジェクトの表面に加工がされているように凹凸をつけてやれば異方性反射と似たようなことはできる。ただ、ヘアライン加工くらいの微細なレベルになるとポリゴンの数が膨大になるうえ、手間もレンダリング時間もかかるので、おのずと限界がある。そこで、LightWaveでは異方性反射を模擬するAnisotropicノードというものが備えられているのでそれを利用する。この記事を書いている時点で利用しているLightWaveのバージョンは10.1。

サーフェースの設定関連ではノードの編集はあまり得意ではないんだけど、勉強もかねて同心円状のヘアライン加工を施した金属表現に挑戦してみた。次の画像がレンダリングしたもの。

Anisotropy007

色々試行錯誤してみた結果、ノードの構成は次の画像のような感じになった。

Anisotropy000

この画像だけだと設定がわからないと思うので、順に説明していく。まず、Anisotropic (1) ノード。

「Anisotropy U」と「Anisotropy V」がもっとも大事なところで、VをUよりも十分小さい値にすると、放射状の異方性反射になる。つまり、ヘアライン加工は同心円状ということ。逆に、VがUよりも大きいと同心円状の異方性反射になる。次に大事なのは「Specularity」だけど、ここでは「100%」にしている。「Mapping」を「Cylindrical(円柱状)」にしておかないと同心円状のヘアライン加工にならないので注意。

Anisotropy001

次にAnisotropic (2) ノード。Anisotropic (1) よりも「Specularity」を若干控えめの「70%」にして、Vの値を少し大きめにする。Anisotropic (1) ノードとAnisotropic (2) ノードの「Color」出力をMathグループにあるScalarのAddノードで足してやってSurfaceの「Specular Shading」に接続する。

Anisotropy002

Anisotropic (1) ノードとAnisotropic (2) ノードのColorは白(RGB = (255,255,255))になっているけど、実はなんでもいい。「Specular Shading」に接続した時点で色の情報は無視される。光源の色を変えても異方性反射の色が変わることはない。どうしても異方性反射に色を着けたければ、Surfaceの「Color」に直接接続することになるんだけど、実物感はかなり薄れる。

次に、異方性反射と同じ理屈で鏡面反射を模擬するAni-Reflectionsノードを設定する。ここでも重要なのは「Anisotropy U」と「Anisotropy V」で、U > V にすることで放射状の鏡面反射を生じさせることができる。また、通常の鏡面反射の設定と同様に「Dispersion」を設定することで反射をぼかすこともできるし、球状反射マップを指定することもできる。ノードの設定が優先されるので、サーフェースの環境タブで鏡面反射マップを指定していても無視される。

Anisotropy005

Ani-Reflectionsノードの「Color」出力をSurfaceの「Reflection Shading」に接続する。これだけでも異方性反射らしい感じにはなるのだけれど、肝心のヘアライン加工が見えない。

そこで、LightWave付属のコンテント・ディスクに入っている画像を利用する。画像は Content\Images\Surface\Anisotropic フォルダにある brushed_03.bmp を指定する。なお、この画像はLightWaveを購入した人にのみ使用権が与えられる契約になっているものなので、フリー素材ではなく、ここでは配布できない。

Image (1) ノードは次の画像のような設定になっている。「Mapping」に「Spherical(球状)」を指定しておかないと円柱の上面に同心円状のヘアラインが出ないので注意。

Anisotropy003

Image (1) ノードの「Color」出力をAnisotropic (1) ノードとAnisotropic (2) ノードの「Color」入力に接続することで、異方性反射にヘアライン加工のような同心円状の筋が入るようになる。しかし、異方性反射以外の部分にはヘアラインが見えないのでさらにひと工夫。

Adobe Photoshopで先ほどの brushed_03.bmp を加工してノーマルマップ用の法線マップを用意する。ノーマルマップはメニューバーから「フィルター」-「3D」-「法線マップ」を選択すると設定ウィンドウが表示されて生成できる。あまり大きな凹凸をつけるつもりはないので、「ディテールスケール」を「10%」、「ぼかし」を「0」に設定して生成する。「コントラストのディテール」は特に変更しなかったが、「弱」「中」「強」ともに「20%」。

Anisotropy008

法線マップの機能はPhotoshop CC 2015で追加されたものだそうなので、古いバージョンには実装されていない。法線マップを自力で描くのはほぼ不可能と言ってもいいくらいなので、Photoshopを持っていない場合などは、ネットで画像をアップロードするとノーマルマップを生成してくれるウェブサイトがあるので、そちらを利用してもいいかもしれない。

保存した法線マップをNormalMapノードに読み込む。「Mapping」や軸などは Image (1) ノードと同様の設定にしておく。「Amplitude」はごく小さく、「5%」にしておく。今回は微細な加工を意図しているため、あまり大きくしてしまうと表面にモアレのようなノイズを生じやすくなる。バンプ・マッピングでも似たようなことはできるけど、ノイズを生じやすく、ヘアライン加工のような場面ではあまり使い勝手が良くなかった。

Anisotropy006

NormalMap (1) ノードの「Normal」出力をサーフェースの「Normal」入力に接続する。これで微細な凹凸が表面に追加され、異方性反射にも若干の分散のようなものが生じてそれらしくなる。

ただ、光が当たっていない部分のヘアラインがまったく見えないので、Diffuse Shadingを使用する。Diffuse(拡散レベル)用のテクスチャを同じく brushed_03.bmp からPhotoshopで加工する。レベル補正をかけて、明るいところはそのまま、暗いところを更に暗くするように設定。(他のMathノードなどを使って補正することができるのかもしれないけど、思いつかなかったのでPhotoshopで無精した)

Anisotropy009

保存したDiffuse用のテクスチャをImage (2) ノードに読み込む。これでも明るすぎたようなので、「Luma」出力をMathグループのDivideノードで10分の1に輝度を縮小させてSurfaceの「Diffuse Shading」に接続する。ちなみに、LumaはLuminanceの略語というか、コンピュータ用語における造語だそうで、輝度を表す。「Luma」出力の代わりに「Color」出力を使っても結果は同じ。

Anisotropy004

Diffuse Shadingを使用することによって、同じ表面の中でも明るいところと暗いところができ、同心円状のヘアライン加工らしい筋が見えるようになる。

ただ、これにはひとつ問題がある。勉強不足で理屈はよくわからないんだけど、Diffuse Shadingを使用するとサーフェースの色の情報がまったく受け付けられなくなる。Make ColorノードやColor Toolノードを追加してSurfaceの「Color」に接続しても同様。

塗装もしていない金属の地金ように色のないオブジェクトの場合はこれでもいいんだけど、塗装された表面を表現しようとするとヘアラインを諦めるか、クリアコーティングのように半透明のサーフェースで覆うといった別の工夫が必要になる。鏡面反射を設定している場合、背景色を変更すればその色を映し出させることはできるけど、他のオブジェクトにも影響を与えてしまうので根本的な解決にはならない。光源の色に影響を受けないのはSpecular ShadingやReflection Shadingと同様で、Shading系の機能を使用すればするほど実物感は増すものの、サーフェースの表現には制約を受けるようになる。

以上のように、ノードの設定は結構大変。大変ではあるんだけど、ノーマルマップのようにノードを使わないと実現できない表現もあるのですべてを避けて通るのも難しい。

最初は、順を追って各ノードの効果をレンダリング画像とともに例示していこうと思っていたんだけど、とてもではないけどひとつの記事としては長くなりすぎてしまうので、最終結果の説明のみに留めた。

関連記事

エッジ・ラインの抽出

最終更新:2016/09/06

ウェブサイトの画像を作るのに必要になったので、オブジェクト(モデル)輪郭のエッジ・ラインを抽出してみた。LightWave Super Cel Shaderを使う方法と、自己発光を使う方法のふたつを紹介する。

レイアウトのレンダーオプションで「ワイヤーフレーム」を指定するだけでは、ポリゴンの表面が全部透明になってしまい、モデリング中のワイヤーフレームのような画像が出力されてしまう(ポイントは目立たないので大昔のワイヤーフレームのゲームのような感じ)。「ラインレンダー」を有効にしてもエッジ・ラインだけが出力されるわけではない。そこで、

『裏側が見えない、余計な線も見えないソリッドなワイヤーフレーム』

を目指してみた。

最初に、「リアリスティック」モードでいつものようにレンダリングした画像。ところどころ文字やマーキングなどのテクスチャが貼られているのがわかると思う。

Dragoon-Realistic_640

これを、次の画像のように出力させるのが目標。オブジェクト・モデルはまったく同じもの。

Dragoon-Wire_640

共通手順・サーフェースの統一

まず、モデラーにある「色・質感編集」の設定で、テクスチャ・マップなどを設定してあるサーフェースをすべて主要な色に統一する。今回の場合、テクスチャ・マップを指定してあるのは主に白色の部分と青色の部分なので、基本色の設定を見ながらその2色に振り分ける。

このとき、「ポリゴン選択モード(Ctrl+H)」で「ポリゴン状態(w)」ウィンドウから「Surf:」をクリックしてサーフェース単位で選択をすると楽にできる。

3DCGは、要は数学の世界なので出力はいつも同じ結果になる。ということは、出力に影響しない作業をいかに効率化するかで時間を稼ぐ。ひとつひとつポリゴンをマウスで選択してたり、なげなわ選択で大雑把に選択してからジリジリ選択ポリゴンを減らしているようではイカンのです。

そもそも、なんでサーフェースを振り分けるなんて面倒くさいことをするかというと、レイアウトにあるオブジェクトのアイテムプロパティの「輪郭」タブで指定するラインレンダーで「サーフェイス境界」を指定すると、テクスチャが設定してあるサーフェースと設定していないサーフェースの境界を、LightWaveは「色の境界」と判断してしまうから。このため、本来カラーリングの境界線も鋭角のエッジのないところに意図しないエッジがたくさん出力されてしまう。

私の場合はだいたい、テクスチャを割り当てるポリゴンの指定には色の境を意図していない。複数のテクスチャも画像編集ツールではなく、LightWaveサーフェース上のレイヤーでブレンドしたり位置を調整したりする。UVマップはサーフェースとは関連付けられるけど独立した概念なので、オブジェクト全体をくるむようなマッピングもメカの場合はあまりしない。

全部のポリゴンをひとつのサーフェースに統一してしまうのがもっとも簡単なんだけど、隣り合うふたつのポリゴンが、例えば平面のように続いていてエッジを共有している場合は、LightWaveのレンダーはそのエッジを省略してしまう。このため、カラーリングの境界に適切なエッジ・ラインが引かれず、ただ輪郭外形(シルエット)をなぞるだけの扁平な出力になってしまう。

主要な色に振り分け終わったら、必要なサーフェースをすべて同じ色に統一する。言うまでもないけど、サーフェースは非常にパラメータが多いので、サーフェース名を右クリックしてコピー & ペーストすると楽チン。今回は暗い青(RGB = 0,0,32)にした。

LightWave Super Cel Shaderを使う方法

Super Cel Shaderはほとんどの一般的なサーフェースの設定を無視するけど、念のため「反射光」や「光沢」、「鏡面反射率」、「透明度」の設定は「0%」にしておく。なお、「拡散レベル」を「100%」にしておかないとサーフェースが真っ黒になってしまうので注意。

Edge_Cel_000

主要な色のサーフェースの「シェーダ」タブにある「シェーダ追加」プルダウンメニューから「Super Cel Shader」を選択する。シェーダを右クリックすると出る「プロパティ」で4段階の明るさの階調の境界値を0~100%の範囲で指定するわけだけど、これをすべて「100%」に指定する。すると、まったくハイライトも影もない扁平な出力が得られる。

Edge_Cel_001

シェーダもプロパティごとコピー & ペーストできるので、ひとつのサーフェースを設定したら、あとはコピーして済ませておきたい。ただし、最低ひとつはシェーダを設定していないと右クリックできないので、シェーダを設定していない場合、「編集」ボタンをクリックして「貼付け」を選択して貼り付ける。このへんはちょっとインターフェースがいまいち。シェーダの設定とまとめてサーフェース全体をコピーしてしまうのも手だと思う。

最後に、別名で保存する。綺麗に色分けしたオブジェクトを壊しては何にもならないので、上書きに注意!

下記「共通手順・レイアウト」に進む。

自己発光を使う方法

自己発光を使うほうが実はLightWave Super Cel Shaderを使うより簡単なことに後で気付いた。

具体的には、モデラーの「色・質感編集」で、「自己発光度」を「100%」に設定し、「拡散レベル」を「0%」に設定する。Super Cel Shaderの場合とは逆に、「拡散レベル」が「100%」になっていると、自己発光していてもサーフェースに微妙な陰影が出てしまうのでソリッドなレンダリング結果を得られない。

Edge_Luminosity000

「高度な設定」タブを選択し、「グロウの明るさ」を「0%」に設定する。レイアウトの設定で無効にすることもできるけど、グロウエフェクトが効いてしまうとエッジ付近にぼんやりした輪郭が出力されてしまう。

Edge_Luminosity001

サーフェースの設定が終わったオブジェクトを別名で保存してレイアウトに配置するか、既存のシーンのオブジェクトを置き換える。元のオブジェクトを上書きしないように注意!

あとは、下記「共通手順・レイアウト」の手順で同じ設定をしていけば同様の結果を得られる。基本的な設定だけでシェーダをいちいち設定しなくて済むので、こちらのほうがオススメ。

共通手順・レイアウト

レイアウトのオブジェクト選択モードにしてから、「アイテムプロパティ」を選択する。「オブジェクトのアイテムプロパティ」ウィンドウが開いたら「輪郭」タブを選択。

「点/線の太さ」を2.0px(ミディアム)、「鋭角の折り目」、「共有しないエッジ」、「サーフェイス境界」をそれぞれ1.0px(スモール)に設定する。「シルエットエッジ」を2.0px(ミディアム)にしておくとオブジェクトの外縁がはっきりしてメリハリがつき、機械出力っぽさが少し減っていい感じになる。もっとカメラとの距離が近ければ「距離でエッジを縮小」オプションがうまく効くかもしれない。

Edge000

エッジの太さは用途と必要に応じて変更する。なお、「その他エッジ」は設定しない。

エッジ色はお好みで。今回はオーソドックスに白(RGB = 255,255,255)にした。

ちなみに、「その他エッジ」をオンにするとこうなる。極端な鈍角のある多角形を三角分割したポリゴンのエッジがそのまま出てしまう。これはちょっとカッコ悪い。

Dragoon-Wire_worth

「ウィンドウ」メニューから「背景オプション」を選択して「特殊効果ウィンドウ」を開く。背景色をオブジェクトの主要色と同じ(RGB = 0,0,32)にする。

Edge001

「プロセシング」タブにある「グロウ有効」はオフにしておく。

Edge002

レイトレースは今回の場合はむしろ問題になるので、ライトは平行光源などフォールオフしないものに変えておく。レンダリング時間も短くなる。

レンダリング時間を長くしてもいいことはないので、ラジオシティを指定していたら、「レンダーオプション」にある「大域照明」タブの「ラジオシティ有効」もオフにしておく。

Edge003

レイアウトのレンダーオプションでレンダーモードを「リアリスティック」に設定し、「ラインレンダー」のみを有効にしておく。

Edge004

他にオブジェクトを配置していなければ、レンダリングをかけると、背景部分にアルファ・チャンネルができる。有効に使いたいので、BMP形式よりはPNG形式や、使用できる環境であればPSD形式(Adobe Photoshop形式)にしておきたい。まだ加工するのであれば、少なくともJPG形式などの不可逆圧縮フォーマットは避けたい。

画像の加工

ここではレンダリング画像をいったんPNG形式で保存して他のソフトウェアに移す。今回は透過機能が使いやすいGIMP 2.6を使用した。主要な色に適当なしきい値(大きくすればするほどエッジ・ラインは細くなる)の色域で一括選択をかけてやるとエッジ・ラインの内側の部分もすべて選択できる。選択部分をDeleteキーで削除してやれば、エッジ・ライン以外はすべて透明になるので、透過GIF画像や透過PNG画像として使える。

色数が少ないので、PNGよりはGIFのほうがファイルサイズも小さくなって取り回しはいいかもしれないけど、用途に応じてお好みで。

ウェブページなどで使うときに背景色や背景画像から浮いて見えてしまうハロー現象を防ぐために二値化するのもいいけど、エッジが途切れてしまったり、アンチエイリアスがかからずジャギー(ピクセルドットの段差によるギザギザ)がくっきり出てしまったりするので「古臭いコンピュータっぽさ」を演出したい時でもない限り注意が必要。拡大縮小にも弱くなるので、画像サイズの調整は減色する前にやっておいたほうがいいと思う。

関連記事

LightWave Super Cel Shader 2.15

最終更新:2016/09/06

NightBlade002f

Super Cel Shaderの使い方をド忘れして無駄な時間を食ってしまったので、備忘録。

「色・質感編集」から「シェーダ」タブを選択。「シェーダ追加」プルダウンメニューから「Super Cel Shader」を選択。必要なサーフェースすべてに関して同様の手順。

シェーダの設定はモデラーでもできるけど、出力結果がOpenGLでは確認しにくいので、レイアウトのVPRで出力具合を確認しながら設定して、後でシーンをオブジェクトごと保存してしまったほうが手軽。Super Cel Shaderを一時的に使うだけの場合は、サーフェースの設定を保存しておくか、専用のオブジェクトを用意する。

オブジェクト選択モードにしてから、「アイテムプロパティ」を選択。「オブジェクトのアイテムプロパティ」ウィンドウが開いたら「輪郭」タブを選択。「点/線の太さ」を2.0px(ミディアム)、「シルエットエッジ」、「鋭角の折り目」、「サーフェイス境界」をそれぞれ1.0px(スモール)に設定する。「共有しないエッジ」は必要に応じて。「その他エッジ」は設定しない(ワイヤーフレーム風にしたければ設定する)。

「レンダー」タブを選択して、「レンダーオプション」をクリック。「レンダーオプション」ウィンドウが開いたらさらに「レンダー」タブを選択。「ラインレンダー」オプションを設定。通常のシェーダを使っている時にラインレンダーを選択してしまうとサーフェースが透明になってポリゴンのエッジだけ色がつく透過ワイヤーフレームが出力されてしまうけど、セルシェードをする場合にラインレンダーを指定しておかないとエッジのラインが出ないので注意。

機首はサーフェース境界なのでやむを得ないけど、カナード翼後ろの部分のエッジはモデリングの手間を減らす都合上生じてしまったもの。真面目に消そうと思えば消せる。主翼端にちょこっと出てる不規則エッジも原因はわかってるけど、今回は実験なのでひとまず放置。