スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Node Editor #7 ステップグラデーション

以前紹介した二つのノードツリー「異方性反射のパターン化」と「カウンター」は、テクスチャの移動量を
場所ごとに変えるためにステップグラデーションというものを利用しています。
異方性反射のパターン化の場合はAnisotropicノードの出力をXZ平面上にタイリング(繰り返し出力)
する為に、カウンターの場合は0~9の数字を羅列したテクスチャを、inputノードに入力された数値の桁に
応じて移動量を制御するために用いられています。
今回はそのステップグラデーションについてふれたいと思います。



●ステップグラデーション(基本形)

ステップグラデーションとは通常のなめらかに変化していくグラデーションを、値が段階的に
(値が飛び飛びに)変化するようにノードによって変換したものです。サーフェイスエディタの
グラディエントのキーをステップで設定したときに出力されるグラデーションがイメージ的に近い
のですが、今回説明するものは、グラデーションのステップの幅が均等で、その幅と出力される
値が関連性を持っています。
そこでXチャンネルの出力(横方向に変化するなめらかなグラデ)をステップグラデーション化
するのを例にして、2種類のノードツリーを紹介します。


Node_07_01.jpg
Xチャンネルを直接出力した場合のグラデーション
※X ChannelはVectorScalarノードをX Channelに設定したものです。


Node_07_02.jpg
Xチャンネルをステップ化したもの(ステップグラデ Aパターン)


Node_07_03.jpg
Xチャンネルをステップ化したもの(ステップグラデ Bパターン)


AパターンとBパターンの違いは入力するステップの幅と出力されるスカラーとの関係です。
必要に応じてAかBかを使い分けます。

Aパターンは出力される値がステップ幅の倍数になります。このタイプのグラデーションは主に
テクスチャのタイリングに利用できます。例えばもしこの出力をテクスチャノードのPositionの
Xに入力した場合、ステップグラデーションのそれぞれの値の領域がどのように移動するか考えて
みて下さい。Xが0~dの間は0なので移動しません。d~2dの間はdだけ右に移動します。これは
つまり0~dの間のテクスチャがそのままそっくりd~2dへと移動してくるということになります。
2d~3dの間は2dだけ右に移動するので、これも結局0~dの間のテクスチャがそのままっくり
移動してくるということになります。結果的にXの値がどんなに大きくなろうとも、dの間隔ごとに
テクスチャの0~dの間の部分が繰り返し出力されるようになります。
またXが負の領域でも、左方向へ同じ様な移動が繰り返しおこります。

このようにXチャンネルをステップ化したものをテクスチャノードのPositionのXに入力すれば
X方向にタイリングされます。それと同様に、更にYチャンネルをステップ化したものをテクスチャ
ノードのPositionのYに入力すればY方向にもタイリングされるようになります。
異方性反射のパターン化のノードツリーはこの原理を利用して、本来一つしか出力されない同心円状
の異方性反射を平面上に繰り返し出力させているのです。

ところで、このようなテクスチャのタイリングはAnisotropicノードだけではなくImageノードや
プロシージャルノードのようなPosition入力の有るノードであれば何でも使えます。Imageノード
の場合はリピート機能があるのでステップグラデーションによるタイリングは必要が無いと思われる
かもしれませんが、実際はリピートはできてもリピートする間隔を自由に変えることはできません
(サイズそのものを変えることでしか対応でいない)
ステップグラデを使えば、使用する画像の余白を大きめにしておけば、その大きさの分だけ自由に間隔
を変えることができます。

また既存のノードだけでなく、自作のノードツリーによるテクスチャの場合も、Position入力に
相当するものを作ってさえおけば、その入力に対してステップグラデーションを入力することで
タイリングすることができます。


Bパターンはステップの幅とは関係なく…-3,-2,-1,0,1,2,3,…と整数が順番に出力されるので、
数列のようなものを扱ったり、テクスチャの各領域や、同一レイヤー内の複数のオブジェクトに番号を
与えることで個別に識別できるようにし、様々なパラメータ(移動、回転、サイズ、色、明るさ その他)
を別々にコントロールできるようにします。

