【Houdini】行列を使って外側に向ける
Houdiniでのモデリング関連の記事です。
Houdiniでメッシュ作るときに便利そうなものを、メモ代わりにも書いていこうかなと。
というわけで今回は、行列とか使って外側に向きを向けようかなと。
下準備とか色々
ノードツリーとしてはこんな感じ、Tubeでベースを作って、CopyToPointで複製します。
Fuseは、ポイントが重なってる部分を結合しています。
ポリゴン数を無駄に増やさない為にはあったほうがいいですが、処理自体はなくても特に問題はありません、ただ若干乱数入れる場合はあったほうがいいかもしれません。
また、形を作る関係上、頂点の部分をグループに入れておきます。
if(@P.y != 0){@group_ypos = 1;}
コードとしてはこちら、内容としては
ポイントのY軸が、0でないなら、yposというグループに入れる、という処理です。
行列を使った動き
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で取得した角度にて、クォタニオンを作ります。
Y軸が赤線部分で、Y軸に回転させるばあい緑の矢印の回転をするようになります。
角度は、atan2により中心からの開き角度をとってきます、2チャンネルの情報で、XとZ軸のみとってきています(Y軸は無視してます)
このように並んでいるジオメトリの、頂点の部分が、中心から見て何度の位置にあるのかを取得します(距離は関係ないです)
vector pivot = @P; //行列回転のために、位置を変数に保存
@P -= pivot; // 行列回転の為に、一旦原点に移動
行列の回転させる場合、Pの位置情報を元に回転させます。
なので、例えばXが10の位置であれば、自転ではなく公転の様な動きになってしまいます、今回だとこれでは都合が悪いので、一旦変数pivotに保存してから、原点に移動させます。
matrix m = ident();// 単位行列を生成
ここで単位行列を作ります、行列関係では基本的に必要になってくるものです。
それをmという名前の変数に保存します。
vector dir = set(0,0,ch("R")); // 開き角度をシリンダーから取得
ここでは、どの位移動するのか?を定義します、今回はZ軸のみで、移動量は後から変更しやすくしたいので、シリンダーから取得します。
入れる数値は定数でも問題ありません。
translate(m,dir); //開き角度から移動行列を生成
先ほどの、シリンダーから取得したZ軸の移動から、移動行列を作ります
作った単位行列と、先ほどの移動値の情報から、移動行列を生成します。
matrix m2 = qconvert(q); //クォタニオンを回転行列に変換
今度は、先ほど作ったクォタニオンから、回転行列をm2という変数名で作ります。
クォタニオンでつくる場合は、単位行列を事前に作る必要がありません。
@P *= m; // 移動行列を乗算
@P *= m2; //回転行列を乗算
先ほど作った、二つ(移動と回転)を乗算させて動かします。
行列同士の乗算では、後ろの方から計算されるのでこの場合
回転行列により回転させたあとに、移動行列で動かしています
移動はZ軸のみですが、その前に回転行列で角度を変えるので、変えた角度からZ軸動くことにより移動する方向が変わってきます。
外側に向くような方向に移動させている内容としては
回転行列を作るときにatan2にて、角度を取得していてその角度を使うのが理由です。
@P += pivot; // 位置を元に戻す
最後に、位置を元に戻します。
前のHoudiniの記事ではごっちゃになってしまったので
これからは少ない部分を細かく書いていけたらな、と思います。