閉じる

« Movable Type設置した | メイン | チェーンメール »

物理計算するボール

ってわけで再掲。
壁との跳ね返りと回転運動をエミュレートシミュレートしたボール。
どんな地形にも割と対応できます。

http://sowzweb.s4.xrea.com/flash8/slope.html

リンク先にも説明はあるけど一応こっちにも書いておく。
読みやすい文章の苦手な俺が書きますよ。読みたい人だけ読んで。

跳ね返りに使ってる方法がペナルティ法って言うもので、剛体を非常に硬いバネとみて処理をしようという考え方。だから多少のめり込みは許します。逆に言うと、めり込んでも大丈夫。
大雑把な処理をする割には、それなりに正しい結果が返ってきてさらに柔軟性に富んでいると、それはまぁ素晴らしい手法であります。
かの(一部で)有名な物理ゲー名作パネキットにも採用されてると思う。

以下物理的な細かいこと

沈んだ分だけ特定のバネ定数で跳ね返すだけなのですが、このままだとそれだけだと跳ね返りが収まらないので、速度による減衰の処理もする。いわゆるバネダンパ系。

d:沈んだ距離 v:速度 K:バネ定数 E:減衰定数(ダンパー)
fv=K*d-E*vv;

こんな感じ。
パラメータ値は試行錯誤でそれっぽい動きをする値を見つけて決めます。そういうもんです。
ちなみにバネ定数が小さいと大きく沈みます。軟らかいもののを表現したいときに。

そんでこの方法の特性上、fpsが低いと精度の高い跳ね返りができません。よって高ければ高いほど良いんですが、100fpsくらいを目安にするといい感じです。まぁ当然Flashで100fpsは無理なので、これは30fpsにして1フレーム4回処理で対応してます。

摩擦は沈んだバネの力をそのまま水平に与える、みたいな感じで。

fh=-μ*K*d*|vh|/vh;

あとはこれを多角形vs点に応用すればいいわけですね。

ちなみに、バネの力を衝突した瞬間から現在までの時間で積分すればfpsにかかわらず同じ結果が返ってくるのではないかと考えたんですが、なんか、無理っぽかった。フーリエ展開とか要るのかな?俺には解けませんでした。

トラックバック

このエントリーのトラックバックURL:
http://sowzweb.s4.xrea.com/x/mt-tb.cgi/5

コメントを投稿