布やぶりシミュレーターベータ
ピン留めした布を引っぱり、破り、風になびかせるVerlet物理
このツールはまだ安定化中のベータ版です。結果に違和感があればお知らせください。
布は点を糸(距離制約)でつないだ格子です。各点はVerlet積分で前の位置と今の位置の差を速度として動き、毎フレーム糸の長さを何度も戻して布の形を保ちます。糸が限界倍率を超えて伸びると切れます。「せん断拘束」は各マスに対角の糸を、「曲げ拘束」は1マス飛ばしの点どうしを結ぶ糸を見えない形で加え、布のゆがみや折れを減らします。これらの糸は自分では切れず、支えている縦横の糸が切れると一緒に切れます。キャンバスを押してドラッグすると布を引っぱり、カットツールやマウスの右ボタンでなぞると切り裂けます。 柄を選ぶか画像を入れると(キャンバスにドロップしてもOK)布にプリントされ、布の形は画像の比率に合わせて変わります。精度を上げると点が増えてなめらかに破れますが、たるまないよう硬さも一緒に上げてください。
処理中…
0.0
停止していません。計算が終わると結果が表示されます。
布やぶりシミュレーターについて
この布は格子状に並んだ点と、隣り合う点をつなぐ糸(距離拘束)でできている。点は速度を別に持たない。今の位置と1つ前の位置だけを覚え、その差を速度とみなす。この「速度を持たない」ベルレ積分に拘束の繰り返し処理を組み合わせる方法は、Thomas Jakobsen が2001年のGDC講演「Advanced Character Physics」で紹介したもので、IO Interactive の『Hitman: Codename 47』で布、植物、倒れる体(ラグドール)を動かすのに使われた。
布は2次元で、画面の平面内だけを動き、重なっても布どうしはぶつからない(自己衝突なし)。既定では糸は縦横の隣どうしにしかないので、1マスがひし形にゆがむ変形(せん断)や折れ曲がりには抵抗しない。「せん断拘束」をオンにすると各マスに対角の糸が、「曲げ拘束」をオンにすると1マス飛ばしの点どうしを結ぶ糸が見えない形で加わり、これらの変形が小さくなる。これらの糸は自分では切れず、支えている縦横の糸が破れたり切られたりすると一緒に切れる。
1フレームで起きること
位置を直接動かす方式なので、拘束のために点を動かすと、その移動が次のステップの速度に自然に反映される。速度と位置がずれることがなく非常に安定している。一方でエネルギーは少しずつ失われるが、布らしく見せるにはむしろ都合がよい。
- 慣性移動:新しい位置 = 今の位置 +(今の位置 − 前の位置)× 減衰 + 加速度 × Δt²。減衰の既定値0.99は、Jakobsen の「2を1.99くらいに下げると少し抵抗が入る」と同じ仕掛けだ。
- 拘束の処理:すべての糸を順に見て、元の長さより長ければ両端を半分ずつ引き寄せ、短ければ押し広げる。片方がピンで留められているか手でつかまれていれば、もう片方だけを動かす。これを「硬さ(反復回数)」の回数だけ繰り返す。
- 破れの判定:反復がすべて終わってから、元の長さの「破れる限界」倍より長い糸を切る。
- 壁・床:画面の外に出た点を端に戻し、床では横の速さを半分にして摩擦の代わりにする。
緩和法:繰り返すとなぜ合うのか
糸を1本合わせると隣の糸がまたずれる。それでも全体を何度もなぞると、すべての糸が同時にほぼ正しい長さになる状態に収束する。Jakobsen はこれを緩和法(やり方によってヤコビ法またはガウス・ザイデル法)と呼んだ。このツールは直した位置をすぐ次の糸の計算に使うので、ガウス・ザイデル型だ。
Jakobsen は、見た目のよい布ならたいてい1回の反復で足りると書いている。しかしこのツールのように数千の点があり上の行だけで吊られた布では、1回では糸が伸びきったまま残り、布全体がゴムのように伸びる。「硬さ」を2に下げると布は大きくたるんでゆっくり揺れ、40以上にするとほとんど伸びない布になる。この方式では硬さは素材の性質ではなく、計算をどこまでやり切るかで決まる。
格子を細かくすると、同じ反復回数では解ききれなくなる。そのため点の間隔が約12ピクセルより狭くなると、1フレームを最大6つの部分ステップに分けて解く。
破れはどう広がるか
糸が1本切れると、その糸が支えていた力が隣の糸に集まる。隣がさらに伸びて限界を超えるとまた切れ、こうして破れが線状に走る。既定値2.6なら、間隔12ピクセルの糸は31.2ピクセルを超えたときに切れる。限界を1.3に下げると上の行の近くが自重に耐えられず、6に上げると強く引っ張ってもなかなか破れない。
ピンの配置で結果が大きく変わる。4点ごとにピンを打つ既定の配置ではピンの間がたるんで波形になり、両端だけ留めると中央が大きく垂れて上部の糸に重さが集中する。上の行を全部留めると重さが均等に分かれ、最もよく持ちこたえる。
例
切れる長さの計算
- 入力
点の間隔12 px、破れる限界2.6- 結果
12 × 2.6 = 31.2 pxを超えると切れる
判定は拘束をすべて解いた後に行う。反復の途中で一時的に伸びただけでは切れない。
減衰0.99が1秒後に残す速度
- 入力
毎秒60フレーム、部分ステップ1つ/6つ- 結果
どちらも0.99⁶⁰ ≈ 0.55
減衰の値は60fpsの1フレーム基準だ。部分ステップがn個なら各ステップで0.99^(1/n)を掛けるので、格子を細かくしても揺れの収まる速さは変わらない。
使い方
- キャンバスを押してドラッグし、布を引っ張る。
- 切るツールか右ボタンでなぞって布を切る。
- 重力・風・破れる限界・硬さ・ピンの配置を変えてみる。
- 模様や画像を選んで布にプリントする。
主な用語
- ベルレ積分(位置形式)
- x新 = 2x − x前 + aΔt²。速度を保存せず、2つの位置の差で代用する。
- 距離拘束
- 2点間の距離を決まった長さに保つ条件。この布では「糸」にあたる。
- 緩和法
- 多数の拘束を1つずつ満たす作業を繰り返し、全体の解に近づける方法。
よくある質問
布が伸びすぎる。
「硬さ(反復回数)」を上げる。格子の精度を上げたときは特に必要だ。反復が足りないと糸が元の長さに戻りきらず、布がゴムのように伸びる。
何もしていないのに破れた。
破れる限界か硬さが低く、自重で伸びた糸が限界を超えたためだ。どちらかを上げるか、ピンを上の行全体に変える。
ゲームの布もこうやって作る?
この方式と後継の位置ベース動力学(PBD)はゲームで広く使われている。実際のゲームの布には対角線の糸(せん断)や1つ飛ばしの糸(曲げ)が加わり、キャラクターとの衝突も処理する。このツールでも「せん断拘束」「曲げ拘束」をオンにして違いを確かめられる。
出典
- Thomas Jakobsen, Advanced Character Physics, Game Developers Conference 2001 (CMU course mirror)
- L. Verlet, Computer "Experiments" on Classical Fluids. I, Phys. Rev. 159, 98 (1967)
基準日: