KINGSGLAIVEセミナーおさらい ワープエフェクト – サンプルhiplcファイルあり



三連休でやっと時間が取れたこともあり、少し前に行われたIndyzone主催のHoudiniセミナー「KINGSGLAIVE FINAL FANTASY XV メイキングストーリー」のおさらいをしています。

というわけで、とりあえず手始めに今日はワープエフェクトに関してです。

今回もサンプルファイルを付けてみました。
完全な再現とまでは行かなくとも、ボリュームと移流の扱い方に関しては、だいたい再現できていると思います。
興味のある方はぜひ覗いてみてください。

■ダウンロード(One Drive)
MYAM_imitation_FF_KINGSGLAIVE_WarpFX

※ノード名がセミナー中の説明と合ってなかったので、修正しました

zipファイル解凍後に出てくるHoudiniProjectフォルダにSetProjectしてからシーンを開いてください。


概要

ワープエフェクトは、5つの単純な要素を組み合わせて作ります。

  • Spark:火花
    荒いボリュームからパーティクルへ力を渡し、移流して動かします
    その後、TrailSOPなどを使用して火花っぽい見た目を作ります。
  • Ash:灰
    Spark同様に移流してパーティクルを動かします。
    その後、灰オブジェクトをパーティクル上にコピーします。
  • Fire:小さな火の玉
    Spark同様に移流してパーティクルを動かします。
    その後、あらかじめ作成しておいた火の玉シミュレーションのキャッシュをパーティクル上にコピーします。
    その際、キャッシュのスタート時間をランダム化して見た目にばらつきをもたせます。
  • Steam:体から立ち上る蒸気
    Sparkなどで使用する荒いボリュームを複製後に編集し、高解像度化したボリュームを蒸気として使用しました。
  • Crystal:体から飛び散るクリスタル片
    初速と重力によって動く単純なパーティクルにクリスタル片オブジェクトをコピーして作ります。

一見複雑なワープエフェクトは、実は単純な要素を組み合わせて作られています。


シーンファイルについて

スケール調整の手間を省いたので、現実スケールに対しシーンスケールが大きめになっているため、ダイナミクスオブジェクトの動きが若干遅く感じられると思います。


何か間違いなどあればご遠慮無くツッコミください。
とても喜びます。

“NATURE OF CODE” in Houdini – 002 – 力

長い間、仕事ではパイプライン系ツールを書くことが多くなり、幾何学や物理などの数学とはだいぶ疎遠になってしまいました。

最近になって、やっとHoudiniを業務で使用させてもらえる環境が与えられたこともあり、これも良い機会ということで、これからしばらくの間、数学の勉強や復習とリハビリを兼ね、Processingの名著 [NATURE OF CODE] の内容を、Houdiniを使って追いかけていきたいと思います。




 

■動画内容の御品書

  1. シンプルな力
    単純な力を与えて動かす。
  2. 力と質量
    質量を考慮しながらシンプルな力(重力+風)を与えて動かす。
    小さいものほど風の影響を受けやすく水平方向によく動く。
  3. 力と摩擦
    摩擦による減速。
  4. 力と流体抵抗
    Y=0の位置から流体があると仮定し、ポイントが抵抗を受ける。
    この流体の範囲に入った時、ポイントは赤くなります。
  5. 引力(固定アトラクタ)
    原点の位置に引力を発生するポイントを配置し固定。
    その他のポイントは原点のポイントと引き合う。
  6. 引力(ポイントの相互作用)
    各ポイントはそれぞれ相互に引き合う力を持っている。
    質量や引力の設定にもよるが、小さな塊ができ、それぞれの塊が引き合い徐々に大きな塊になっていく。(ポイント半径に合わせたコリジョンは設定していないので、実際には、塊は大きくなりません。)

2.0 Houdiniの単位系

Houdiniは標準的なSI単位を採用している。
https://www.sidefx.com/docs/houdini15.0/dyno/about
http://www.cranenet.or.jp/tisiki/si.html

2.1 力とニュートンの運動の法則

力とは、質量を持った物体に加速度を生じさせるベクトル。

・ニュートンの運動の第1法則(慣性)

静止している物体は静止状態を続け、運動している物体は不平衡力の影響を受けないかぎり、一定の速さで一定の方向へ運動を続ける。

・ニュートンの運動の第3法則(作用・反作用)

力は常に反作用が対になって生じ、その強さは等しく、向きは正反対である。

-F[N]

 押し合う物体の質量が違う場合や、接地面の摩擦力が違う場合、同じ力が加わってもそれぞれの物体が静止し続けるとは限らない。

