物理エンジンで小さなオブジェクトをどのように処理する必要がありますか?


13

サイコロを投げるための3D物理エンジンを作成しています。これまでのサイコロは1x1x1mで、重力は9.82 m / s ^ 2でした。もちろん、これは現実的ではありません。サイコロがすべてに少し反応するように反応するからです。

これを修正するために、サイコロが一辺に沿って約0.02mになるようにすべてのサイズを変更しようとしました。これにより、逆質量と逆慣性行列の値が非常に大きくなり、数値が不安定になります。

これを処理する最適なルートは何ですか?サイコロが1x1x1になるようにスケールを維持し、作用する力の質量またはサイズを変更することはできますか?または、他の何かを微調整する必要がありますか?

宇宙船などの非常に大きな肉体でゲームを作成した場合、同じ問題が発生する可能性があるため、以前に誰かが同様の何かに遭遇したことを願っています。


私はここでは専門家ではありませんが、コードがなければ、どのような問題があるのか​​を知るにはどうすればよいですか?ただし、Box2Dにも同じ問題があるため、おそらく間違っています。
jcora

1
(すべての賛成票を見ると、これらのことをコーディングする従来の方法がなければならず、人々はあなたの問題を知っているようです。私は間違っていたと思います。)
jcora

1
はい、私はそれを処理する従来の方法があるかもしれないと思った。私が見るように、これはコードの問題ではなく、数値精度の問題です。私が望んでいるのは、問題を解決するためのコードスニペットではなく、問題へのアプローチの説明です。
ミカエル

浮動小数点精度を意味しますか?
jcora

ある意味ではそうです。衝突処理で使用する慣性行列の逆数は非常に大きな値を取得します。ピボット要素が大きな値を取得し、多くの加算が行われないため、実際には悪条件ではありませんが、シミュレーションがすぐに制御不能になるため、数値の精度に問題があるはずです。
ミカエルヘグストローム

回答:


1

あなたは出来る

  • 重力定数を増やしますか?ゲームはしばしば2 * 9.81 m / s ^ 2を使用します。私がこれをどこで読んだか思い出せませんが、ゲームは通常無意味なユニットを使用します。定数が正しいと感じるものは何でも(ゲームを楽しくします)。現実的な定数を使用すると、物理学が遅くなり、浮遊しているように見えます。
  • より高速でシミュレーションを実行します。固定タイムステップを使用している場合、これによりアニメーションのレートが上がります。
  • より高精度のフロートを使用しますか?

2番目のポイントは何もしませんが、シミュレーションをスムーズにするか、シミュレーションの実行が速すぎる場合はそれを壊すことさえあります差は常に0で、何も機能しません)。彼は、高精度のフロートでメモリを浪費したくないかもしれません。
jcora

1
ゲームはしばしば二重重力を使用しますか?誰が言ったのですか?
GameDev-er

レートや精度を変更することはできませんが、重力を変更してみます。
ミカエル・ヘグストローム

重力定数を変更すると、一般的にサイコロの動きが速くなり、すべてが小さいスケールであるかのような印象を与えます。これにより、フレーム間の加速を処理するためのマイクロコリジョンでも動作がより不安定になります。私はそれを微調整する必要があると思います:)
ミカエル・ヘグストローム

4

小さい数値で問題が発生した場合は、単純にすべてを縮小することをお勧めします。「実際の」測定単位ではなく、エンジン内部でのみ意味のある「一般的な」測定単位を使用する場合もあります。

最初のオプションである縮小では、基本測定単位としてミリメートルまたはセンチメートルを使用する必要があります。その場合、キューブの寸法に精度の低下はありません。

2番目の解決策は基本的に同じものですが、実際のユニットについて考える必要はありません。

また、キューブの質量を変更するだけではどうですか?


私が持っている唯一の力発生器は重力/加速度計ベースの質量変化であるため、挙動は変化しません。ただし、小さなオブジェクトに大きな質量を与え、それらの逆質量を1に近づけることにより、数値の不安定性を軽減することもできます(おそらくそれがあなたの意図したことです)。ただし、これは重力定数を増やすだけと同じ問題をもたらします。
ミカエルヘグストローム


0

問題に対する最終的な解決策を共有する必要があると思いました。示唆されたように重力定数を増やすと、実際にサイコロの動きが速くなり、正しいスケールの印象が得られます。ただし、これにより、マイクロバウンシングの問題が増加しました。問題を緩和するマイクロコリジョンを追加しましたが、完全には解決しませんでした。これは「小さな」オブジェクトでのみ問題になることに注意してください。逆の問題があり、非常に大きなオブジェクト(宇宙船など)をシミュレートしたい場合は、マイクロバウンシングの問題はまったく発生せず、対処できます。そのソリューション。

だから私はあまりにも多くの「マイクロバウンス」を取得せずに持っていることができる最高の重力を見つけました。次に、電話で簡単な振動検出を使用し、加速度計の測定値からの大きな変化に応答し、そのような振動が検出されたときにすべてのオブジェクトにインパルスを適用しました。完璧ではありませんが、電話を振るとサイコロが速く動くように設定されるため、「小さな」サイコロの印象を与えます。ちょっとしたハックですが、やらなければならないことはあります:)ここに、動作中のエンジンのクリップがあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.