moyasiエフェクト館

主にエフェクト関係の記事を上げていこうかと思います。


エフェクトに関係する記事上げてきます
エフェクト関係の記事の内容は緩く募集中
自分がわかる範囲であれば書いていこうかなと。

【Houdini】行列を使って外側に向ける

f:id:tktknkyo:20180601082603p:plain

Houdiniでのモデリング関連の記事です。

Houdiniでメッシュ作るときに便利そうなものを、メモ代わりにも書いていこうかなと。

というわけで今回は、行列とか使って外側に向きを向けようかなと。

 

下準備とか色々

f:id:tktknkyo:20180601083207p:plain

ノードツリーとしてはこんな感じ、Tubeでベースを作って、CopyToPointで複製します。

 

f:id:tktknkyo:20180601083303p:plain

Fuseは、ポイントが重なってる部分を結合しています。

ポリゴン数を無駄に増やさない為にはあったほうがいいですが、処理自体はなくても特に問題はありません、ただ若干乱数入れる場合はあったほうがいいかもしれません。

 

また、形を作る関係上、頂点の部分をグループに入れておきます。

f:id:tktknkyo:20180601152259p:plain

if(@P.y != 0){@group_ypos = 1;}

コードとしてはこちら、内容としては

ポイントのY軸が、0でないなら、yposというグループに入れる、という処理です。

 

行列を使った動き

 

f:id:tktknkyo:20180601153153p:plain

vector axis = set(0,1,0); //Y軸の回転軸を変数に保存
vector4 q = quaternion(atan2(@P.x,@P.z),axis);
//角度をatan2で取得してクォタニオン生成
vector pivot = @P; //行列回転のために、位置を変数に保存
@P -= pivot; // 行列回転の為に、一旦原点に移動
matrix m = ident();// 単位行列を生成
vector dir = set(0,0,ch("R")); // 開き角度をシリンダーから取得
translate(m,dir); //開き角度から移動行列を生成
matrix m2 = qconvert(q); //クォタニオンを回転行列に変換
@P *= m; // 移動行列を乗算
@P *= m2; //回転行列を乗算
@P += pivot; // 位置を元に戻す

 

コードとしてはこちら、また、ノードのGroupにyposといれて、頂点の部分のみ動かすようにしてください。

(青文字はコメントアウト部分)

vector axis = set(0,1,0); //Y軸の回転軸を変数に保存

この部分は、単純に回転軸を取得しているのみ、基本的に正規化する必要がありますが、既にY軸の1のみなので、する必要はありません。

vector4 q = quaternion(atan2(@P.x,@P.z),axis);
//角度をatan2で取得してクォタニオン生成

先ほどの回転軸と、atan2で取得した角度にて、クォタニオンを作ります。

f:id:tktknkyo:20180601153807p:plain

Y軸が赤線部分で、Y軸に回転させるばあい緑の矢印の回転をするようになります。

角度は、atan2により中心からの開き角度をとってきます、2チャンネルの情報で、XとZ軸のみとってきています(Y軸は無視してます)

f:id:tktknkyo:20180601154044p:plain

このように並んでいるジオメトリの、頂点の部分が、中心から見て何度の位置にあるのかを取得します(距離は関係ないです)

 

vector pivot = @P; //行列回転のために、位置を変数に保存

@P -= pivot; // 行列回転の為に、一旦原点に移動

行列の回転させる場合、Pの位置情報を元に回転させます。

なので、例えばXが10の位置であれば、自転ではなく公転の様な動きになってしまいます、今回だとこれでは都合が悪いので、一旦変数pivotに保存してから、原点に移動させます。

 

matrix m = ident();// 単位行列を生成

ここで単位行列を作ります、行列関係では基本的に必要になってくるものです。

それをmという名前の変数に保存します。

 

vector dir = set(0,0,ch("R")); // 開き角度をシリンダーから取得

ここでは、どの位移動するのか?を定義します、今回はZ軸のみで、移動量は後から変更しやすくしたいので、シリンダーから取得します。

f:id:tktknkyo:20180601154631p:plain

入れる数値は定数でも問題ありません。

 

translate(m,dir); //開き角度から移動行列を生成

先ほどの、シリンダーから取得したZ軸の移動から、移動行列を作ります

作った単位行列と、先ほどの移動値の情報から、移動行列を生成します。

 

matrix m2 = qconvert(q); //クォタニオンを回転行列に変換

今度は、先ほど作ったクォタニオンから、回転行列をm2という変数名で作ります。

クォタニオンでつくる場合は、単位行列を事前に作る必要がありません。

 

@P *= m; // 移動行列を乗算
@P *= m2; //回転行列を乗算

先ほど作った、二つ(移動と回転)を乗算させて動かします。

行列同士の乗算では、後ろの方から計算されるのでこの場合

回転行列により回転させたあとに、移動行列で動かしています

移動はZ軸のみですが、その前に回転行列で角度を変えるので、変えた角度からZ軸動くことにより移動する方向が変わってきます。

 

外側に向くような方向に移動させている内容としては

回転行列を作るときにatan2にて、角度を取得していてその角度を使うのが理由です。

 

@P += pivot; // 位置を元に戻す

最後に、位置を元に戻します。

 

 

前のHoudiniの記事ではごっちゃになってしまったので

これからは少ない部分を細かく書いていけたらな、と思います。