超シンプル物理 / CEDEC 2011 中継よりメモ

前半

Verlet(ベルレ)積分

x(t + \Delta t) = x(t) + {x(t) - x(t - \Delta t)} + a(t) \cdot \Delta t^2

  • 前の位置と現在の位置の差で、速度を表す
  • 位置を直接動かすことができる特徴が重要

力を掛ける場合は、f = maから。

スティック拘束
  • 2点の長さを維持する
  • 位置を書き換えればよい
チェイン(揺れもの)
  • sqrt近似: sqrt() = r + (a - r^2) / 2r
コリジョン
  • 以上に対するデモ : 髪の毛
チェインの姿勢と角度制限
  • 姿勢はバインドポーズからの最小回転で算出
  • 平面上で角度制限。超えていたら制限値に戻し、ワールド座標へ
ヘビIK

1. 目標位置を決める
2. 現在位置と目標位置との間にバネ(力)
3. あとはVerlet積分と拘束が面倒みてくれる

  • デモ : 頭を動かすと、体がついてくる。体にコリジョンが当たれば、それなりの形に変形
  • デモ : Dragon's Dogmaのヒドラ
布、髪
  • メッシュをそのままパーティクル+スティック拘束に
ソフトボディ
コリジョン:頂点法線
  • デモ : マント
  • デモ : Dragon's Dogmaの旗・テント・髪の毛・服・たてがみ・髭

Dragon's Dogmaでは、

バッチング
  • Lost Planet 2のヤシの木
    • SPUではLS(ローカルストレージ)に入る分を送る
コリジョン:画像ベース
  • テクスチャに保存した高さフィールドとのコリジョン
  • 背景やキャラクターを高さフィールド化
    • Dragon's Dogmaでは一部背景に使用

後半: 以降の内容はDragon's Dogmaで使われていない

Verlet 剛体 (VRB)
  • 四面体
    • 4パーティクル
    • 6スティック拘束
    • 質量は4つのパーティクルの合計
    • 慣性テンソル : 4パーティクルの質量配分と配置から
    • なぜ四面体?
      • 剛体の座標系に変換
      • 重心座標系(後で重要)
      • 多面体で最小の頂点・辺・面
衝突応答
  • Verlet積分なので位置を移動するだけ
  • 複数VRBの衝突はこの処理を逐次繰り返す
重心座標系
  • 任意の位置p

A = q - p(移動量)
\lambda = \frac{1}{(c_1^2+c_2^2+c_3^2+c_4^2)}
x_1' = x_1 + c_1 \cdot \lambda \cdot A
x_2' = x_2 + c_2 \cdot \lambda \cdot A
x_3' = x_3 + c_3 \cdot \lambda \cdot A
x_4' = x_4 + c_4 \cdot \lambda \cdot A

  • c_1c_4:重心座標で分配
摩擦
  • 疑似摩擦
  • デモ : スタッキングなどには向いていない
ボールジョイント
最大距離ジョイント
ヒンジジョイント
  • ラグドールで一番重要
    • ボールジョイント1
    • 最大距離ジョイント3
    • 最大距離ジョイントを利用して角度拘束 : JigLibと同様
  • デモ : ローブにぶら下がるキャラクター
    • 四面体表示してみると、四面体は大きめ
    • 思いっきり動かすと、伸びてしまうが、収束する
    • 破綻することはまずない
モーション駆動ラグドール
  • 2フレーム分動かして、ラグドールに切り替えることができる
  • デモ : モーションのブレンド
    • ラグトール(物理)+モーション(じたばた)

まとめ

  • 仕組みがわかりやすく〜
    • 重心座標のあたりはちょっと複雑だが
  • 正確さには劣る
    • より正確なものが必要な場合→速度ベース、インパルスベース
    • それなりの挙動を簡単に生み出せる

今後の課題