D-Creationへいらっしゃいませ。
ここではLightWave3D用プラグインやら変態絵やら変態妄言やら死ぬまでの暇つぶし的人生の進捗状況やらを垂れ流してます。

ファイルの扱い、リンクについて
プラグイン等のファイル自体の無断転載はご遠慮願います。
このサイトへのリンクは自由ですが、プラグインはバージョンアップなどでファイル名が変わるため、それらファイルへの直接リンクをする場合は注意してください。

管理人 : DHM
メール : dhm◎d-creation.sakura.ne.jp
(@を文字に直してください)
バナー

2018年12月18日

【不定期連載】Lightwave3Dノード入門その3

今回はレイアウトの状態によるノードの挙動の変化についての説明です。
LWのノードは自由度が高く、サーフェイスからモーションまで多くの要素をノードでコントロール可能です。
しかし、全てのノードが全ての場面で使えるわけではありません。

例えば、シーンに適当なアイテムを追加し、モーションパネルのモディファイヤからNodal Motionプラグインを追加します。
これはノードによって位置、回転、スケールをコントロールできるプラグインですが、ここでノードエディターの左側のリストを確認すると……
181218_001.jpg
サーフェイスのノードエディターと比較すれば一目瞭然、モーション側には一部のレイトレースノードとマテリアルカテゴリが表示されていません。
これは各ノードプラグインのプログラム内で表示を制限しているためです。
例えばマテリアルノードですが、モーションにはマテリアルタイプの接続が存在しません。
マテリアルは同タイプ同士でしか接続できないため、使えないものを表示しても邪魔ということで非表示設定にされているのだと思われます。
ただ、この設定は任意のためサードパーティー製のプラグインの中には使えない場所でも表示される場合があります。

一方のレイトレースノードですが、RayCastGeometryだけが表示されています。
こちらも使用できないノードを非表示設定にしているわけですが、非表示にしている理由が異なります。
LW2015以降、レイアウトにはレンダリングを行うために
・サーフェイスプレビュー(色・質感設定パネルなどにあるの球のレンダリング)
・VPR
・本レンダリング
の3つの方法があります。
このレンダラーが動作している状態はレンダリングセッションと呼ばれ、Nodal Motionで表示されなかった
2つのレイトレースノードはレンダリングセッション中しか動作しません。
実際には各種マテリアルノードなども内部でレイトレースを使用していますが、処理の中で現在レンダリングセッションかをチェックし、レイトレースが使用できない場合はダミーのデータを返したり処理をスキップしています。

仮にNodal Motionでレイトレースノードが使えたとしても、作業中のOpenGLビューとレンダリングでモーションが変わってしまい実用的ではありません。
しかし、Unityなどのゲームエンジンでもレイキャストを使用してオブジェクトの接触をチェックするなどレンダリング以外の目的でも便利に使用できるため、LWでも新たにレンダリングセッション以外でも使用できるレイキャスト機能としてRayCastGeometryノードが提供されています。
リファレンスのRayCastGeometry使用例でも自動で地形の凹凸に沿って球を動かすための判定に使用しています。
通常のRayCastノードとRayCastGeometryノードの使い分けですが、基本使用できる場面ではRayCastノードを優先すべきです。
リファレンスの注意書きにもありますがRayCastGeometryノードはゲームエンジンのようにリアルタイムでレイキャストを行っているようなものなので処理が重いという欠点があります。
一方RayCastノードはレンダリングセッションでしか動作しない代わりに、レンダリング用に事前処理を済ませたシーン情報を使用するため非常に高速です。
posted by DHM at 04:07| Comment(0) | TrackBack(0) | ノード入門

2018年12月06日

【不定期連載】Lightwave3Dノード入門その2

今回は各ノード間を通る値の話です。
まだまだ基礎の話が続きますが、ノード単体の挙動の前に各ノード間のデータの流れを知ることが重要と考えています。
逆にここを覚えればNewtekのフォーラムで公開されている優れたプリセット群を読み解いてアレンジしたりとできることの幅が広がるはずです。

前回の接続タイプ説明では整数や小数とだけ記載しましたが、実際のノード設定パネル上では距離や角度、パーセントと様々な単位が混在しています。
これらの各単位がそれぞれスカラー値でどう扱われるかが以下になります。