2.2 力とProcessing

・ニュートンの運動の第2法則(運動方程式)

質量(m)に加速度(A)を掛けあわせると力(F)になる。

・重量と質量

  • 質量(m):物体内の物質の量[kg]
  • 重量(W):物体にかかる重力[N]
  • 密度(Density):単位体積(m^3)あたりの質量(kg)

2.3 力の積算

書籍では質量を1として計算し、F=Aとして簡単化する。

通常、物体にはいくつかの外力が同時に作用する。
そのような場合、全外力の合計値を使用する。
物体に働く力は、特殊な状況を除いて常に変化し、積算されないので、毎フレームで新たな値を計算して使用する。

windForceやgravityForceなどを追加してみる。

2.4 質量

先に計算された外力を質量で割ることで、各ポイントごとに設定された質量を考慮したシミュレーションが行われる。

2.5 力の作成

・力の作り方

  • 直接指定
    自由に直接指定する
  • シミュレーション
    物理公式などを利用し、計算する。

2.6 地球と重力と力のシミュレーション

この時点では、質量が小さいものほど重力の影響を強く受けるようになっている。
物体の落下速度は、その質量にかかわらず一定。
重力加速度の式から正しい加速度を求めて適用するため、重力に質量を掛けあわせてる。

2.7 摩擦

摩擦は散逸力(非保存力)。

※散逸は、抵抗力によって運動エネルギーを熱エネルギーに変換する現象。
散逸力とは、摩擦力などのエネルギーを減少し、別の力に変換させる力。
車のブレーキなどは運動エネルギーを熱エネルギーに変換。

・摩擦の種類

  • 静止摩擦
    接触面に対し静止している物体が受けている摩擦
  • 動摩擦
    動いている物体が接触面から受ける摩擦

摩擦の方向は速度方向の逆。

・摩擦の公式

・公式を使用する際のポイント

  • 右辺を計算し、左辺に代入する。
  • 変数がベクトルかスカラーかを見極める。
  • 記号が隣り合っている場合は乗算を表す。

■各項の意味

  • F friction:摩擦により働く力

  • μ:摩擦係数

    特定の表面上に生じる摩擦力の強さ。

  • N:垂直抗力
    物体が接触面から受ける反作用で接触面に対して垂直方向に物体を押し返す力。
    物体が接触面から受ける垂直抗力の大きさは物体の質量に比例する。
  • v:正規化済みの速度ベクトル
    式中の-1と掛けわせることで摩擦による力の発生する方向を取得する。
    この場合、速度ベクトルの真逆方向に摩擦力による力が発生する。

2.8 空気抵抗と流体抵抗

物体が空気や液体(流体)の中を通り抜けるとき、抵抗力が働く。
これは、粘性力(Viscous Force)や抗力(Drag Force)、流体抵抗(Fluid Resistance)などと呼ばれる。

・流体抵抗の公式

■各項の意味

  • F drag:流体を物体が通り抜ける際に働く抗力
  • 1/2:定数
  • ρ(rho):流体の密度
  • v^2:速度ベクトルの長さの2乗
  • A:進行方を向いている面の表面積
  • Cd:抗力係数、自由に決定する
  • v:正規化された速度ベクトル

2.9 重力

■重力の公式

■各項の意味

  • F gravity:重力
  • G:万有引力定数、独自の値を使っても面白い。
  • m1とm2:相互に作用する2つの物体が持つそれぞれの質量。
  • r:物体間の距離ベクトルを正規化したベクトル。物体同士が引き合う方向。
  • r^2:物体間の距離の2乗。
    物体同士が引き合う力は距離が長いほど弱くなり、近いほど強くなる。

2.10 相互引力と反発

2.9の計算を、各ポイント間で計算し、毎フレーム全ポイントの影響を合計して適用する。


何か間違いがあればツッコミをいただけると助かります。

Houdini Crowd System – 003 / Ragdoll + Custom force テスト

また、絵的に少しどうかしている映像をアップしました。

今回は、エージェントをただラグドール化するのではなく、Stateの遷移を引き起こすボリュームにエージェントが含まれたらラグドール化し、そのボリュームから発せられる力を受けて、任意の方向に飛ばされるように設定するようにしてみました。
動画では非表示にしていますが、足元からエネルギー球がせり上がり、それに触れたUnityちゃんエージェントが吹き飛ばされているように設定してあります。

左に見えている点群がイベントボリューム兼カスタム外力発生器です。
各点から出ている黄色のラインは力の方向です。