前回のカウンターについて簡略化して説明すると、
まず0~9の数字を下から上へ配置したテクスチャを用意し、入力に0が入ると0を表示、入力に-1が入ると
テクスチャが1下がって1を表示、-2が入ると2下がって2が表示される、といったようにImageノードの
オフセットを調整しておきます。そしてステップグラデーションの値が0となる領域では10の0乗に比例
した分だけ下がる、グラデーションの値が-1となる領域では10の1乗に比例した分だけ下がる、
グラデーションの値が-2となる領域では10の2乗に比例して下がるといった仕組みをノードで作る
ことで、Inputに入力される数値の桁と、ステップグラデの値のそれぞれの領域の移動量を関連付けて
います。(実際にはテクスチャのスケールや文字の間隔といった入力に対してステップグラデーションの幅
が動的に変化するのでかなり複雑なノードツリーになっています。)



●基本形から汎用性のある形へ

先ほどはステップグラデーションの基本的なノードツリーの形を紹介したのですが、実はこのまま
ではテクスチャの移動やタイリングに関して使い勝手が良くないのです。そこでパターンAを例にして、
より使える形へと変化させていきます。あえて細かく過程を示していきますので、どのような意図を
もってノードツリーを変化させているのかをみてください。

まず基本形のノードで不都合なのはステップグラデが原点から始まっていることです。通常ノードエディター
で扱うテクスチャノード(Image,3D2Dプロシージャル、Anisotropicなど)は原点を中心にしているので、
ステップグラデーションの値が0となる領域(つまりグラデーションの最初のステップ)の中心も原点に来て
いないと(つまりステップグラデの始まりは原点より左の方にないと)移動させるテクスチャノードとの
位置がシンクロしません。そこでまず基本ノードを次のように変形します。

Node_07_04.jpg

Xチャンネルの後ろにSubtract(引き算)ノードを挟みました。このSubtractノードのB端子に数値を
入力するとステップグラデーション全体がその数値分だけ移動します。1を入力すれば正の方向(右に)
1移動します。-2を入力すれば負の方向(左に)2移動するようになります。このようにX,Y,Zチャンネル
に対しSubtractを接続しB端子でコントロールするのは、自作のテクスチャを移動させる為の基本的な
テクニックとして覚えておいてください。このことは例えは Y=X や Y=X^2 のグラフを横方向に(X軸方向に)
+1平行移動させるのに Y=X-1、Y=(X-1)^2 と書き換えることと同義です。

さて、先ほども書いた通りステップグラデーションの幅がどのような値であっても、最初のステップ(値が0
の領域)の中心が原点になければならないのですから、SubtractのB端子にはステップの幅の半分の-1倍、
つまりScalarノード(ステップの幅を決定するノード)の値を-0.5倍したものを入力する必要があります。
そこで更に次のように変形します。

Node_07_05.jpg

ScalarノードにMultiply(掛け算)ノードを繋ぎ、その出力を先ほどのSubtractノードの
B端子に接続しました。MultiplyノードのB端子には-0.5が入力されています。

Node_07_06.jpg

ステップグラデーションはこのようになりました。基本系のときよりステップ幅の半分だけ左にずれたことを
確認してください。これでステップの幅がどんな値でも必ずグラデの0の領域の中心が原点に来るように
なり、他のテクスチャの位置と同期するようになります。
この出力を他のテクスチャのPositionのX端子に入力することで、ひとまず横方向へのタイリングができる
様になったわけですが、さらに続けてY方向へのタイリングもするようにします。

YチャンネルのステップグラデーションはXチャンネル用のノードツリーをそのまま複製して、Vector Scalar
をYチャンネルに変えるだけで出来ます、それが下の図です。このうちX用とY用のノードで、ベクトル
タイプのノードにまとめられるものだけをまとめたものが更に下の図になります。

Node_07_07.jpg


Node_07_08.jpg

二つのノードツリーの違いを簡単に説明すると、まずX,Yそれぞれのステップグラデーションの幅を
決めるScalarノードをベクトルタイプのAdd(加算)ノードで一つにしました。X端子、Y端子にそれぞれの
ステップ幅を入力します。Addノードを使ったのは他のノードからの外部入力を可能にするためで、加算の
意味はありません。なのでB端子の方は必ず0を入力しておき使用しません。またステップ幅はタイリング
されるテクスチャの「間隔」を決定するということから「Space」と名称を変えました。
Multiply(掛け算)ノードもベクトルタイプにしてあります。X,Y,Z端子にはそれぞれ -0.5,-0.5,0 が
入力されています。Subtract(引き算)ノードもベクトルタイプとなるのでVector ScalarノードでX,
Yが分化される前の段階で接続されています。