パーセント 100% = 1.0
距離 1.0m = 1.0
角度 約57.295°= 1.0

例えば、0.5の値をパーセント入力に接続すると50%に、距離なら50cmになります。
特殊なのが角度で、中途半端な値になっていますがこれはLW内部ではラジアンと呼ばれる角度単位に変換されるためです。
ラジアンについての詳細は省きますが、90°でπ/2、180°でπ、360°で2πという値となります。
度からラジアンへの変換は度に180/πを掛けます。
逆の変換はラジアンへπ/180を掛けるので、57.295*3.1415926/180.0でだいたい1.0となります。

実際に出てくる値を確認するのに楽な方法はサーフェイスノードを使ってレンダリング画像に出力してみることです。
181206_001.jpg
181206_002.jpg
DiffuseShadingのRGBにそれぞれ100%、1.0m、57.295°を接続してレンダリングしてみます。
角度が変換されたBlueの部分には多少の計算誤差は出てしまいますが、ちゃんとRGB1.0の白として出力されています。
LW2018の場合はレンダーバッファを作成してそちらに接続すれば同じことができます。
サーフェイスノードの設定で思い通りの結果にならない場合は途中のノードをこの方法で出力して値を確認しながら組み立てるとやりやすくなると思います。

次は異なるタイプ同士の接続について。
ノードエディターを操作していると、整数を小数に接続したり、3つの値をもつベクターを1つの値しか持たないスカラーに接続したり、あるいはその逆もできてしまいます。
前者は1つの値同士なので何となく結果も予想できますが、後者はどうなのかといった疑問が出てきます。

異なるタイプ同士を接続した場合は、LW内部で適切な値に変換されるようになっています。
接続線にグラデーションがかかりますが、あそこで変換されているイメージです。
しかし、ファンクションやマテリアルといった特殊な挙動や数値データ以外の接続タイプではエラーメッセージが表示されて接続できないものもあります。

これらの情報はリファレンスに表として記載されているのでそちらを参照するのがわかりやすいでしょう。
LW2015ならLW2015ReferencesJ.pdfの1785ページにあります。
大体は予想した通りのシンプルな変換になっていると思いますが、ひとつだけ注意点があります。
それはカラーとベクターの3要素のタイプを整数やスカラーの1要素に接続した場合、カラーとベクターとでは挙動が異なる事です。
ベクターから1要素に接続した場合はXやHといった先頭の要素だけ渡されます。
しかし、カラーの変換をリファレンスで見ると「CCIR601 輝度の値」と書かれています。
これは映像信号の規格に基づいて色から輝度を算出してその値を渡します。
輝度を求める式は
輝度Y = 0.299*R + 0.587*G + 0.114*B
となっており、単純な平均ではないことがわかります。
そのため、カラーをスカラーに変換して使いたい場合はToolカテゴリにあるColor Scalarノードを挟むことをお勧めします。
Color Scalarノードは平均値や最大値、赤のみなど様々な方法で色を変換できるので思い通りの処理ができます。
posted by DHM at 14:38| Comment(0) | TrackBack(0) | ノード入門

2018年11月13日

【不定期連載】Lightwave3Dノード入門その1

皆さんノードって使ってますか?
特にLW2018ではサーフェイス設定が実質ノードオンリーとなったり、モーション、ディスプレース、ライトとあらゆる要素をノードエディタでコントロールできるようになったため、活用することでより多彩な表現が可能となります。

が、その一方で公式のドキュメントに説明不足な面もありとっつきにくいのも事実。
なのでその不足分を補えればとノードの使い方について説明していきたいというのが連載の趣旨となります。
元々仕事辞めた空き時間に電子書籍とかやってみたい程度のノリで書いていたもので、すぐに今の仕事が決まったためストックもあまりないのですが少しでも役に立てば幸いです。

ただ、内容にはプラグインを作る過程で独自に調査したものも含まれるため、間違いがあったらそこはご容赦を。

第一回目はノード接続タイプの説明です。
この辺りは公式のリファレンスでも説明されているので復習ですね。

ノードのインプット、アウトプットには名称だけでなく色つきのコネクタがセットになっています。
この色が接続タイプを表しています。