この点群を大型キャラの四肢にアタッチするなどしておけば、自然と、大型キャラに暴れるモーションを付けるだけで、群がる群衆をを次々となぎ倒していくような絵が作れますね。

Houdini Crowd System – 002 / Transition + ragdoll テスト

先日から続けているHoudiniの群衆シミュレーション勉強。
今回は、状態遷移とラグドールの勉強。

正直、かなりどうかしている映像になってしまったけど、今日の勉強の成果としてアップ。

使用したエージェントの状態は、待機5種+歩行+ジャンプ+ラグドールによるシミュレーションと言った感じ。歩き出しがぎこちないのは、待機モーションと歩行モーションのポーズ差が大きすぎるからで、こういう場合は中間モーションを作ったほうが良さそう(特に回し蹴りモーションからの歩き出し)

群衆シミュレーションだと、手前のキャラは手付けで動かし、群衆は大写しになりにくい上に、もっとエージェントの密度が高い場合が多いと思うので、もう少しだけエージェントの状態遷移がスムースになればかなり見られる絵が作れると思ったりする。

Houdini 15.5 から搭載された Agent Terrain Adaptation も試してみたい。

Pyro Effects

基本的な作成方法

シェルフのPyro FXタブでFlamesなどを選択。
Fluid化したいオブジェクトを選び、Enter

AutoDopNetwork

Pyroに限らず、DOPをシェルフから自動で作成すると、AutoDopNetworkノードが作成される。
中を開くと大量のノードネットワークが作成されていることがわかる。
各種ノードに対する理解が浅いうちは表層のノードのみを使うようにしたい。

Flames作成直後のAutoDopNetwork

20140712_01_0

pyro(Smoke)

個々のPyroオブジェクトの動作を決定するノード
Guidesタブで見た目の調整用表示切り替えなどを行う。

resize_container(Gas Resize Fluid Container)

Fluidの状態に合わせてサイズが可変のFluidコンテナ

source_fuel_from_sphere_object1(Source Volume)

Fluidボリュームの発生源となるオブジェクト形状を入力するノード

pyrosolver(Pylo Solver)

煙と炎のソルバ。
smoke solverノードもあるようだが、pyroは上位版と言えるノードらしい。(Smoke Solver+燃焼モデルの複合ノードとのこと)
Pyroに関わる計算の精度など、大域的な調整を行う。

Pyro Effectの基本プロセス

20140712_01_1

20140712_01_2

20140712_01_3

Fuel[Fuel]:燃料

燃料の特性、材質

Burn:燃焼

燃料を炎と煙に変換するためのフィールド

Flames[Heat]:炎

Smoke[Density]:煙

煙。炎を正しくレンダリングする際に必要。

Temperature[Temperature]:温度

燃料の発火点や炎や煙の立ち昇るスピードなど。

Buoyancy:浮力

Expansion[Divergence]:拡大/発散

炎と煙の拡散の度合い

燃焼のプロセス

発火は、燃料の温度(Temparature)が燃料の発火点を超えた時に発生する。

発火点/燃焼
Fuel * BurnRate

煙の発生度合い
burn * soot rate


Maximam of heat , burn

燃焼による拡散の度合い
burn * gas_release * burn_influence

燃焼による温度変化
burn * heat output * temp_burn_influence

燃焼による燃料の減少
burn * ( 1 – fuel inefficiency )

各パラメータの関連(制御に使うパラメータ)

Smoke(Density)
Fuel/Burn Rate/Smoke Amount

Flames(Heat)
Fuel/Burn Rate

Temperature
Fuel/Burn Rate/Flame Contribution/Burn Contribution

Expantion(Divergence)
Fuel/Burn Rate/Gas Released

Pyro Solverノード 主なSimulationパラメータ

Buoyancy Lift
炎や煙の上昇の度合い

Burn Rate
燃えやすさ

Temperature Output
燃焼することで発生する熱、この数値が高いと炎や煙がより早く上昇する。

gas_released
年常時に発生するガスのスケール係数。
燃料が気化する速度?
この数値が高いとより炎が広がって燃える。
このパラメータの影響は、Divergenceを表示することで確認できる

Houdini – Particle Smoke

Particle制御

・Velocity、Accelerationノードなど

sourceノードの下流にVelocityやAccelerationノードを接続すると、その値が有効になる。
これは、上流でPointノードなどを使用して指定した速度などを上書きする。

・Propertyノード

上記ノードと同じように、Particleのスケール変更や質量を変更するには、Propertyノードを使用する。