さて次に、X,Y方向にテクスチャがタイリングされた状態を維持したまま全体を自由に移動できるように
設定します。そのためにはテクスチャノードの移動量とタイリング用のステップグラデーションの移動量を同期
させる必要があります。たとえばテクスチャノードを右に1だけ移動させたいとします、現在のテクスチャの状態
がどのような場合であっても(移動、回転、サイズがどのようであっても)PositionのXに入力される値に1を
加算しさえすれば、その状態を維持したまま右に1だけ移動するはずです。ステップグラデーションを右に1だけ
移動させたい場合は先ほども説明したように、ObjectSpotからのXチャンネルの出力から1だけ引けばいいの
でした。(もちろんY方向に関しても同様のことがいえます)そこで次の図のようになります。

Node_07_09.jpg

赤い枠で囲った部分が新たに追加したノードです。Positionノードは先ほどのSpaceノードと同じ理由により
Addノードを使用しています。そしてObjectSpotからPositionノードに入力した分が更に減算されるように
接続されています。またテクスチャ側の移動に対してはステップグラデーションの出力に加算したものを
Position入力に接続しています。

このように新たに設けたPositionノードは通常のImageノードや3DテクスチャノードのPosition入力と同様に
扱うことができます。またこの入力を利用することで、移動だけでなく回転や、拡大縮小、UVマップへの投影
も可能にします。UVマップへの投影はこれまでにも何度か説明してきたUV変換ノードツリーを使います。
回転、拡大縮小に関しては今回は説明しません。ちなみにテクスチャノードの回転や拡大縮小をいじってみて
ください。通常の場合とは異なり回転、拡大縮小が、タイリングされた個々の場所で変化します。
これはタイリングされたテクスチャが元々は中心にあり、それがまず拡大縮小が計算され、次に回転が計算され、
最後にその場所に移動する計算がされているからです。

Node_07_10.jpg

このノードツリーは汎用性が高いので、このように折りたたんで保存していつでも使えるように
しておきます。


●補足

今回ステップグラデーションを説明するにあたり、X,Yチャンネルのような直線的に変化していく
グラデーションを例にしましたが、実際には円形状のグラデーションやもっと複雑なもの(プロシージャル
テクスチャのAlphaチャンネルやモデラーでつけたウェイトなど)を入力してもかまいません。また
時間の変化を入力してもかまいません(秒数やフレーム数も時間に伴い均等に変化するグラデーションと
みなせます。)
ただしその場合元のグラデーションの変化量が均一でなければ、それによってできたステップグラデーション
のステップの幅は均等ではなくなります。

また、今回はステップグラデーションを出力する先をテクスチャなどのPositionに限定して説明しました
が、出力するステップグラデーションと形状が適合するものであれば、色々と利用できます。今回説明に利用
したものは形状が直線的なものだったので、たとえば2DプロシージャルテクスチャのU Tile、V Tileなどに
出力することでテクスチャに変化を与えたりすることができます。また円形グラデーションをステップ化して
テクスチャノードの回転に入力することで、中心から遠ざかるにつれて段階的に回転量を変えていくことが
できます。

今回説明したステップグラデーションとは、見えない仕切りを入れて空間を区分けする方法の一つです。
これ以外にも区分けする方法は色々とあり、またテクスチャだけでなくディスプレイスメント
やボリュームライト、さらにUV空間にも適用できます。空間を区分けすることで、それぞれの領域の中を
一つの塊として扱い、異なるパラメーターで制御できるようになります。一つのサーフェイス(テクスチャ)
内の異なる場所や、同じオブジェクトレイヤーの中にあるそれぞれのポイントやポリゴンの移動、回転、
拡大縮小、色、明るさ、その他をまったく別々に、または関連性をもって制御します。オブジェクトや、
インスタンスのように一つ一つの要素がIdなどで識別できるもの以外は、何らかの方法で区分けしたり、
番号化したりする方法が必要になるのです。


スポンサーサイト

theme : 3DCG
genre : コンピュータ

Node Editor #6 カウンター(数字のカウント表示)

時計やタイマー、ストップウォッチ等の数字をカウント表示するノードツリーを組んでみました。
ノードの使い方などについて説明します。(使用シーンファイル ver9.6以上:Node_06.zip)

Node_06_01.jpg


●ノードの基本操作

カウンターノードツリー(Node_06_01.lws参照)
カウンターノード
※①~⑤の入力用ノードはA端子のみ使用して下さい。


