タグ付けされた質問 「physics-engine」

衝突、力、質量、関節、運動などの物理をシミュレーションするためのソフトウェア。物理エンジンの例は、PhysX、Havok、Bullet、ODEです。

3
慣性テンソルの計算
少し複雑で長い質問ですが、認めますが、まだよく理解できていないので、できる限り説明していきます。 ショートバージョン:オブジェクトの形状に基づいて慣性テンソルを計算するための一般的なc ++ / physx式はありますか? ロングバージョン: 物理学では、x、y、zの慣性テンソルを指定する必要があります。現在、それを行う方法は、質量に基づいた比率にすぎません。したがって、オブジェクトがX軸で長く、YとZで細く、質量が10000の場合、ZとYを7000に、Xを3000に設定します(これは正確ではありませんが、あくまでも参考です)。 これは比較的うまく機能しますが、最大の問題は、どこかに関節の不安定性がある場合、何が最もうまく機能するかを理解するまでテンソルで推測し続けなければならないことです。非常に大きな物理シミュレーションがあり、20以上のジョイントのうち1つが他のすべてのジョイントの安定性を失わせている場合、これは非常に時間がかかる可能性があります。 私が取り組んでいるのは、オブジェクトの境界ボックスを取り、うまくいけば比較的正確なテンソルを計算する関数です。私はhttp://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensorsから数学の一部を取り、基本的に以下のようなローテーションで以下のように機能する関数を作成しました。 または、次のように回転が端にある場合: したがって、これは私たちが行ってきた方法と同様の結果を私に与えるようですが、それが一般的な使用で機能することを確認せずにこの方法に切り替えたくありません。以下は、立方体と中央のピボットを含む最初の画像に基づく関数のコードです。 NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m ) { float width = boundingBox.GetSizeX(); float height = boundingBox.GetSizeZ(); float depth = boundingBox.GetSizeY(); float xTensor = 0.083f * m*(height*height + depth*depth); float yTensor = 0.083f * m*(width*width + depth*depth); float zTensor = …

3
速いものを遅く見えるようにする(Box2D)
私はあなたがトレビュシェットを操作して対戦相手にボールを投げるゲームに取り組んでいます。 「中世の包囲」と呼ばれるゲームのようなものです。トレビュシェットが腕を振っているとき、プレーヤーはボタンを押してボールをリリースする最高の瞬間をつかむ必要があります。その後、ボールは接線角度で飛行します。 私の今の問題は、トレビュシェットの腕が速く振れすぎて、プレーヤーが適切な瞬間を捉えられないことです。その間、それはこれほど速くなければなりません、さもなければそれは十分に投げることができません。また、ボールとトレビュシェットアームをつなぐ小さなひもがあり、アームの動きが遅すぎると、アームが動くときにボールがひもにぶら下がっています。 ステップサイズを切り替えることで問題を解決し、腕を振るたびに、ステップサイズを1/60から1/200に変更します。そして、プレーヤーがボールをリリースすると、それは1/60に戻ります。 これは、私のゲームがネットワーキングを備えたマルチプレイヤー用であることを除いて、かなりうまくいきます。したがって、ステップを変更すると問題が発生する可能性があります。 私が考えることができるもう1つの解決策は、ゆっくりスイングできるようにすることですが、プレーヤーがボールをリリースするとき、方向を維持しながら手動でボールに速度を追加します。私はこのソリューションがあまり好きではないので、見た目が偽になり、ストリングを非常に短くしない限り、ボールがストリングにぶら下がっているという問題がまだあります。 これに少し光を当ててください、ありがとう! 編集 みんなの意見をありがとう、私は腕をゆっくり振って問題を解決し、プレーヤーがボールをリリースするとき、ボールの速度と2倍をつかみます。これは、ステップサイズを変更した場合とまったく同じように見えます。やらなければならないことがもう1つあります。腕の揺れが非常に遅いため、ボールが揺れるのではなく、腕の端にぶら下がっているだけです。私は、スイング期間中およびスイング期間中のみ、ボールに重力と等しい力を加えることによってこれを解決しました。それから、それはもはやそこにぶら下がらず、腕と一緒にスイングします。 @MrCrankyの答えは詳細であり、実行可能であるように見えるので、私はそれを受け入れます。:)

2
複数のアトラクタを処理できる物理エンジン?
主に立体重力でプレイするゲームをまとめています。 つまり、現実的に振る舞う複数の惑星/星/月、および重力場における経路のプロットと経路の予測を意味します。 私はBullet、トカマク、ニュートンなどのさまざまな物理エンジンを見てきましたが、それらのフレームワークで基本的に重力エンジンを書き直す必要があるため、どれも適切ではないようです。 互いに引き付け合う複数のボディを処理できる物理エンジンを知っていますか? シーングラフの管理やレンダリングは必要ありません。コアフィジックスだけです。(剛体ダイナミクスと同様に、衝突検出はおまけです)。 私のバックグラウンドは物理学なので、Verlet統合またはRK4(または必要に応じてオイラー統合)を使用するエンジンを作成できますが、既成のソリューションをかなり適応させたいと思います。 [編集]:n-bodyの問題の物理シミュレーションのための優れたリソースがオンラインおよびスタックオーバーフローにあります

2
エンジンは、物理エンジンで「フェーズロック」(同じ場所にある複数のオブジェクト)をどのように回避しますか?
最初にフェーズロックについて説明します。質量がゼロではない2つのオブジェクトが同じ空間を占めているが、エネルギーがゼロ(速度なし)である場合。 それらはゼロ速度解像度ベクトルで永遠にぶつかりますか、それとも外部の力が相互作用するまで一緒にロックされたままですか? 自作のエンジンで、キャラクターをツリーにロードして移動すると、衝突を通知して元の場所に戻ることに気づきました。これは、衝突が発生したときにインパルスを実装することで解決できたと思います。私の最後の場所(私の実装のようなもの)にジャンプするだけではありません。 しかし、私は自分のエンジンをより堅牢にしていますが、他のほとんどの物理エンジンがこのケースをどのように処理するかについて興味があります。移動速度のない同じ場所で始まるオブジェクトは、ランダムな方向に互いに発射するだけですか?または何かが起こるまで彼らはそこに座っていますか?一般的にどのオプションが最善のアプローチですか?

1
衝突点を見つける
2D剛体シミュレータを書いています。シミュレートされるオブジェクトは凸状のポリゴンです。私の質問には、衝突の「ポイント」をどのように決定するかが含まれているため、応答力を適用すると、トルクも計算できます。 2Dでは、ナローフェーズコリジョン検出の一般的な方法は、分離軸定理のようです。ただし、これにより「衝突するのか」ということになります。「どれだけ?」と同様に、応答力を適用する(したがってトルクを計算する)基準点(私が知っている)は提供されません*。 もう1つの方法(これは3Dで使用されるため、これにも興味があります。これが論理的な次のステップになります)は、2つのポリゴンのミンコフスキー差を計算し、(0,0)が結果のポリゴンに含まれます。しかし、これをどのように使用して、応答力を適用する相対点を決定しますか?私の仮説は、この違いの各面はポリゴンの1つの面に事実上対応しているため、分離距離は(0,0)からMDまでの最短距離であり、これをポリゴンの対応する面に適用するとします。 。 おまけとして、3Dでこれをどのように行うのですか? *これを書いているときに、SATを使用するときに、どのポイントが重複しているかを追跡し、それらのポイントの「平均」で力を適用できることに気づきました。しかし、私はこの小さなトリックを実行するためにいくつかの非分離軸のどれを決定する必要があります...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.