181103_001.jpg
・カラー 小数x3
おなじみの色データです。
それぞれがR、G、Bに対応した3つの小数が並んだデータです。
スライダーなどでは0〜255の整数で設定しますが、ノードに限らずLW内部では0.0〜1.0で扱われます。
1.0を超える値も使用することができ、その場合はHDRカラーであることを意味します。

181103_002.jpg
・ベクトル 小数x3
x、y、zといった3つの小数の集まりを表すデータです。
形式としてはカラーと全く同じものですが、ベクトルが表現できる値は多数あるため、わかりやすくするためにカラーと分けたものと思います。
ベクトルは3DCGでは多々使われる表現のため、ノードでも様々な使用方があります。
基本的な所では座標を表すXYZ、回転のHPB、スケールのXYZはベクトルの接続タイプで渡されます。
他にもレイトレースを行うノードではレイを飛ばす方向もベクトル、ポリゴンの法線もベクトルで指定する必要があるなどベクトルまみれです。

181103_003.jpg
・スカラー 小数x1
1つの小数値を扱います。
これもベクトル同様に使用頻度は高く、ウェイトマップや角度、距離、パーセンテージの項目はこのスカラーでやり取りします。

181103_004.jpg
・整数 整数x1
1つの整数値を扱います。
ノードによってはポップアップの選択項目やフラグのON/OFFをインプット接続で制御できるものがあるため、そんな場合に使ったりします。

・関数 小数x1
黄色のFunctionという接続名です。
こちらもスカラー同様に1つの小数を扱いますが、特殊な動作をする接続タイプでスカラーなどと接続しても動作しません。
関数接続はノード内部で計算中の値を関数入力から関数ノードの出力へと逆流させ、値を受け取った関数ノードでその値を加工し、加工後の値を関数ノード出力から関数入力へ送り返すという往復した動作を行います。
(例)
181103_005.jpg
関数未接続のBricks2Dノード。

181103_006.jpg
Gain関数ノードで加工したもの。
Bricks2Dを始めプロシージャルテクスチャ系のノードは生成した模様のグレースケール値を返します。
それを受け取ったGainではプレビュー部に表示されているような変換を行います。
グラフは横軸が0.0〜1.0で値はBricks2Dから受け取ったもの。
縦軸も0.0〜1.0でResultが返す値。
これを意識してBricks2Dの接続前後を見てみると、接続前の黒->白のグラデーションになっている部分がGainのグラフの通り黒->白->黒となっているのがわかります。

ノードの内部処理にさらに処理を割り込ませることができる関数接続ですが、欠点としてはノードから受け取れる値が分かりにくいことです。
ひとまず単純な関数グラフを作ってノードのFunctionを接続、その変化からどんな値を出しているのかチェックしてみるといいでしょう。

・マテリアル
白いコネクタのマテリアル接続はサーフェイスの質感を受け渡しますが、LW2015とLW2018では扱う値が異なります。
LW2015では
・拡散色
・スペキュラ色
・鏡面反射色
・透過色
・透明度
とレンダリング画像を構成するための各要素のシェーディング計算後の色と透明度の要素をまとめたものです。

標準ノードを使用してマテリアルから各要素を取り出したり、逆に各要素を組み合わせてマテリアルを作成することもできます。
181103_007.jpg

レンダラーが刷新されたLW2018ではマテリアルの内容は全く異なり、カメラから放出されたレイがポリゴンなどにヒットした際にその位置の質感を計算するための計算式とパラメータを登録します。
質感が鏡やガラスならそこからさらにレイを放出、またポリゴンにヒットしたらそこの計算式とパラメータを登録……
と繰り返して最後に登録された計算をまとめて行うようです。
そのため、前述のLW2015にはあったマテリアル内の要素を分解するノードは無くなっています。

・カスタム
マテリアル同様白いコネクタの接続で、ノード本体をプラグインなどで自作した場合にカスタム接続を作成することができます。
これはその名の通りプラグイン製作者が自由に定義できるデータで、文字列やポリゴンメッシュの受け渡しも可能です。

実用性は別として手続き型のモデリングプラグインも作れるかもしれません。
これも関数同様に同じ定義同士の入出力を繋がないと機能しません。

今回はここまで。
次回は各ノード接続が扱う値とLW内の単位の説明です。
posted by DHM at 00:51| Comment(0) | TrackBack(0) | ノード入門