2010年1月19日火曜日

3D buzz 「The Upper Bridge Tier」

3Dbuzz の吊り橋のデジタルアセットを作成するビデオ・チュートリアル。(ユーザー登録必要)

第二回:「The Upper Bridge Tier」(全13回)


1)ネットワークビューで、Geometryノードを作成名前を「bridge」にする。
デフォルトではキューブが作成されるのでオブジェクトノードの階層に入り「file」以下を削除


<「マスターコントロール」とパラメータの追加
2)Geometoryノード(bridge)内で、Nullを作成し、名前を「materControl」にする
右クリックで「Edit Parameter Interface」を実行
「float」パラメータを二つ追加:(左から右のペインへ、二回ドラッグ&ドロップ)
3)一つ目のFloatパラメータのNameとLabelを「width」に変更
Applyボタンをクリックすればパラメータ・ペインへ新しいパラメータがスライダ付で表示される。
「Range」に最小値0.001をセットしロック(カギアイコンをクリック)、最大値は5にする。
4)二つ目のFloatパラメータのNameとLabelを「length」に変更
「Range」の最小値に0.001をセットしロックする。最大値はそのまま(10)

(これらの設定は後ほどデジタルアセットノードに移動する。)



<橋の道路部分を作成の流れ>
カーブを作成 -> ポリゴン平面を作成 -> ポリゴンをエクストルードして立体化。
注意点としてはカーブはサーフェイスを作るに十分な数が必要。
要するに四角形であれば幅と長さ方向を決めるパスカーブの役割をもつラインがそれぞれ一つ必要となる。
Line
Skin
polyExtrude
の3つがあれば出来るはずだが、このチュートリアルでは
lineの長さを後から調整し、それによりそれが道路全体の幅と長さを後から変えられるようにする。
長さの調整には、LineのDistanceをいじるのではなく、Transformを接続しそのスケール値を変更して、調整している。
(Lineのパラメータ調整でも似たようなことはできるが直感的ではない)


<Length「ライン」の作成:道路の縦方向(全長)の基準になるライン>
5)Nullと同じ階層に「line」ノードを作成「bridgeLength」と名前を変更
(defaultではVisibilityがoffになっているのでonにする)
6)ビュー右端のDisplayPointと DisplayPointNumberをonにする。
7)DirectionをZ方向にする(「1」を入力)


<「transform」ノードの作成:上記のラインのスケールをするために使用>
8)上記LineのOutputo部分を右クリックでtransformノードを作成
(ネットワークにつながったxform1が作成される。)
名前を「lengthScale」にする。


<パラメータのリンク>
9)masterContorl のLength値(例:5.62)を右クリックして「copyParameter」
11)「lengthScale」のScale Zに対して右クリックから「paste copied relative preferences」を実行。
この中にch("../masterControl/length")lengthlengthと自動入力される。
「..」はLinuxのように一つ上の階層、ここでは、Bridgeジオメトリノードをさす。


<Width「ライン」の作成:道路の幅方向の長さをきめるライン>
先ほどのLength「ラインと」ほぼ同じステップを踏む。
11)Nullと同じ階層に「line」ノードを作成「bridgeWidth」と名前を変更
12)DirectionをX方向にする(「1」を入力)
13)OriginX を-0.5にする。
これによりX方向にスケールする際、左右均等にスケール出来るようになる。


<「transform」ノードの作成>
14)上記LineのOutputo部分を右クリックでtransformノードを作成。
(ネットワークにつながったxform1が作成される。)
名前を「widthScale」に変更


<パラメータのリンク>
15)masterContorl のwidth値(例:0.62)を右クリックして「copyParameter」
16)「widthScale」ScaleXに対して右クリックから「paste copied relative preferences」を実行

上記で「masterControl」のlengthとwidthパラメータが、それぞれのラインをスケールする値として使われるようになる。


----------------------------------------
これは、MayaのNurbsサーフェイスをカーブから作成する方法に似ている。
それがHoudiniではポリゴンで可能となる。
さて、両端二つのラインは常に同じ長さを保つ必要があり、また縦方向のラインの長さが変わっても常にその両端に幅方向のラインが位置している必要がある。
そのためCopy SOPsを使用することで、長さの統一、位置の自動追随を可能にしている。
(Mayaでいうとヒストリーを維持しているようなものだが、両端に位置づけるのはMayaでは一工夫必要)
input1:Primitives to Copy
input2:template to Copy to

調整可能なサーフェイスを作るだけならLineを縦横二つ作り、それをSkinSOPに接続すれば作成できるのだが、このチュートリアルでは、TransformとCopyをわざわざ使ってサーフェイスを作っている。
Transformを使用するのは、後に別のTransformを作り条件によってどちらのTransformを使うかを切り替えられるようにするためである。これにより同じオブジェクトに対して異なるコントロール方法を持つことが出来る。

