2

私の物理エンジンには、次のような衝突解決方法があります。

Vector2 n1pos = n1.NonLinearSpace != null ? n1.NonLinearPosition : n1.Position;
Vector2 n2pos = n2.NonLinearSpace != null ? n2.NonLinearPosition : n2.Position;
Vector2 posDiff = n2pos - n1pos;
Vector2 posDiffNormal = posDiff;
posDiffNormal.Normalize();
float totalRadius = n1.Radius + n2.Radius;
float posDiffLength = posDiff.Length();
float interPenetration = totalRadius - posDiffLength;
float averageRestitution = (n1.RestitutionCoefficient + n2.RestitutionCoefficient) / 2;

Vector2 forceAmount = Vector2.Multiply(posDiffNormal, interPenetration);
Vector2 n1force =
    (
        (n1.Velocity * n1.Mass) +
        (n2.Velocity * n2.Mass) +
        n2.Mass * averageRestitution * (n2.Velocity - n1.Velocity)
    ) /
    (n1.Mass + n2.Mass);
Vector2 n2force =
    (
        (n1.Velocity * n1.Mass) +
        (n2.Velocity * n2.Mass) +
        n1.Mass * averageRestitution * (n2.Velocity - n1.Velocity)
    ) /
    (n1.Mass + n2.Mass);
n1.ApplyForce(???);
if (!n1.IsStatic)
{
    n1.Position += ???;
}
n2.ApplyForce(???);
if (!n2.IsStatic)
{
    n2.Position += ???;
}

さて、適切な反発係数を機能させるために、エンジンのボディに何を適用すればよいかわかりません。(???の部分)。誰か助けてくれませんか?

4

2 に答える 2

6

この質問と他の質問から判断すると、あなたは歩けるようになる前に走ろうとしています。

  1. 一度に 1 つずつ取り組む必要があるときに、一度にいくつかのなじみのないものをコーディングしようとしています。オブジェクトがパテの塊のように動作するように、復元係数を 0 に設定してみてください。その方がコーディングが簡単で、それが機能するようになったら、弾性衝突を試すことができます。
  2. 問題はありませんが、基本的な物理学を学んでいないのに物理エンジンを書こうとするのは自虐的です。教科書を読んだり実験したりすることはできますが、部品を理解せずにエンジンを動かす方法はありません。
于 2009-11-05T22:30:38.940 に答える
5

これは古い質問だと思いますが、同じ問題に遭遇し、Google がこのページを表示しました。私は自分の調査結果を共有できると考えました。まず、反発係数は、衝突に関与するいずれかの物体の特性ではなく、衝突の特性であることを認識する必要があります。つまり、n 個のオブジェクトに対して、n(n-1)/2 個の反発係数を定義する必要があります (ボディのペアごとに 1 つ)。

ただし、私が調べた物理エンジン (Bullet、Chipmunk、および Box2d) はすべて、復元をボディのプロパティとして定義しています。衝突時に、2 つの物体の反発係数を 1 つの値に結合し、それを衝突の解決に使用します。明らかに、これは物理的に正しくありません。しかし、それはゲームにとっては大した問題ではありません。直感的に動作する必要があるだけです。これらの物理エンジンが使用する復元関数は次のとおりです。

  • 銃弾:restitution = body1->restitution * body2->restitution
  • シマリス:restitution = body1->restitution * body2->restitution
  • Box2d:restitution = max(body1->restitution, body2->restitution)

Box2d では、ユーザーは構成ファイルで復元機能をカスタマイズできます。Bullet と Chipmunk はそうではありません。

復元ミキシング機能が最適と思われるものを選択することをお勧めします。少し遊んで、好きなものを見てください。

于 2010-07-25T05:42:01.193 に答える