generated at
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)