私は自分の娯楽のためにいくつかの非常に基本的な物理学を行う方法を学んでいますが、奇妙な問題に遭遇しています.
http://www.lonesock.net/article/verlet.htmlで説明されているように、時間補正されたベルレット統合方法を使用していますが、これまでのところ、かなりうまく機能しています。動きも物も全部いい感じです。
私の問題は、衝突の解決に関して発生します。地形は動かないので、地形に対して解決できます (かなりうまくいくようです)。プレイヤーの現在位置を安全な場所に設定したところ、問題はないようです。しかし、別のスプライト (物理的なアクターなど) に対して解決しようとすると、物事があちこちで発砲するように見えます。
私の解決コードは次のようになります。
void ResolveCollision(Sprite* entity1, Sprite* entity2)
{
Vec2D depth = GetCollisionDepth(entity1, entity2);
if (GetSpritePhysical(entity1) && GetSpritePhysical(entity2))
{
/* Two physical objects. Move them apart both by half the collision depth. */
SetPosition(entity1, PointFromVector(AddVectors(
VectorFromPoint(GetPosition(entity1)), ScalarMultiply(0.5f, depth))));
SetPosition(entity2, PointFromVector(AddVectors(
VectorFromPoint(GetPosition(entity2)), ScalarMultiply(-0.5f, depth))));
}
else if (GetSpritePhysical(entity1) && !GetSpritePhysical(entity2))
{
SetPosition(entity1, PointFromVector(AddVectors(
VectorFromPoint(GetPosition(entity1)), ScalarMultiply(-1.0f, depth))));
}
else if (!GetSpritePhysical(entity1) && GetSpritePhysical(entity2))
{
SetPosition(entity2, PointFromVector(AddVectors(
VectorFromPoint(GetPosition(entity2)), depth)));
}
else
{
/* Do nothing, why do we have two collidable but nonphysical objects... */
}
}
ご覧のとおり、衝突したスプライトが物理的なものかどうかによって、3 つのケースがあります。
おそらく、この問題が発生した最初のケースです。そして、同じ関数を使用して、(一見動作している) 地形衝突にある貫通深度を取得しています。
衝突したスプライトがあちこちに飛んでいくのはなぜですか? 私はこの問題にかなり困惑しています。どんな助けでも素晴らしいでしょう。