①Position
出力される数字の基準位置(数字の位置)をXとYの入力で調整します。通常のテクスチャの
Position入力と同様に扱って下さい。
テクスチャの基準位置は数字が何桁であっても一の位の数字の中心です。

②Scale
出力される数字の拡大縮小を調整します。拡大縮小の中心位置はPositionで入力されている
座標です。

③Space
数字と数字の間隔を調整します。基準位置を中心に文字が移動します。

Node_06_03.jpg
文字の間隔とScale、Spaceとの関係


④Digits
数字の桁数を決めます。Inputで入力されている数の桁数より大きい位には0が表示されます。

Node_06_04.jpg
Input = 5963、上段はDigits = 4、下段はDigits = 6

⑤Input
表示する数値を入力します。Inputにはプラスの数値で9桁まで入力できます。それ以外は
誤表示されます。9桁以上の数字を表示したい場合はこのノードを二つ並べて出力するなど
工夫が必要です。また小数点以下は入力しても無視されます。

⑥Image
表示の元になる数字のテクスチャを設定します。異なるフォントを使用したい場合は、フォト
ショップやイラストレーター等を使って次のような仕様でテクスチャを作成し、画像を置き換え
てください。

Node_06_05.jpg
0~9までの数字を正方形の中心にそれぞれ配置したものを、下から上に向かって順番に
並べて合体した白黒画像です。画像解像度はレンダリング時に見合うものを用意して下さい。

既製のフォントに更に手を加えたテクスチャや、自作のフォント、イラスト等をカウンターの表示
に使ってみるのも面白いかもしれません。

⑦Image
表示に必要の無い余分な数字を見えないようにするマスク用の画像です。あらかじめ用意されてる
正方形の画像をそのまま使用して下さい。