またSkinノードで、サーフェイスを作成するには、UとV方向のラインが必要
input1:U (and Possibly V) Cross-Sections
input2:V Cross-Sections
であるがこの作例では、Copy SOPからの出力をinput1につないでいるだけでポリゴン面が作成されている理由も不明


<コピーSOPsの作成>
18)copyノードを作成名称を「widthLengthCopy」とする。
19)Number of Copy が1であることを確認。
20)Input1へwidthScaleとInput2へLengthScaleを接続


<スキンノードの作成>
21)「widthLengthCopy」のアウトプットを右クリックして「skin」ノードを作成
22)名称を「skinTierSurface」にする


----------------------------------------
道路の厚みを作るために、上記のスキンをエクストルードする。
23)「masterControl」ノードにflat値のパラメータを追加し「tierThickness」という名前に変更
最小値を0.001でロックし、最大値は0.5にする。
(パラメータ作成後、値を 0.05程度に設定しておく)

<ポリゴンのエクストルード>
24)「skinTierSurface」ノードの出力を右クリックして「polyExtrude」ノードを作成
名称を「tierExtrude」に変更
25)TranslateZへ先ほどの「tierThickness」「paste copied relative preferences」で接続。 (これによりポリゴン・サーフェイスが起点から上方向へ引き出される。)
26)パラメータ画面で、Optionタブを開き「Output Back」をOnにすれば開いていた底がふさがる。

※エクストルードは選択された面の縦横がそれぞれXYになり、奥行きがZとなるのでここではTranslateZを移動する。


----------------------------------------
ポリゴンの角を整える(ノーマルの調整)
それぞれのフェイスは各頂点を共有しているためシェーディング表示ではフェイスがフラットにならない。
(Mayaではノーマル角度がソフトの設定になっている時と同じ)
Houdiniでは、各エッジできっちりと折れた見た目にするためには各フェイスの頂点を分けてやる必要がある。
edgeCuspは新しい頂点をそれぞれのエッジに作成する。
そのためMMBクリックでノードのデティールを見ると8pointsだったのが24pointsに増えている。

27)EdgeCuspノードをtierExtrudeの出力に接続して作成
名前を「TierCusp」に変更


----------------------------------------
<道路の縦横比(レシオ)を指定できるようにする。>

28)masterControlノードに「Toggle」パラメータを追加し、名前を「toggle」にする。
Horizontally join to Next Parameterをオンにする。
(これをOnにすると次のパラメータと一緒に横一列に並べて表示する。)

29)同じくFloatパラメータを追加し、Name「widthLengthRatio」、Label「width / Length」へ変更。 最小値を0.001でロックし、最大値は2に設定。

30)Disable Whenに以下を入力:ratioトグルが「0」の時に、width/Lengthの操作はできない。
{ ratio == 0 }

31)またwidthLengthのDisableWhenに以下を入力:ratioトグルが「1」の時に、widthの操作はできない。
{ ratio == 1}


これも便利!
同じノード内のコントロール(パラメータ)名を指定して簡単なエクスプレションができる。
これによりコントロールに関連性を持たせることが簡単に出来る。



----------------------------------------
Length値を変更した際に、width値が自動設定されるwidthラインを作る。
Length値を取得し、それに対してwidthLengthRatio値を掛け合わせてwidth値を算出する。

32)bridgeWidthノード(ライン)のアウトプットを右クリックしてあらたな「Transform」ノードを作成
名称を「ratioScale」とする。
33)masterControlのLengthをコピーし、「ratioScale」のScaleXへpaste copied relative preferences。
34)そのエクスプレッション(ScaleX)をハイライト状態でAlt+eにてEdit Expressoinウインドウを表示し、エクスプレッションを編集。(Lengthにwidthをかけあわせる。)
ch("../masterControl/length") * ch("../masterControl/widthLengthRatio")


----------------------------------------
ここまでで作成した二つのtransformノードを条件によって切り替えられるようにする。
35)widthScaleノードのアウトプットを右クリックして、switchノードを作成
(switchノードはwidthScaleとwidthLengthCopyの間に作られる)
36)ratioScaleのアウトプットをswitchノードのインプットへ接続
37)switchノードのパラメータにエクスプレッションを作成(masterControlのratioトグルから値を取得するように設定)
ch("../masterControl/ratio")


以上で、
1)縦横の長さを個別に設定する方法
2)縦横比を固定して設定する方法
の二種類が選択できるコントロールを備えた長方形ができあがった。
Lengthは、相互に切り返しても変わらない(Widthは切り替え時に変化する。)ので両方を併用することも可能である。

 

0 件のコメント:

コメントを投稿