SlideShare a Scribd company logo
1 of 64
Procedural Animation
作品名「0x0708」
佐久間 修一
佐久間 修一
Procedural Animation
作品名 「0x0708」
ソフトウェア
• メイン(95%)
Houdini 12.5
• サブ(5%)
Maya 2014
• プロシージャルアニメーション
• 流体シミュレーション
• RBDシミュレーション
• プロシージャルモデリング
• キーフレームサイクルアニメーション
• キャラクターモデリング
データの連携
• Alembic
 ILM&SPIが開発したシーンファイル共有フォーマット
 オープンソース
 MayaからAlembicファイルをエクスポート
 Mayaは現時点ではメッシュ情報のみの対応
 HoudiniでAlembicのシーケンシャルメッシュをインポート
Mayaにおける作業
• サイクルアニメーション(キーフレーム制御) • 花成長アニメーション(エクスプレッション制御)
Houdini
• ノードベースワークフロー
• マルチスレッド対応のエクスプレッション言語(VEX)
• ブラックボックスがないアーキテクチャ
• アトリビュートを介する粒度の細かい演算
• モデリング、アニメーション、シミュレーション、コンポジット、シェーダ、レ
ンダリングにおいて全て共通のオペレーションが可能
• 18年間の歴史(現在のバージョンは13)
• ビジュアルエフェクト分野(VFX)で主に使用
• 開発は加サイドエフェクト(www.sidefx.com)
Houdiniのノード
• 1ノード1オペレーション
• ノード対ノードの接続は原則1本(最大でも5本)
• ノードの中にノードネットワークを作る入れ子構造が可能
ノードネットワーク
ノード内に作られたノードネットワーク
本制作におけるHoudiniのノードネットワーク(一部)
ノード = 神経細胞(ニューロン) ノードネットワーク = 脳
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
• マルチスレッド処理に対応するエクスプレッション言語
• SIMDスタイル(単一命令複数データ)
• ポイント演算に使用したり、シェーダーやカスタムノードも記述可能
• Houdiniのほぼ全てのコンテキスト内で使用可能
• C/C++に近い速度で実行(ケースによっては上回る)
• 行列関数、ベクトル関数、ノイズ関数、アトリビュート設定・取得関数、
各種数学関数、シェーディング関数など、326種類の関数
命令
スレッド スレッド スレッド スレッド スレッド
Houdini VEX
• ポイントアトリビュートの読み出し
• ポイントアトリビュートの書き出し
• ポイントアトリビュートの追加
@P(位置), @v(速度ベクトル)、@N(法線ベクトル)
@Cd(カラー)、@up(アップベクトル)、…
• ポイントアトリビュートに対する様々なオペレーション
• 専用の数学変数(vector, vector4, matrix3, matrix)
• 演算子オーバーロード(vector*matrix3の結果はvector)
• 変数、制御構造、繰り返し、配列
• テキストベース以外にもノードベースでも作成可能(VOP SOP)
Houdini VEX
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
「 0x0708 」 メイキング
POP
Sop
Vop
Rop
Pop
Dop
Chop
Cop
Shop
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
SOP
Sop
Vop
Rop
Pop
Dop
Chop
Cop
Shop
Copy SOP:パーティクルに対するシリンダーのコピー
カーブ接線ベクトルをN(法線ベクトル)へコピー。
up(アップベクトル)はNとベクトル(0,0,1)との外積計算で決定。
◇up
vector up = set(0,0,1);
@up = cross(up,@N);
Scatter SOP:シリンダーサーフェイス上へのポイント散乱
サーフェイス上に指定した個数の
ポイントを作成
PointWrangle SOP(VEX):近傍カーブへのポイント移動
// カーブ上の近傍点へ移動
@P = minpos(@OpInput2,@P);
PointJitter SOP : ポイント位置のジッタリング
ジッタリングを行い、カーブ上の位置から
ランダムにずらす
• 元々のカーブ上の位置からジッタリングされた位置までのベクトルを求める
• Ray SOPを使用し、カーブ上の位置から求めたベクトル方向にレイを
キャストし、人型サーフェイスとレイとの衝突点を求めてその位置に
ポイントを移動させる
PointWrangle SOP(VEX):オフセットベクトルの計算
// 元々の位置から(サーフェイス上の位置)ジッタリングされたカーブ上の
// 位置を引いてベクトルを正規化する(方向だけを抽出)
@N = normalize(@P - point(@OpInput2,"P",@ptnum));
// ジッタリングされているため、再びカーブ上の位置に戻す
@P = point(@OpInput3,"P",@ptnum);
Ray SOP :サーフェイスへのレイキャストと衝突点へのポイント移動
Copy SOP:ポイントに対するメッシュオブジェクトのコピー
ポイント位置にメッシュをコピーしていく。
その際、ポイントのNベクトルとupベクトルを参照し、
メッシュの姿勢を決定する。
Nup
N
up
VEXによる姿勢制御1(サーフェイス上の移動)
• ポイントの法線ベクトル、アップベクトルからコピーオブジェクトの姿勢を決定
VEXによる姿勢制御2(地面からヒト型サーフェイスへの移動)
• 地面の接線ベクトルとキャラクターの接線ベクトルのブレンド
• VEX + ランプテクスチャ制御
初期位置の決定
• キャラクターを配置するためのポイント位置はプロシージャルに調整可能
• 左右で交差しないように調整
Y<0空間におけるポイント位置の調整
• Y<0ではポイントは地面上を動くようVEXで制御
• 地面サーフェイスからヒト型サーフェイスへの滑らかなポイントの移り変わりを実現
TimeShift SOP:移動スピードに応じたモーションサイクル速度制御
ポイントの速度ベクトルを調べて、大きさに応じてサイクルモーションのサイクル数を決定
TimeShift SOP:移動スピードに応じたサイクル速度制御
ポイントの速度ベクトルを可視化
AttributeTransfer SOP
• ポイントからポイントのアトリビュートの移し替え
• ソースポイントからの距離に応じたウェイト付け
• pscale(スケール)とrot(クォタニオン)アトリビュートに使用
ソース(移し替え元)
デスタネーション(移し替え先)
AttributeTransfer SOP
ソース:球体にある中心ポイント デスタネーション:サーフェイス上に散乱されたポイント
SOP 地形プロシージャルモデリング
① ② ③
④ ⑤
SOP 地形プロシージャルモデリング
SOP 地形プロシージャルモデリング
• プロシージャルに地形のフラット領域を制御
RBD(リジッドボディ)シミュレーション
RBDシミュレーション
• アニメーション途中でのポイントからRBDへの動的な変換
• RBDへの変換タイミングをエクスプレッションで制御
• RBDへ変換されるポイントのパーセンテージをエクスプレッションで制御
• Bullet SOPを使用(SOP内におけるRBD計算)
 MilanSuk制作( http://forums.odforce.net/forum/69-bullet/ )
 Bullet DOPよりも高速
• RBDの初期速度、初期角速度をポイントごとにエクスプレッションで決定
 初期速度 ⇒ RBDをどちらの方向にどれくらいの勢いで飛ばすか
 初期角速度 ⇒ RBDに最初にどれくらいのスピンをかけるか
ポイント
RBD
RBDシミュレーション
• RBD変換時の初期速度の決定
 初期速度の方向はポイントのupベクトル方向(キャラクターの背中方向)
 ポイントごとにランダムな乗数を掛けて決定
 btModify SOPの「Linear Velocity」に設定
up ベクトル
N ベクトル
Axisベクトル
• 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コード
花の成長アニメーション
• AttributeTransfer SOPによって、成長タイミングを決定
 int型のflowerアトリビュートを追加し、トランスファーによって1になった瞬間から
成長アニメーションを開始
• キャラクターの背中のプリミティブをGroup SOPによってグループ化
• グループ化されたプリミティブ上にScatter SOPでポイントを生成
(花のオブジェクト座標系の原点に相当)
• ポイントに法線ベクトル、upベクトルを設定し、花の向き(姿勢)を決定
• 成長アニメーション中は法線ベクトルを中心に若干の回転を加える
花の成長アニメーション
• キャラクターの背中のプリミティブをGroup SOPによってグループ化
花の成長アニメーション
• Copy SOPによって、グループ化されているプリミティブ
(キャラクターの背中)だけをポイント位置にコピー
花の成長アニメーション
• Scatter SOPによって、ポイント散乱。その後、PointWrangle SOPによって
ポイントに対して法線ベクトル(N)とアップベクトル(up)を設定
散乱されたポイント 法線ベクトルとアップベクトル
花の成長アニメーション
• AttributeTransfer SOPによって、球体の中心ポイントから、花の成長開始
トリガーとなるint型のアトリビュートを各ポイントに対して移し替え
花の成長アニメーション
DOP
Sop
Vop
Rop
Pop
Dop
Chop
Cop
Shop
DOP 流体シミュレーション
DOP 流体シミュレーション
• コンテナを作成し、分割されたボクセル内で気流を計算
 気体のサーフェイス(形)をモデリングするのではなく、気流をモデリングする
• SOP
 コンテナに流入する気体密度をモデリング
 コンテナ内に気流を作るための速度ベクトルをモデリング
• DOP
 Pyro Solver Dopによってナビエストークス方程式を数値解析的に解き、
コンテナ内の気流を計算
流体シミュレーション
• SOP
• DOP
+
スカラーフィールド(密度) ベクトルフィールド(速度)
ナビエストークス方程式
• 本制作におけるボクセル数(最大)
X軸 168個
Y軸 52個
Z軸 121個
合計 105万7056個
ボクセル辺長 約12cm
流体シミュレーション
流体シミュレーション(ポイント)
流体シミュレーション(ポイント速度:流体初期速度)
流体シミュレーション(流体速度)
流体シミュレーション(密度)
ROP
Sop
Vop
Rop
Pop
Dop
Chop
Cop
Shop
Mantra ROP
Mantra ROP
• Houdiniの標準レンダラ
• GIレイトレーサ形式、マイクロポリゴン形式をサポート
 本作ではGIレイトレーサを使用
• プログレッシブレンダリング(リアルタイムレイトレーサ)
 進捗5%程度でも最終結果がほぼ把握できる
 制作スピードの向上に貢献
• 間接照明の計算はキャッシュレスで1パス計算
 キャッシュ吐き出しのための時間節約(ストレージも節約)
A B
(Aがライトから直接受ける照明)+(AがBから受ける間接照明)を1パスで計算
Shop
Sop
Vop
Rop
Pop
Dop
Chop
Cop
Shop
MantraSurface SHOP
• モノリシックシェーダ(mia_material_xのようなもの)
• シェーダ内にダイブしてシェーダを構成するノードネットワークを
カスタマイズ可能
COP
Sop
Vop
Rop
Pop
Dop
Chop
Shop
Cop
HSV COP
• プロシージャルにテクスチャのHSVを調整し、
花弁のカラーバリエーションを増やす
その他
 シーンの最大ポリゴン数 :約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分未満に制限して制作
Houdini まとめ
• 【本当に】ブラックボックスがないアーキテクチャ
• 使いこなすためには、ある程度の数学の知識が必要
 関数、行列、ベクトル、空間図形、ブール代数、微分積分...
• 基本的なプログラミングの知識(変数、制御構造、条件分岐、
ブール演算など)も必要
• 分析・設計能力 + 論理的思考能力
おわり
ご清聴ありがとうございました
質疑・応答

More Related Content

Viewers also liked

【Unite2014】誰でも出来る!MayaLTを使ったUnityアセット制作ワークフロー
【Unite2014】誰でも出来る!MayaLTを使ったUnityアセット制作ワークフロー【Unite2014】誰でも出来る!MayaLTを使ったUnityアセット制作ワークフロー
【Unite2014】誰でも出来る!MayaLTを使ったUnityアセット制作ワークフロー
cfm_art
 
ハリウッド流映画脚本講座・特別編 「ゲーム」は「キャラクター」がドライブする 〜ヒットする、原作付きキャラクターゲームシナリオの作り方〜
ハリウッド流映画脚本講座・特別編「ゲーム」は「キャラクター」がドライブする〜ヒットする、原作付きキャラクターゲームシナリオの作り方〜ハリウッド流映画脚本講座・特別編「ゲーム」は「キャラクター」がドライブする〜ヒットする、原作付きキャラクターゲームシナリオの作り方〜
ハリウッド流映画脚本講座・特別編 「ゲーム」は「キャラクター」がドライブする 〜ヒットする、原作付きキャラクターゲームシナリオの作り方〜
小林 信行
 

Viewers also liked (15)

CEDEC 2015 Houdini for Game VFX
CEDEC 2015 Houdini for Game VFXCEDEC 2015 Houdini for Game VFX
CEDEC 2015 Houdini for Game VFX
 
3DCGMeetup08_MayaRigSystem_mGear
3DCGMeetup08_MayaRigSystem_mGear3DCGMeetup08_MayaRigSystem_mGear
3DCGMeetup08_MayaRigSystem_mGear
 
映像創作入門2014_5_ball
映像創作入門2014_5_ball映像創作入門2014_5_ball
映像創作入門2014_5_ball
 
Usagi siyousyo
Usagi siyousyoUsagi siyousyo
Usagi siyousyo
 
【Unite2014】誰でも出来る!MayaLTを使ったUnityアセット制作ワークフロー
【Unite2014】誰でも出来る!MayaLTを使ったUnityアセット制作ワークフロー【Unite2014】誰でも出来る!MayaLTを使ったUnityアセット制作ワークフロー
【Unite2014】誰でも出来る!MayaLTを使ったUnityアセット制作ワークフロー
 
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
 
Unity ゲーム開発
Unity ゲーム開発Unity ゲーム開発
Unity ゲーム開発
 
Tabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたってTabc vol3 テクニカルアーティストを始めるにあたって
Tabc vol3 テクニカルアーティストを始めるにあたって
 
[CGWCC2016] UE4でリギング
[CGWCC2016] UE4でリギング[CGWCC2016] UE4でリギング
[CGWCC2016] UE4でリギング
 
Maya Camera Settings to Unity
Maya Camera Settings to UnityMaya Camera Settings to Unity
Maya Camera Settings to Unity
 
Mayaカメラデータunityインストール
MayaカメラデータunityインストールMayaカメラデータunityインストール
Mayaカメラデータunityインストール
 
ハリウッド流映画脚本講座・特別編 「ゲーム」は「キャラクター」がドライブする 〜ヒットする、原作付きキャラクターゲームシナリオの作り方〜
ハリウッド流映画脚本講座・特別編「ゲーム」は「キャラクター」がドライブする〜ヒットする、原作付きキャラクターゲームシナリオの作り方〜ハリウッド流映画脚本講座・特別編「ゲーム」は「キャラクター」がドライブする〜ヒットする、原作付きキャラクターゲームシナリオの作り方〜
ハリウッド流映画脚本講座・特別編 「ゲーム」は「キャラクター」がドライブする 〜ヒットする、原作付きキャラクターゲームシナリオの作り方〜
 
最新Mayaを使ったUnity 5向けキャラクターセットアップセミナー&使いこなしTips
最新Mayaを使ったUnity 5向けキャラクターセットアップセミナー&使いこなしTips最新Mayaを使ったUnity 5向けキャラクターセットアップセミナー&使いこなしTips
最新Mayaを使ったUnity 5向けキャラクターセットアップセミナー&使いこなしTips
 
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
Unity道場 14 Shader Forge 102 ~ShaderForgeをつかって学ぶシェーダー入門~ カスタムライティング/トゥーンシェーダー編
 
「初心者向けデザイン講座」 -東洋美術学校(第二回目:ロゴ編)
「初心者向けデザイン講座」 -東洋美術学校(第二回目:ロゴ編)「初心者向けデザイン講座」 -東洋美術学校(第二回目:ロゴ編)
「初心者向けデザイン講座」 -東洋美術学校(第二回目:ロゴ編)
 

Sakuma presen