[houdini] bendの手法(2)

前回からだいぶ時間があいてしまいましたが続きです。
引き続き火星防衛戦線のbendチュートリアルを拝借し考えたいと思います。

ベンドの変形の考え方はなんとなくわかりましたが、どうやって変形させるのかというのはまた別の話でありピンときません。
まぁ素直に先人達に解き方を教えて貰い考えましょう。

そもそも藤田さんのチュートリアルでは一番はじめに答えが書いてあったりします(笑)
なのでここから先の解説内容はほとんどチュートリアルをまんま拝借しています。。。では回答です。

bend_2

例えば長さ5のオブジェクトをベンドさせたい場合には、一度長さを0にしピボットから各頂点を任意の角度まで回転させ、長さ5になるところまで展開する。
といった感じです。一回長さをリセットして再度伸ばすってイメージですね!
このピボットの位置というのは変形させたい任意の角度によって変化する訳です。
なので任意の角度から自動でピボットの位置を計算するようにしてやることで目的に到達します。

前回の投稿でピボットの位置を求める式はやりました。
「半径 * 2 * π * 任意の角度/360 = 弧の長さ」
小中学生レベルの数学ですね、僕でもギリ覚えてます(笑)

ではチュートリアルに習いこれらの式をVOP内で組み立ててみます。

bend_3

まず初めに必要になるパラメータがあるのでそのノードを作成します。
画像左下にあるparameterノードのangleとlengthです。
名前の通りではありますが、angleは変形させたい角度を入力するためのパラメータです。
lengthはオブジェクトなどの任意の長さ(弧の長さ)を入力するためのパラメータです。

話はそれますが、parameterノードはVOP内で最も使用するノードのひとつだと思います。
Houdiniのヘルプなどをみればどういったノードなのか詳細に書いてあり理解できると思います。
簡単に説明するとmayaなどで言うところのadd attributeでユーザー制御のパラメーターを追加するといった感じかと思います。
また別の機会にこう言った細かいところもメモしておきたいと思います。

では続きまして、赤いbox内(length0)では長さを0にリセットしています。
まず各ポジションのvector情報をfloatにして分けます。
リセットする方向がY軸方向なのでYのvalueを0にし、XとZはそのままコネクションします。
これで長さ0の潰れた状態になります。

次に緑のbox内(pivot)ではピボットの位置を求めます。
式は先程の「半径 * 2 * π * 任意の角度/360 = 弧の長さ」ですね。
これをまとめると「半径 = π / 任意の角度/180 / 弧の長さ」になります。
単純にこの式をノードに置き換えていきます。
divide constantノードでπと180度を用意し、それぞれangleとlengthを除法します。
πにはグローバル変数の$PIを使用しているので限りなく正確に近くなるのかと思います。
次にそれぞれの値をdivideノードで除法し、これで目的の半径の値を求めることが出来ました。
今回はピボットをZ軸上にするためfloat to vectorノードのZにコネクションしています。
あとはmake Transformノードのpivotに求めた値をコネクションしてあげます。
これで角度や弧の長さを変更しても半径(ピボット)を自動で計算してくれるようになりました。

次に青のbox内(point)では各頂点の位置を計算し何度回転させるのかを求めます。
各頂点を弧の長さで割ることにより、その頂点がどこに位置し何度回転するのかを計ることが出来ます。
1つの頂点だけに絞り例を出して考えて見ます。
弧の長さは5で頂点の位置は1、変形する角度は180度とします。
1(位置) / 5(弧の長さ) * 180(任意の角度) = 36

bend_4

なので頂点1はピボットから36度回転した場所になる訳です、簡単ですね。
全ての頂点を同じように計算し回転させることで綺麗な円弧が出来上がるという訳です。
計算した値は回転させる軸はXなのでXにコネクションし、vectorデータをmake Transformノードのrotにコネクションします。

make Transformノードを赤box内で潰れた状態のオブジェクトにmultiplyすればベンドの完成です。
しかし角度が0度の場合には中心が無限という値になるようで、それを回避すためswitchノードで元の形状と切り替えるようにしているようです。

以上、自分なりにわかりやすく考えまとめてみました。
チュートリアルの方ではリミットを設けたり、アセットを作るところまでやっていますので興味のある方は藤田さんのブログをご覧下さい。
僕も機会があればアセットの作成方法などまとめたいと思います。

  1. コメントはまだありません。

  1. トラックバックはまだありません。