December 05, 2011

Houdini チュートリアルーーベンドotlーー

Houdiniでベンドが必要になった事はないでしょうか?一応あるにはあるけど
・・・ん!!??って感じでは無いですか?ほかのソフトで見てきたbendと何か違う。
しかもTwistの中に機能の一部として入ってるし。

何が変かというと他のソフトではbendを180度だか360度だとかにすると綺麗な円になります。
しかしhoudiniのはなりません。というのもbendは他のデフォーミング系(Twist, Skew, Taper等)の
式と違って若干複雑なのです。

単にちゃんとしたBendだけ欲しいのであればネット上でotlが見つけれれますが、
今回はBendを作りながらotlの作り方をやってみたいと思います。

otlとはデジタルアセットとして自分専用のノードを作ることです。

ファイルはこちらのコピペなります。
http://fujitarium.syuriken.jp//Bend.hipnc

先ずどうやって丸まるように変形させるか、その概念から説明します。
手っ取り早く説明すると「最初にオブジェクトY軸に対して次に離れたところから元の高さに応じて
回転させる」です。
bend1













1、回転角度には基準がいるので(何処の高さが何度になるか)自分で入力でもいいですし
バウンディングボックスの高さでも構いませんが、ともかくこの基準になる高さで各ポイントの高さ
を割ります。そしてその値をベンド角に掛けて以前トランスフォームの所で紹介したMakeTransform
の回転角度のX軸に入力してやれば丸まるように曲がる変形は可能です。

2、ただしこれだと角度で扇状に広がる変形でベンドッぽく見えるようにするためにはピボットを手動でずらして
やって大きさを調整しなければいけません。
なので次の課題は「元の高さ」と角度が広がったときの「弧の長」さが等しくなるように自動で
ピボットの位置を計算するようにします。
bend2













弧の求め方は2*Pi*R*angle/360なのでまとめて「Pi*R*angle/180=元の高さ」になります。
そしてここで求める必要があるのは円の半径である中心点なのでR = 元の高さ/Pi/(angle/180)
としてこの式をVOP内で計算してMakeTransformのpivotのZに対して入力します。

3、最後に、この式だと角度が0のときに中心が無限という値になってしまって計算できないので
角度が0のときようにスイッチを作りもとの形状と切り替えるようにします。

1,2,3の工程を全部入れたVOPの構造が以下のようになります。
bend3














次にほかのソフトのベンドになるようにリミットを作りますがちょっと時間の都合で詳しい説明
はカットします。簡単に説明するとリミットから先は潰れずにオフセットされ、更にリミットから先は
全てリミット上の高さと同じ角度が入力させるようにします。
詳しくはサンプルファイルを見てください。


次にこれらを使ってotlを作ります。
まず手順としては作ったVOPをshift+cでSub Networkに格納します。
そして右クリックでやや下のほうのCreate Desital Assetをクリックします。
そして名前を入力してファイル保存します。ファイルはひとつのotlファイルの中に複数のデジタルアセット
を保存できますが個人的にはSOPbendDeformer.otlみたいに個別に保存しておいたほうが管理しやすいです。
otl1

















これでベースは出来たので次にパラメーターを表示させなければいけません。
作ったデジタルアセットを右クリックしてType Propartyをクリックします。
開いたパネルのParametersを開きます。そして真ん中の空欄の中にパラメーターを左のいろんな種類
から追加して作るわけですが、VOPのパラメータから直接ドラッグアンドドロップするのが手っ取りばやいです。
こうすることでVOPのパラメータがドロップされた瞬間にデジタルアセットとのリンク関係が出来ます。
後ギアマークをクリックしてPrefix Linked・・・の2つのチェックをはずして置くとパラメーター名が
長くならずそのままもってこれるのでやりやすいです。

後以前紹介したトランスフォーム2つではさむやり方を紹介しましたがこれも入れておいて
TranslateとRotationの値を追加しておきましょう。
以前も言いましたがこうすることで軸ごとの設定をしなくていいのに加えて複雑な斜め角度から
のベンドにも対応することが出来ます。
そしてType PropartyのHandleタブを開きTransformerを追加しましょう。
そして右側のrx,ry,rz,tx,ty,tzに対応する値のパラメータを追加します。
こうすることでビューポート上でトランスフォームを制御することが可能です。

次にガイドを作りましょう。ガイドはBasicタブ内のGuide Geometoryにパスを追加することで
ガイドを表示させることが可能なのでデジタルアセット内に適当にラインとかでパラメータ
を対応させたオブジェクトを作って登録しておくと見やすくなります。こんな感じです。
otl2











そしてデジタルアセット内部はこんな感じになっています。
otl3



















最後にPythonでトランスフォームの中心をオブジェクトの中心に持ってきて更に高さをオブジェクトの高さ
にフィットさせるFitボタンを作ります。

ちょっとこれに関してはpythonをやってないような人にはレベルが高く、逆にやってる人でマスタークラス
のpython講座をみたことあるひとならコードを見ればわかると思うのでコードだけ載せておきます。

def centerFit():
    geo = hou.pwd().geometry()

    geoInput = hou.pwd().inputs()[0].geometry()

    bbcenter = geoInput.boundingBox().center()
    hou.Node.parmTuple(hou.pwd(),"t").set(bbcenter)

    geoTransed = hou.pwd().children()[3].geometry()
   
    bboxMax = geoTransed.boundingBox().maxvec()
    bboxMin = geoTransed.boundingBox().minvec()
   
    hou.Node.parm(hou.pwd(),"height").set(bboxMax[1])

ボタンのほうには
kwargs["node"].hdaModule().centerFit()
になります。

何が言いたいかと言うとpythonを使うことでこんな感じでパラメーターを書き換えたりするのに使える
と言う事で、ほかにもデジタルアセットひとつでは収まらないツールを作ってしまったときなんかに
ボタンでノードのネットワークを一発で用意できるようにしたり、逆にひとつのデジタルアセット内に
複数の要素を同時に作り出すものを作ったときに内部から要素ごとにObject mergeをつくり出して
外部に取り出すときなんかにpythonを組み込んだりしてます。同僚なんかはノードの状態から色を
変更したりなんかもしてましたね。

ベンドは円状に沿ったエミッター配置したりとか本がめくれるアニメーションとかまあ何かと必要な
時はあったりするので自分用にやりやすい感じに作ってみてください。
では急ぎ足でしたがベンドでした。


fujitarium at 13:23│Comments(0)TrackBack(0)CG | Houdiniチュートリアル

トラックバックURL

コメントする

名前
URL
 
  絵文字