Sakuma presen
- 9. Houdini モジュール
1. Sop : モデリング
2. Dop : ダイナミクス
3. POP : パーティクル
4. Chop : チャンネルアニメーション
5. Vop : ポイント演算処理(VEX)
6. Shop : シェーディング
7. Rop : レンダリング
8. Cop : コンポジット
Sop
Vop
Rop
Pop
Dop
Chop
Cop
Shop
- 11. • ポイントアトリビュートの読み出し
• ポイントアトリビュートの書き出し
• ポイントアトリビュートの追加
@P(位置), @v(速度ベクトル)、@N(法線ベクトル)
@Cd(カラー)、@up(アップベクトル)、…
• ポイントアトリビュートに対する様々なオペレーション
• 専用の数学変数(vector, vector4, matrix3, matrix)
• 演算子オーバーロード(vector*matrix3の結果はvector)
• 変数、制御構造、繰り返し、配列
• テキストベース以外にもノードベースでも作成可能(VOP SOP)
Houdini VEX
- 12. PointWrangle SOPを使ったVEXの組み込み
• Houdini 12.5から実装
• ノード内に直接VEXコードを書くことが可能
• VOP SOPの様にノードの中にダイブする必要がない
• 今回一番活用したノード
vector z = normalize(point(@OpInput2,"N",@ptnum));
vector y = normalize(point(@OpInput2,"up",@ptnum));
vector x = normalize(cross(y, z));
@P = point(@OpInput2,"P",@ptnum);
matrix3 m = maketransform(z, y, @P);
assign(x.x,x.y,x.z, y.x,y.y,y.z, z.x,z.y,z.z, m);
vector4 q1 = quaternion(m);
vector r = point(@OpInput2,"bt_r",@ptnum);
vector4 q2 = quaternion(r, 0);
@rot = qmultiply(q2,q1);
VEX Expression
- 15. Creep POP:カーブU空間のパーティクルアニメーション
50個のパーティクルに対しstartU,goalU,startTime,goalTime
アトリビュートを追加し、エクスプレッションでカーブ上を移動させる
◇ startU
ch("../startU") - ch("../startU") * fit($ID,1,50,0,1)
◇ goalU
$STARTU + (1 - $STARTU)/($NPT) * $ID
◇ startTime
1+(ch("../offsetTime"))*($ID-1)
◇ goalTime
$STARTTIME+($GOALU-$STARTU) / ( ch("../speed")*chramp("scl", fit($ID,1,50,0,1), 0) )
U : 0 U : 1
カーブのパラメータ空間
U : 0.5
- 21. • 元々のカーブ上の位置からジッタリングされた位置までのベクトルを求める
• Ray SOPを使用し、カーブ上の位置から求めたベクトル方向にレイを
キャストし、人型サーフェイスとレイとの衝突点を求めてその位置に
ポイントを移動させる
PointWrangle SOP(VEX):オフセットベクトルの計算
// 元々の位置から(サーフェイス上の位置)ジッタリングされたカーブ上の
// 位置を引いてベクトルを正規化する(方向だけを抽出)
@N = normalize(@P - point(@OpInput2,"P",@ptnum));
// ジッタリングされているため、再びカーブ上の位置に戻す
@P = point(@OpInput3,"P",@ptnum);
- 38. • RBD変換時の初期角速度の決定
回転軸はアップベクトル(@up)と法線ベクトル(@N)の外積で決定
ポイントごとにランダムな回転量を与え、クォタニオンへ変換
さらに3x3行列への変換、4x4行列への変換を中継し、最後に3軸周りの
オイラー回転として保存
求めたbtModify SOPの「Angular velocity」に設定
vector axis = cross(@up,@N); // 回転軸
vector4 q = quaternion(30,axis); // 軸に対する30度の回転をクォタニオンとして保存
matrix3 m = qconvert(q); // 3 x 3 行列へ変換
matrix m4 = m; // 4 x 4行列へ変換
float r = 20 * (2*random(@ptnum)-1); // オイラー回転に掛ける乗数
v@euler = r*cracktransform(0, 0, 1, set(0,0,0), m4); // 行列をオイラー回転へ変換
addvariablename(“euler”,“EULER”); // btModifyノードから参照できるようにローカル変数を定義
RBDシミュレーション
VEXコード
- 39. 花の成長アニメーション
• AttributeTransfer SOPによって、成長タイミングを決定
int型のflowerアトリビュートを追加し、トランスファーによって1になった瞬間から
成長アニメーションを開始
• キャラクターの背中のプリミティブをGroup SOPによってグループ化
• グループ化されたプリミティブ上にScatter SOPでポイントを生成
(花のオブジェクト座標系の原点に相当)
• ポイントに法線ベクトル、upベクトルを設定し、花の向き(姿勢)を決定
• 成長アニメーション中は法線ベクトルを中心に若干の回転を加える
- 56. Mantra ROP
• Houdiniの標準レンダラ
• GIレイトレーサ形式、マイクロポリゴン形式をサポート
本作ではGIレイトレーサを使用
• プログレッシブレンダリング(リアルタイムレイトレーサ)
進捗5%程度でも最終結果がほぼ把握できる
制作スピードの向上に貢献
• 間接照明の計算はキャッシュレスで1パス計算
キャッシュ吐き出しのための時間節約(ストレージも節約)
A B
(Aがライトから直接受ける照明)+(AがBから受ける間接照明)を1パスで計算
- 61. その他
シーンの最大ポリゴン数 :約1200万ポリゴン
シェーダ :Oren–Nayar Diffuse + Phong Specular + SSS
ライト :Sky Light + Sun Light
カメラ :DOFあり
解像度 :1280 x 720
PC :Core i7-4770K 3.5GHz(Memory 32GB)
1フレームのレンダリング時間を5分未満に制限して制作