Houdini数学 : 回転行列の可視化
はじめに
回転行列を使った、座標回転を可視化してみました。
回転行列を利用した座標変換
回転行列を使うことで、座標 (x_1, \ y_1) を原点の周りに \theta 回転させるような座標変換を行うことができます。
>\binom{x_2}{y_2} = \begin{pmatrix} cos \theta & -sin \theta \\ sin \theta & cos \theta \end{pmatrix} \binom{x_1}{y_1}
回転後の座標は (x_2, \ y_2)になります。
回転行列を使わない形に書き換えると、以下のようになります。
>\begin{cases} x_2 = (cos \theta) \cdot x_1 - (sin \theta) \cdot y_1 \\ y_2 = (sin \theta) \cdot x_1 + (cos \theta) \cdot y_1 \end{cases}
Houdiniを使った回転の可視化
今回は直線を回転させてみます。
■STEP1 : ラインを作る
Lineノードを利用して、原点からX軸プラス方向に伸びるラインを作成します。
パラメータOrigin | {0, 0, 0} |
Direction | {1, 0, 0} |
■STEP2 : 回転の実装
ここで、回転を行う数式は以下のようになっていました。
>\begin{cases} x_2 = (cos \theta) \cdot x_1 - (sin \theta) \cdot y_1 \\ y_2 = (sin \theta) \cdot x_1 + (cos \theta) \cdot y_1 \end{cases}
これをAttributeWrangleノード上で実装すると以下のようになります。
AttributeWrangle(c)// 回転量θを取得(単位 : ラジアン)
float theta = chf("theta");
// 回転前の座標(x1, y1)
float x1 = @P.x;
float y1 = @P.y;
// 回転を行う
float x2 = cos(theta) * x1 - sin(theta) * y1;
float y2 = sin(theta) * x1 + cos(theta) * y1;
// 回転後の座標(x2, y2)をポイントに反映
@P = set(x2, y2);
■結果
回転量を増やすと、ラインが反時計回りに回転します。
実際には、ラインの各ポイントが原点の周りに回転量 \thetaだけ回転しています。
おまけ
Lineの位置や向きを変えたり、ライン以外の物を回転させてみると、回転行列への理解が深まって面白いかもしれません。
参考リンク
回転行列(Wikipedia)