Houdini:3Dオブジェクトを4次元空間で回転させる
はじめに
3Dオブジェクトを4次元軸で回転させると以下のような面白い動きが作れます。 (下図はX軸-W軸で回転を適用させたものです)
https://gyazo.com/df9cdf2858d79d6fb1f147380c699ae2
ネットワーク全体
https://gyazo.com/f0af6d104e09eecc4d14a91560111665
■AttributeWrangle
4次元空間のカメラから3Dオブジェクトを写したときにできる写像を求め、
これを3Dオブジェクトのポイントの座標に反映しています。
今回はX軸-W軸, Y軸-W軸, Z軸-W軸で回転させるような処理を入れています。
https://gyazo.com/4b4d448ea5a5f36c35e884872437f4f5
code:Projection(c)
vector4 cameraPos = chp("camera_position"); // カメラの位置ベクトル
vector4 n = normalize(chp("camera_direction")); // カメラの向きベクトル(4次元)
float k = chf("focal_length"); // 焦点距離
float radian_XW = chf("radian_XW"); // X軸-W軸の回転量
float radian_YW = chf("radian_YW"); // Y軸-W軸の回転量
float radian_ZW = chf("radian_ZW"); // Z軸-W軸の回転量
int X = 0, Y = 1, Z = 2, W = 3; // 軸
// X-Wの回転行列
matrix rot_XW = ident();
setcomp(rot_XW, cos(radian_XW), X, X);
setcomp(rot_XW, -sin(radian_XW), X, W);
setcomp(rot_XW, sin(radian_XW), W, X);
setcomp(rot_XW, cos(radian_XW), W, W);
// Y-Wの回転行列
matrix rot_YW = ident();
setcomp(rot_YW, cos(radian_YW), Y, Y);
setcomp(rot_YW, -sin(radian_YW), Y, W);
setcomp(rot_YW, sin(radian_YW), W, Y);
setcomp(rot_YW, cos(radian_YW), W, W);
// Z-Wの回転行列
matrix rot_ZW = ident();
setcomp(rot_ZW, cos(radian_ZW), Z, Z);
setcomp(rot_ZW, -sin(radian_ZW), Z, W);
setcomp(rot_ZW, sin(radian_ZW), W, Z);
setcomp(rot_ZW, cos(radian_ZW), W, W);
// 回転行列
matrix rot = rot_XW * rot_YW * rot_ZW;
// 4次元空間にある点の3次元空間への射影を求める
vector4 ray = rot * @P - cameraPos;
float L = k * dot(n, n) / dot(n, ray);
vector4 p = L * ray;
@P = set(p.x, p.y, p.z); // 写像をポイント位置に反映
関連