⑧Output
数字が白黒のアルファチャンネル画像としてZ軸方向に(XY平面に)出力されます。
Z軸方向以外もしくは曲面上に出力したい場合は、面倒ですが前回(Node Editor #6)同様
ポリゴンにUVマップを設定して、UV変換ノードをPositonに入力して下さい。
(そのときUVのVの出力はMake VectorノードのYに入力します。)

数字に色をつけたい場合はMixerノード(Bg Color、Fg Colorを設定して)のOpacityに
入力します。

数字の周囲のポリゴンを透明にしたい場合はOutputをInvertノードに入力し、Invertの出力を
Transparencyに入力します。



●実際にカウントさせる

数字を表示させるだけでなく実際にカウントさせるには、InputのA端子にエンベロープ
を設定するか、外部から数値が変化するようなスカラーを入力します。例えばA端子に次の
ようなエンベロープを設定すれば、1秒に1ずつカウントアップさせることができます。
(今回のノードツリーではInputの入力の少数点以下は無視される仕様です。)

カウントする速度を変えたいときは30フレームにあるキーの位置を横方向に動かして下さい。
60フレームに移動すれば2秒で一回、15フレームに移動すれば0.5秒で一回カウントするように
なります。

またカウントする速度を動的に変化させたいなら、新たに作成したScalarノードに(Time (s)と
名づけておく)このエンベロープ(一秒に1増加)を設定し、その出力にMultiplyノードを
接続し出力の倍率を動的に変化させたものをInputに入力します。

Node_06_06.jpg

ところでこのカウンターは10進法でカウントしているので時計やタイマーの時間や分を表現して
いるわけではありません。本当の時計を作っているわけではないので見た目だけならこのままでも
十分使えるとは思いますが(ただし時間、分、秒の間を仕切るコロン(:)は自分追加して下さい。)、
もし興味のある人は自分で上図のエンベロープ(1秒に1ずつ増加するスカラー)を60進法へと変換する
ノードツリーを組んでみてください。
(グラフエディターでエクスプレッション等で実現する方法もあるかもしれませんが、このブログ
的にはやっぱりノードでやってみてほしいところです。そんなに難しいものではないのでトライして
みて下さい。これに関しては後日ノードをこっそり追加するつもりでいます。)

Node_06_07.jpg


●その他

ノードのグループ化
上のノードツリーを見てノードの多さとごちゃごちゃした配線に「うげっ…」て思った人も
いると思います。(この見た目からレンダリングが重そうな印象を受けるかもしれませんが
実はそうでもありません。)カウンターはこれ単体で使うよりは他のノードと組合せて使うこと
の方が多いと思うので、このままだと邪魔で気軽に使おうという気にもならないでしょう。
そこで複数のノードを一つにまとめるプラグインを使ってみました。

Node_06_09.jpg
db&wさんのフリーのプラグイン集 poms nodesの中にあるGroup Nodeを使用しました。

小数点以下の表示
入力される数値の小数点以下は無視されると説明しましたが、小数点以下の値も表示する方法
はあります。それはInputに入力する前にMultiplyノードで表示したい小数点以下の数が
整数になるまで倍率をあげればいいんです。例えば小数点以下第三位までを表示したいなら
入力前に1000倍にするようにMultiplyノードを追加しておき、正しい位置に小数点が表示される
よう、適当な点のテクスチャを今回のノードツリーのOutputと合成しておくのです。

テクスチャの値を読み取るには?
テクスチャの特定の座標における値をピンポイントで読み取る方法があります。
例えばTurbulenceの座標(0.1,0.1,0.1)におけるアルファの出力値が知りたいならば次のように
ノードを組んでSubtractのB端子に座標(0.1,0.1,0.1)を入力すれば得られます。

Node_06_10.jpg

Inputに入力する前に100000倍(10の5乗倍)しているのでアルファ値の出力は小数点以下第5位
までで0.67538ということが分かります。(余談ですがTurbulenceのアルファ値は座標が整数値
の場所では必ず0.5となるようです)
この手法はカウンターにランダムな数を表示させたいときなどに利用して下さい。

今回のテーマとは関係ありませんが、上図のようにImage(画像)や3D・2DテクスチャのPosition入力に
Spot InfoとSubtractを接続し、SubtractのB端子に座標を入力すればその場所のColorやAlphaが出力
されるようになります(この理屈はわかるでしょうか)。これを利用するとまた色々と面白いことが
できると思います。


カウンターノードを使って作成した時計のディスプレイ(Node_06_02.lws参照)

theme : 3DCG
genre : コンピュータ

Node Editor #5 異方性反射(Anisotropic)のパターン化

LW標準の異方性シェーダ(Anisotropic、Ani-Reflectionsノード)
を使って、次のようなパターンを繰り返すサーフェイスを組んでみました。
(使用シーンファイル ver9.6以上:Node_05.zip

異方性反射のパターン化:XZ平面
Node_05_01.jpg


● 基本形(XZ平面)
下の図のように、赤い線で囲まれたノードツリーを読み込み、Anisotropicノードの
Centerに接続します。(Node_05_01.lws参照)


Node_05_02.jpg

Positionはパターンの移動、Scaleは大きさの調整に使用します。
(どちらもA端子のみ使用します。)

Imageノードにはパターンの形状を定義する白黒画像を設定します。
今回はイチョウの葉の形状を使用しましたが、異なる形状のパターンを試してみても
面白いと思います。

Anisotropic、Ani-Reflectionsノード内のパラメータについては、その時々のシーンに
合わせて自分で調整して下さい。

このノードツリーはパターンがXZ平面に(上下方向に)出力されるように組まれています。
もし、前後(XY平面)か左右(ZY平面)に出力したい場合は軸に関わる部分のノードツリーを組み替えてください
(Anisotropicノード内のAxisも変える)。



● UVへの投影
AnisotropicのパターンをUVを設定した曲面に投影するには、以前Node Editor #3
解説した手法を用います。
imageノードや3DテクスチャノードをUVに投影するのに、下図のようなノードツリーを
テクスチャノードのPosition入力端子に接続しましたが、今回はこれを自分で作った
ノードツリーのPosition入力に接続します。(Node_05_02.lws参照)


UV変換ノードツリー
Node_05_03.jpg
※Node Editor #3のときの作例とは異なり、今回はXZ平面からUVへの変換なので、UVmapノードのVの出力を
Z端子に接続しています。


Node_05_04.jpg

赤線で囲った部分がUV変換ノードツリー(折りたたんで表示)です。
UVへ変換したとき、パターンのサイズがかなり変わってしまうので、Scaleノードで調整してください。


異方性反射のパターン化:UV投影の作例
Node_05_05.jpg
※シーンファイルはver9.6で作成しました。ver11でレンダリングする際には
レンダーパネルのカメラタブで、アンチエイリアスのレベルを調整し直してください。


今回はAnisotropicをパターン化する方法を紹介しましたが、ここから更にAnisotropicの明るさや
反射の値を同心円方向に不均一化したり、バンプで凹凸を与えたりして金属表面の荒れた感じを
出すと、より実物っぽくなります。
Node_05_06.jpg

theme : 3DCG
genre : コンピュータ

Relativity #9 整列して複製

オブジェクトを複製した時に付く拡張番号(#ex)を使って整列させる
Relativity エクスプレッションです。(使用シーンファイル。ver9.6以上:Rel_09.zip


●使い方
1、複製元のオブジェクトに対し、モーションオプションパネルのモディファイヤに
Relativityを追加してエクスプレッションファイル(Array.exp)をロードします。


※Relativityはmodが使えないようなので、floorで余りの計算をしています。
そのせいで計算式がちょっと長ったらしくなってます。

2、Variablesパネルを開いてA~Fの値を設定します。A、CはX、Z方向の複製個数、
D~FはX、Y、Z方向の間隔です。Y方向の個数は複製する総数で調節して下さい。
複製する数が多ければその分オブジェクトが上方へ積み上がっていきます。

3、Relativityのパネルを閉じてから複製元のオブジェクトを選択しCtrl+Cを押して
複製する数を入力してください。例えばXYZ方向に3列ずつ配置したい場合、複製数の
入力欄に「3*3*3-1」と入力します。するとオブジェクトは#exの値に対して次のような
順に配置されます。




●応用例
コントローラ用にCtrlと名付けたヌルを作成し、VariablesのD~Fにそれぞれ
次のように入力すれば、オブジェクトの間隔を自由に制御できるようになります。

スロット:数式(Variables)
D:XS(ctrl,t)
E:YS(ctrl,t)
F:ZS(ctrl,t)




またオブジェクトの配置に乱れを与えたい場合、X,Y,ZスロットにNOISE(expr)
を加算して下さい。NOISEは-0.5~0.5の範囲内で乱れを与える関数です。
例えばXYZ各方向に対して-1~1(m)の乱れを与えたい場合、各スロットの元の数式の後ろに
次のようにNOISEを加算します。

X: … +2*NOISE(#ex)
Y: … +2*NOISE(#ex+100)
Z: … +2*NOISE(#ex+200)

※NOISEのカッコ内の値はx,y,zスロットそれぞれ異なる値となるようにします。



更にNOISEのカッコ内を時間変化させればまた面白い効果が生まれます。

theme : 3DCG
genre : コンピュータ

Node Editor #4 Displacementの制御

ディスプレイスメントと聞くとテクスチャを使ってオブジェクトの表面を変形
させたり、揺らしたりするようなテクニックを思いうかべるかもしれませんが、
今回紹介するのはノードを使ってジオメトリの移動、回転、拡大縮小を正確に
制御することを前提にした手法です。
(作例の中で、Denis Pontnnierさんによるフリーのプラグイン DPKitの
Item Infoノードを使用しています。サンプルシーンを正しく動作させるには
DPKitのインストールが必要です。)
(使用シーンファイル。ver9.6以上:Node_04.zip

●ジオメトリをNullオブジェクトに追従させる
コントローラとしてNullオブジェクトを作成し、その移動、回転、拡大縮小の
情報をオブジェクトのポイントに伝える為に次のようなノードツリーを組みます。
(Node_04_01.lws参照)


※ふたつのSpot InfoからはどちらもObject Spotが出力されています。
※Transform 2はパネル内のInverse Transformをオンにします。

図中のItem Infoノードにコントローラ用のオブジェクトを選択すると、ただちに
ジオメトリがコントローラと全く同様に動きますが、残念なことになぜかリアル
タイムに反応を確認することができません(うちの環境だけ?)。
フレーム位置を動かすと反応しますが、それでは不便なので次のようにします。
まず新たにNullオブジェクトを作成し、名前を制御したいオブジェクトと同名
にします。そしてそのNullをコントローラ用のオブジェクトの子に設定(ペアレント)
すればリアルタイムに反応を確認できるようになるはずです。
Nullの動きに追従しているのはオブジェクトではなく、オブジェクト内のジオメトリ
(ポイントやポリゴン)であることを確認してください。。

ひとまず基本形としてこのノードツリーを紹介しましたが、このままではほとんど
利用価値がありません。そこで次にこのノードを実際どのように使うか紹介します。


●パスに沿って押し出し
先ほどのコントローラでパスを描き、それに沿ってオブジェクトを
伸縮するような変形モーションを作成します。これは変形プラグインの「Trailer」
に相当するアニメーションをノードで行うものです。(Node_04_02.lws参照)

オブジェクトの作成
モデラーで押し出すオブジェクトを作成します。どのような形状のものでも
押し出せますが、ここでは説明を簡単にするため単純な形状を円筒状に押し出した
オブジェクトを作成します。分割数はレイアウト上でどれだけの距離を押し
出すかにもよりますが、ここでは50としておき、更にマップ種別「平面状」、
軸をZにしたUVマップを設定します。

オブジェクトをZ方向に倒し、オブジェクトの中心軸とZ軸が同位置にあることを
確認して、Star.lwoという名前で保存します。




レイアウトでの準備
作成したオブジェクトを読み込み、コントローラ用にCtrlと名付けたNullを
作成します。更に押し出し用のオブジェクトと同じStarと名付けたNullを
作成してCtrlの子にします。Ctrlのモーションオプションパネルを開き、制御と
制限タブでヘディングとピッチを「速度に沿う」にします。

Ctrlを使って適当なパスを描きます。パスの終点のフレーム数は秒換算しやすい
ように30の倍数にし、更に1フレーム足した数にしておくとあとあと面倒がありません
(ノードエディタ内ではフレームではなく秒でスカラーを扱う場合が多いので)。
例えばパスを0~4秒の間で描く場合、終点は121フレーム(120+1)とします。
最後の1フレームは、Ctrlに「速度に沿う」を設定しているので、120フレーム目に達し
たときあさっての方向に向いてしまわないようにするためのものです。

ノードの説明
押し出し用のオブジェクト(Star.lwo)のアイテムプロパティ変形タブの
ノード編集をオンにしてからノードエディタを開きます。ノードの入力(右クリック)
で「Extrude.node」を読み込みます。



赤い線で囲んだ箇所は初めに紹介したノードツリーと異なる部分です。
まずItem InfoノードがLW標準のものからDPKitのものに置き換わっています
DPKitのItem InfoにはTimeという接続端子が有り、ここに入力された時間(秒)における
アイテムの各情報が出力されるようになっています。(LW標準のものはカレントタイムの
情報しか取得できません)

SpotInfoとTransform 2の間にMultiplyノードが接続されました。これは押し出し用の
オブジェクトが0フレーム時に厚みの無い平らな状態にしておく為に、Z方向に0を掛け
るためのものです。もしモデラー側でぺちゃんこにしておいた場合には必要のないノードです。

Item Infoノードの左側にある四つのノードは、押し出し用のオブジェクトのUVマップ
と時間とを関連付ける為のものです。
UVマップノードの出力がUかVかは、オブジェクトの分割方向がU、Vどちらの向きで作ったか
によって判断してください。
StartとEndはそれぞれ、オブジェクトの開始点(オブジェクト後方)と終点(オブジェクト前方)
の位置情報を、Ctrlで描いたパスのどの時点から取得するのかを設定します。今回の作例では
Ctrlによるパスは121フレームで描いているので、StartとEndには0~4(秒)の値で制御します。
また同時刻にStartの値がEndの値より大きくなってしまうとオブジェクトは裏返ってしまうので
注意が必要です。

ノードをInputに接続したらタイムスライダを動かして実際にどのような動きを
するか確認してみてください。Pathtoolなどを使ってCtrlのパスを、押し出された
オブジェクトの形状を確認しながら修正することもできます。

このノードは単純な円筒状のオブジェクトだけでなく、適切に分割されUVが設定されている
オブジェクトであればどのようなものでも適用できます。例として、文字を立体化した
もの(LW.lwo)を用意しました。Star.lwoと置き換えて確認してみてください。





●更に応用
上で紹介した手法だけでは変形プラグインのTrailer以上のものとはいえませんが、
ノードエディタの中で更にノードツリーを追加したり接続を変更することで、
より自由にジオメトリの制御が可能になります。
例としてモーションを二つのパスから参照するノードを組んでみました。
オブジェクトの先頭から後方にかけて参照するパスをCtrlからCtrl2へと徐々に遷移
させています。(Node_04_03.lws参照)



theme : 3DCG
genre : コンピュータ

カレンダー
07 | 2016/08 | 09
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
最近の記事
カテゴリー
最新コメント
プロフィール

Author:Diaspar
2008年10月7日から開始

ブログのテーマ
CG(主にLightWave 3D)について
mail:diaspar1006@gmail.com

最新トラックバック
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。