「Advanced Character Physics」に基づく物理エンジンで摩擦を実装する方法


8

Thomas Jakobsenによる古典的なテキストAdvanced Character Physicsの概念に基づいて、物理エンジンを実装しました。摩擦については記事でごく簡単に説明しているだけで、Jakobsen自身は「これよりも優れた摩擦モデルを実装できるはずである」と述べています。

一般的に、前述の記事の概念に加えて、信頼できる摩擦モデルをどのように実装できますか?そして、どのようにして見つけられた摩擦を円の回転に変換できますか?


この質問を私の具体的な実装についてではなく、より一般的にはヤコブセンスのアイデアを優れた摩擦システムと組み合わせる方法について質問したくありません。しかし、これは摩擦をまったく処理しない私のエンジンの現在の状態を示すライブデモです。。http //jsfiddle.net/Z7ECB/embedded/result/


以下は、この論文に基づいたエンジンで衝突検出がどのように機能するかを示した例です。Verlet統合では、現在と以前の位置が常に保存されます。これらに基づいて、新しい位置が計算されます。すべてのフレームで、円と線の間の距離を計算します。この距離が円の半径よりも小さい場合、衝突が発生しており、円はオーバーラップのサイズ(図のオフセット)に従って問題の線から垂直に投影されます。

速度はVerlet統合により暗黙的であるため、位置を変更すると速度も変更されます。私が知る必要があるのは、円の摩擦の量を何らかの方法で決定し、速度を下げるために円と平行に後方に移動することです。 衝突がどのように発生するかを示す図


とても素敵な記事!今のあなたの摩擦はどうですか?
MikaelHögström2012

はい。素晴らしい記事です。非常にシンプルですが、それを基に作業する目的に適したエンジン全体を持っています。摩擦を除く;)
paldepind 2012

そして素晴らしいビデオも。有望に見えます!
MikaelHögström2012

回答:


4

Mathias Mueller et allの「位置ベースのダイナミクス」ペーパーをご覧ください。それは基本的にジェイコブソンの論文と同じであり、彼は摩擦についてより多くの情報を与えるかもしれません。

http://www.matthiasmueller.info/publications/posBasedDyn.pdf

彼らは、摩擦は基本的に衝突面での粒子の速度をあるスカラー値で減衰させていると述べています。

これはクーロン摩擦効果を与えないことに注意してください(衝突への運動量は摩擦力の大きさに影響しません)が、衝突平面への粒子の速度を考慮することでそれを得ることができるかもしれません。


1
それ以外の場合は静止しているボディにインパルスを適用するときに、特定のしきい値を確認するとどうなるでしょうか。接触面の衝撃の成分がそのしきい値よりも低い場合は、それをゼロに設定して、静摩擦の影響を模倣できます。それ以来、動摩擦はまさにあなたがそれを説明した方法です。+1
teodron

0

「通常の」剛体エンジンでは、摩擦を法線に垂直な衝撃としてモデル化します。このコンテキストでは、インパルスの代わりに、影響を受けるパーティクルの位置を適切に設定することを意味すると思います。制約が設定されているため、記事を正しく理解していれば、摩擦も回転に影響を与えている状態に繰り返し到達します。「より良いモデル」とは、著者が相互浸透の線形投影よりも摩擦の量を決定するためのより良い方法を意味することを私は推測しています。しかし、私はこのアプローチで物理学を自分で実装したことがないので、これは私の推測です。

編集:

摩擦力のサイズを計算するには、画像にオフセット値があります。固定タイムステップでverletを使用しているので、このオフセットは実際には接触法線の方向での接触の速度であることがわかります(厳密には正確ではありません。摩擦をより適切に近似することで著者がこれを意味していると思います) )。接触法線に沿った速度を知ることは、それを使用してインパルスを決定できるため、不可欠です。最良の方法は、接触がある各フレームに衝撃の形で摩擦を加えることです。接触面に平行な軸の摩擦のサイズは、摩擦係数によって決定されます(材料によって決定されます。たとえば、かなり高い摩擦では0.7)。発生する可能性のある最大摩擦は、摩擦係数にオフセットを掛けたものです。この値は、いずれかの軸に沿った実際の速度よりも大きくなる可能性があることに注意してください。その場合、静止摩擦があり、パーティクルはその軸でまったく移動しないはずです。値がそれよりも小さい場合、パーティクルは少し移動しますが、速度が遅くなります(動的摩擦)。


あなたは正しいです。少なくとも私にとってトリッキーな部分は、「影響を受けるパーティクルの位置を適切に設定する」方法を決定することです。
paldepind 2012

ああ、わかりました。それでは、あなたがどこにいるかがわかります。解決策のアイデアがあります。答えを編集します
MikaelHögström2012

それはまさに論文で説明されているテクニックです;)。私はそれを実装してみて、自分のプロジェクトで十分ならそれを試してみると思います。
paldepind 2012

ああそうだと思います...メソッドはリジッドボディエンジンの場合とほとんど同じであるようですが、代わりにベルレットの統合を考慮して、位置の変化としてインパルスを適用します。
MikaelHögström12年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.