【Houdini】自由に形を決められる「らせんカーブ」を作る(1)
HoudiniのSOPマスターになろう企画第一弾!いぇーい。
今回は私がHoudiniを始めてすぐの時に、師匠から教えてもらった「らせん」を作ってみたいと思います。
主にHoudiniで制作するときの考え方とか、pointVOPの説明かな。
らせんカーブの作り方はこれ以外にもたくさんあるので、興味がある人は調べてみてね。
(師匠いわく「結局これがいちばん汎用性高くてシンプルで最強」とのことですが)
Step1.ベースになるcircleをつくる
円をゴニョゴニョしてらせんにしていきたいと思います。
1.Polygonで呼ぶ:ポイントいじりたいので
2.xz Planeにする:地面と平行の向きに
3.Arc TypeをOpenArcにする:閉じてると都合悪いので
4.ArcAnglesは暫定で360よりちょっと小さくしておく:後で増やすけど
Step2.circleをresampleする(curveuアトリビュートを持たせる)
後々これが大活躍することになるんですが、 まぁいまは騙されたとおもってノードを作ってみてくださいな。
ネットワークでCircleとresampleへノードをつないだ後、 resampleノードのパラメータをいくつか変更します。
1.Maximum Segment Length(最大セグメント長)とMaximumSegmentsのチェックをはずす:大きさ(線の長さ)も分割数も自由に変えたいので
2.curve U Attributeにチェックを入れる :curveuアトリビュートが生まれて、0→1の値を持つようになる
Step3.どうやってグルグルにするか考えてみる
さて、今回作りたいのは「ばね」のように、グルグル巻いてある形です。
いまは、地面にぶった切った円が置いてあるだけです。
たとえば、mayaで同じ状況に出くわしたなら、 どうやってらせん状にしましょうか?
(まぁmayaはプリミティブでらせん呼べるんでそこからの変換が一番早いんだけどね)
おそらく一番簡単なのは、 「どちらかの端っこをソフト選択して、上に持ち上げる」ですね。
この「ソフト選択で掴んで、上にもちあげる」を、 Houdiniが計算できるように、数学っぽい考え方にしてみましょう。
「ソフト選択」を噛み砕いて考えてみると、「選択した点に近い場所ほど、持ち上げられたときの影響が大きい」、と考えることができます。
つまり、「先端から終端にかけて、だんだん高くなっていく(一番高い所が欲しい高さ)」という処理ができれば良いわけです。
そして、この「先端から終端にかけて」の部分。
ここでさっきのStep2で作った「curveu(かーぶ ゆー)」アトリビュートの出番です。
「curveu」は、線の長さが何であろうと「始点0→終点1」という値を持つアトリビュートです。
まだピンと来てない人はmayaの「パスアニメーション」を思い出してみてください。
パスの始めから終わりまでアニメーションさせるとき、「U値」というパラメータに0→1のアニメーションキーを打ちますね。
まさにあのU値の「U」です。
「カーブのU値」なので「curveu」です。
それを踏まえて、さっきの「最後の点ほどだんだん高く」を図解するとこんなかんじになります。
(一番上の高さを「1」にしたい場合。)
Step4.さっきの仕組みをHoudiniで作ってみる
『ポイントが持っている「位置(P)」の高さ(Y)の値を、「curveu」の割合に応じて「高さ」を追加する』VOPを組んでみましょう。
「VOPって何ぞや?」って方は、いったんシーンを保存して、別の記事の中盤あたりの「VOPって何?食べれるの?おいしいの?」って項目を読んでみてね。
まずは、処理したいノードの出力から、pointVOPの入力に繋いであげます。
繋ぎ終わったら、pointVOPノードをダブルクリックして中に入りましょう。
まず、今回ですが「位置(P)」の「高さ(Yの値)」だけ、変更をかけてあげなければいけません。勘の良い方はお気づきかもしれませんが、「VOPって何?」の例で位置(P)を頂点カラー(Cd)に渡したときはX、Y,Zの値が3つセットになって渡されていました。
位置Pに対してcurveuを直接足し算してしまうと、残念なことにZ,Y,Zすべてに数値が足されてしまいます。
原因はさっきもチラっと言っていましたが「X,Y,Zが3つセット」になっているからです。
この「浮動小数3つで1セット(Vector型)」の数値を、「浮動小数1つ(Float型)の値が3つ」の状態にしてあげる必要があります。
そこで登場するのが「Vector to Float」ノード。(名前そのまんま!) さっそくTabから呼び出して、入力のPから繋いでみましょう。
このノードの右側の水色の文字の出力たちが、上からX,Y,Zの数値になります。
今回、XとZは変更の必要がないので、そのままPに返してあげましょう。
なお、P(Vector型)に渡す数値なので、Float型から元のVectorに戻すのを忘れずに。 Tabメニューの「Float to Vector」から、float3つをVector1つに合体できます。
さて、主役(?)のcurveuの登場なんです...が。
入力のアトリビュートの一覧の中に「curveu」が見当たりません...
こんなときは、「bind」ノードを使います。
curveuに限らず、自分が後から追加した等で一覧に表示されないアトリビュートはbindノードで呼び出すことができるんです。
さっそくTabメニューから呼び出し、分かりやすいところに配置して、パラメータの「Name」に「curveu」と入力してあげましょう。
この「curveu」と、位置(P)のYの値を「足し算」します。
使うノードは「Add(加算)」です。
Tabで呼んで、入力の1番と2番にそれぞれの数値をつなぎます。
足し算の結果をPに渡してあげましょう。
Addの出力を、XやZと同じように、Float to Vector の2番目の入力(Yにあたる部分)につないであげると...
らせんができましたー!
ただ、いまはcurveuを足し算しているだけなので、 いつも高さが1になってしまいます。(curveuは最大値が1なので)
これを解消するために、「高さを決めるパラメータ」を追加してあげましょう。
やること自体はとても単純。
curveuに欲しい高さの分だけ数値を掛け算してあげればいいだけです。
「高さの指定」ですが、円のアトリビュートには当然、 「Hight」など、高さに関係するパラメータは存在しません。
無いなら、勝手に作るしかないね!
パラメータの追加も、VOPの中で「parameter」ノードを使います。(そのまんまの名前...)
Tabメニューでノードを呼び出して良い感じの場所に置いたらノードを選択します。 「Name」には分かりやすいパラメータ名(今だとhightとか)をつけます。
1Float Defaultには、初期値を入れます(今回は1にしました)
Float Rangeには、このパラメータをGUIで操作するときの上限値と下限値を決められます(このあと紹介します。とりあえず0~10にしておきました。)
乗算でおなじみの掛け算は「multiply」ですね。
addと同じようにcurveuとhightをかけて、その結果をaddの2番に渡してあげましょう。
ちなみに、もともと引いてある線を消したいときは、キーボードのYキーを押し込むとカーソルがはさみの形になります。
その状態でスパっと線を切るようにドラッグしてみてください。
デフォルト値を1に設定したので、一見すると何も見た目は変わっていませんが、 キーボードの「U」キーを押して、VOPの中からgeometry1のネットワークに戻り、 pointVOPノードを選択すると、ひっそりと「hight」というパラメータが増えています。
ためしにスライダを動かしてみると、らせんの高さが変わりますよ~ 。
なんと、らせんの作成自体はこれで完了です!!はやーい!!!
「らせんの半径」はcircleのRadiusを、 「カーブの分割数」はcircleのDivisionsを、 「何回ぐるぐる巻くか」はcircleのArcAnglesの数値をそれぞれ変更してあげることで、どんなぐるぐるでも作ることができます。
パラメータを決めてあげる場所がバラバラだったりしてちょっと不便ですが、 「自由にらせんを作るしくみ」はのベースがばっちり出来上がりました!
次回以降はこの「らせん」を竜巻の形(先がすぼんだりしてるやつ)にも変更できるようにしてみたり、 そこかしこに散らばっている入力項目を1か所にまとめたりして、 さらに使いやすいデータにクオリティアップさせていきます・x・!
だいぶ長くなってしまったので、ひとまず今回はここまで。
本日もありがとうございました!!
続きは↓↓