Javaゲーム制作記

いろいろ作ってます  

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | Comment(-)

剛体シミュレーション手法

※説明には間違いがあるかもしれません。くれぐれも自己責任でお願いします。
もし見つけたら報告してくださるとうれしいです。


P.S.間違いだらけでした。とりあえず修正しておきました


今日は、2Dの剛体シミュレーションについて書きます。
剛体とは、
形の変形が全く無い物体です。
要するに、
「とてつもなく(無限に)硬い」
と理解していてOKです。


剛体シミュレーションにも拘束ベースやペナルティー法などいろんな手法がありますが、
今回説明するのは、ペナルティー法です。
ペナルティー法とは、剛体間にめり込みが発生したときに、めり込み量に応じて力を与えるという手法です。
(めり込んだら押し戻そう方針)


剛体シミュレーションにおいて、一番重要なのは、
「どう衝突を検出するか」
と、
「どう衝突応答をするか」
の二つです。
これが決まれば(そして正確に計算すれば)、後は物理法則に応じて結果が得られます。
運動について考えてみましょう。
運動には、次のような法則があります(運動の法則)。

1、外部から力が加わらない限り、物体は静止(運動)し続ける。
2、物体の加速度は、加わった力に比例する。その向きは、加えられた力と同じである。
3、力が加わったとき、作用・反作用の力が発生する。反作用の力は、
作用する力と同じ大きさ、なおかつ、正反対である。

だったと思います(うろ覚え)。

では、まず必要な剛体の変数について書いておきます。
・質量
・重心
・速度
・角速度
・回転角(3Dではクォータニオン)
・慣性モーメント
これだけあれば、多分大丈夫です。
このうち、質量と慣性モーメントは定数(変化しない)です。

慣性モーメントを求めてみましょう。
慣性モーメントは、重心との距離の二乗に質点の質量を足したものになります。
形状が分かっていれば、公式で求めることができます。
この辺はググるとたくさん見つかります。
例:長方形=質量×(幅^2+高さ^2)÷12

質量を求めてみましょう。
質量は、各質点の質量の合計で表せます。
つまり、
M=Σp.m
pは質点を表しています。
通常は密度×面積(体積)で求めます。

そして衝突応答です。
ここでは、衝突検出については書きません。
ペナルティ法では、めり込み距離とバネ・ダンパ係数から
剛体にかかる力Fを求めます(詳しくは調べてください;;)。
注:摩擦についてはややこしくなるので考えません。
運動量(v)と角運動量(ω)の増加については、それぞれ次の式で表せます。
v+=F/M
ω+=F×cp/I
※ Mは質量、Iは慣性完成モーメント、×はベクトルの外積を表し(z値を取ってください)、
  cpは衝突点の相対位置を表します。

では、実行結果を載せます。
左クリック:四角形
右クリック:五角形
中クリック:壁


P.S. 慣性モーメントの計算方法を間違えてました。異常に回りにくいです

今回はいい加減な計算で求めていたのでいい加減な結果になりましたが、
きちんと計算すればそれなりの結果になります。
がんばってください!
[ 2009/07/06 19:36 ] 物理演算 | Comment(2)
中クリック
中クリックが出来ないんですが・・・
 
[ 2009/07/07 23:21 ] [ 編集 ]
やっぱり・・・
説明が下手でした。
Windowsを使っていれば、マウスの真ん中に
ホイール(くるくる回るやつ)があるはずです。
それを回さずに押してみてください。
[ 2009/07/08 09:25 ] [ 編集 ]
コメントの投稿




※URL記述の際はttp://としてください


プロフィール

saharan

Author:saharan

Twitter
検索フォーム


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。