問題タブ [physics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - VerletIntegrationは私の物理エンジンを爆破しています
私は物理エンジンを構築していて、ある種の「疑似ベレ」を実行していて、それを「実際の」ベレにアップグレードしたかったのです。だから私は記事を見つけて仕事に取り掛かりました。良い近似だと思うものを追加した後、エンジンは動作しなくなりました。誰かが私が間違っていることを理解するのを手伝ってもらえますか?
私の主な物理ボディクラスの更新、力の適用、およびインパルスシステムの適用:
編集: 私はそれを修正しました、そしてそれは魅力のように働きます、しかし私は次のコードについて2つの質問があります:
- インパルスアプリケーションコードは正しいですか?そうでない場合はどうあるべきですか?
- 体の現在の速度を維持するように位置プロパティを変更するにはどうすればよいですか?
コードは次のとおりです。
c# - 物理エンジンの計算順序と反復
Verlet 統合を使用する物理エンジンを作成していますが、いくつかの制約を正しく機能させることができません。いくつか (bond/weld 制約など) は余分な「水浸し」で十分に硬くありませんが、他のもの (領域制約など) は余分な弾みがあり、原子を飛ばします。私の物理シミュレーターでの更新方法のコードは次のようになります。
更新命令のさまざまな組み合わせをすべて試しましたが、何も助けにはなりませんでした。反復の使用について漠然とした考えがありますが、他に何が役立つかはわかりません。助言がありますか?
c# - 体があまりにも速く衝突すると、領域の制約が物理シミュレーションを爆破する
私は物理シミュレーションを持っており、領域制約を設定して、その領域内の物体がその領域から出ないようにすることができます。ただし、原子が領域制約の「壁」の 1 つを通過すると、物理シミュレーションが爆発します。なぜこれを行うのですか?更新方法:
c# - 拘束が繰り返される柔らかいばねを作成するにはどうすればよいですか?
物理エンジンにばねを追加しようとしていますが、アルゴリズム自体は機能しますが、非常に硬いです(目に見える動きを引き出すには、値<=約0.1を入力する必要があり、非常に小さく設定する必要があります)。正しく動作するために)。次のコードを改善して、0.1から1の範囲の値でそれほど硬くないようにするためのヒントはありますか?
algorithm - ブロードフェーズの衝突検出方法?
私は 2D 物理エンジンを構築しており、ブロード フェーズの衝突検出を追加したいと考えていますが、2 つまたは 3 つのタイプしか知りません。
- すべてを他のすべてと照合します (O(n^2) の複雑さ)
- Sweep and Prune (ソートとスイープ)
- Binary Space Partition についての何か (これを行う方法がわからない)
でも確かにもっとオプションがありますよね?彼らは何ですか?また、それぞれの基本的な説明または説明へのリンクを提供できますか?
私はこれを見てきましたが、私のニーズに最適なものではなく、利用可能なアルゴリズムのリストを求めています.
この場合、「ブロード フェーズ コリジョン検出」は、シミュレーション内のどのボディが十分に接近しているかを判断するために物理エンジンによって使用される方法であり、さらなる調査と、場合によってはコリジョンの解決を保証します。
math - ゲーム物理学のためのルンゲクッタ (RK4) 統合
Gaffer on Games には、RK4 統合を使用してゲームの物理特性を改善することに関する素晴らしい記事があります。実装は簡単ですが、その背後にある計算は私を混乱させます。導関数と積分を概念レベルで理解していますが、長い間方程式を操作していませんでした。
Gaffer の実装の矢面は次のとおりです。
RK4 の仕組みを簡単に説明できる人はいますか? 具体的には、なぜ、 、 、 、および で導関数を平均化する0.0f
の0.5f
です0.5f
か1.0f?
?
以下の受け入れられた回答と他のいくつかの記事を読んだ後、RK4の仕組みを理解しました。私自身の質問に答えるには:
RK4 の仕組みを簡単に説明できる人はいますか?
RK4 は、関数の 1 次導関数または 2 次導関数だけでなく、高次の導関数を使用すると、関数のより優れた近似を得ることができるという事実を利用しています。これが、テイラー級数 がオイラー近似よりもはるかに速く収束する理由です。(そのページの右側にあるアニメーションを見てください)
具体的には、なぜ0.0f
、0.5f
、0.5f
、およびで導関数を平均化するの1.0f
でしょうか?
ルンゲクッタ法は、単一点の導関数のみをサンプリングするテイラー級数とは異なり、時間ステップ内の複数の点の導関数をサンプリングする関数の近似です。これらの導関数をサンプリングした後、可能な限り最も近い近似値を得るために、各サンプルを重み付けする方法を知る必要があります。これを行う簡単な方法は、テイラー級数と一致する定数を選択することです。これは、ルンゲ クッタ方程式の定数を決定する方法です。
この記事は私にとってそれをより明確にしました。がルンゲ・クッタ導関数であるの
(15)
に対し、 はテイラー級数展開であることに注意してください。(17)
微分を 4 次まで平均化することは、時間ステップを小さくして単純なオイラー積分を行うこととどう違うのでしょうか?
数学的には、多くのオイラー近似を行うよりもはるかに速く収束します。もちろん、十分なオイラー近似を使用すると、RK4 と同等の精度を得ることができますが、必要な計算能力がオイラーの使用を正当化するものではありません。
c++ - BulletPhysics-体の局所空間にトルクインパルスを適用する
私は現在、 C++とOgre3Dを使用して書いている3D宇宙ゲームのBulletPhysicsLibraryを評価しています。btMotionStateから派生し、SceneNodesをプラグインすることで、Ogre3DとBulletをうまく統合しましたが、達成するためにbtRigidBody::applyCentralImpulseメソッドとbtRigidBody::applyTorqueImpulseメソッドに渡す必要のある値を計算するのに多くの問題があります。私が探している結果。
キーボードのLEFTキーまたはRIGHTキーを押すと、宇宙船がローカルのZ軸上を回転するようになります。上または下を押すと、ローカルX軸にピッチングします。AまたはZを押すと、ローカルZ軸の方向に加速/減速したい。いくつかのクォータニオン数学を使用し、SceneNodeに直接変換/回転を適用することで、Ogreでこれを完全に達成できますが、force /トルクメソッドを使用してこれらの値をBulletエンジンに適用したいので、移動/ピッチ/ロールを継続しますユーザーがキーを押すのをやめた後でも、必要に応じてオブジェクトに摩擦が作用して速度が低下します。
では、インパルスが世界の軸を使用するのではなく、体の現在の向きに基づいて作用することを保証するために、これら2つのインパルスメソッドに提供するために必要な値を計算するにはどうすればよいですか?
ありがとう、マーク
アップデート:
前後の動きに必要なインパルスを計算することはできましたが、トルクインパルス法で使用するためにヨー/ピッチ/ロールの値の向きを変える方法にまだ苦労しています。これが私が前進/後退運動をした方法です:
c# - 衝突解決法での反発係数の適用
私の物理エンジンには、次のような衝突解決方法があります。
さて、適切な反発係数を機能させるために、エンジンのボディに何を適用すればよいかわかりません。(???の部分)。誰か助けてくれませんか?
algorithm - 球に対する X、Y、Z ベクトルを指定して球のスピンを求める
いくつかの 3D シミュレーションに Lua で Electro を使用していますが、数学/アルゴリズム/物理学の問題に直面しています。
ある軸で回転している球の球の「スピン」をどのように見つけるかを理解しようとしています。「スピン」とは、球が回転している軸に沿ったベクトルを意味し、球が回転している速度に比例した大きさを持っています。この情報が必要な理由は、回転が止まるまで逆トルクを球体に適用することで、球体のスピンを遅くできるようにするためです。
私がアクセスできる唯一の情報は、球に対する X、Y、および Z の単位ベクトルです。つまり、各フレームで 3 つの異なる関数を呼び出すことができます。各関数は、それぞれ球モデルのローカル X、Y、Z 軸の方向を指す単位ベクトルを返します。基本的に各ベクトルの「前の」値を保持し、それを各フレームの「新しい」値と比較することで、これらのそれぞれがどのように変化するかを追跡できます。問題は、球のスピンを決定するためにこの情報をどのように使用するかということです。私は困惑しています。
どんな助けでも素晴らしいでしょう。ありがとう!