【发布时间】:2016-05-31 19:38:37
【问题描述】:
我正在创建一个 2D 物理引擎,但在可移动和不可移动对象之间发生某种类型的碰撞时遇到了问题。我所说的可移动的意思是(x,y)值可以改变,而不是参考框架可以或不能改变。
例如,击中墙壁的球是可移动的物体与不可移动的物体碰撞。
我相信在这种情况下我需要使用法向力之类的东西,但我不确定如何使用它来找到碰撞的结果。
这是我到目前为止的代码。此代码用于两个移动实体之间的碰撞,但我需要添加一个不移动的情况:
private static void UpdateEntities(PhysicsEntity a, PhysicsEntity b)
{
var collisionAngle = Math.Atan2(a.Position.Y - b.Position.Y, a.Position.X - b.Position.X);
var angleA = a.Velocity.Direction - collisionAngle;
var angleB = b.Velocity.Direction - collisionAngle;
var vAx = a.Velocity.Magnitude * Math.Cos(angleA);
var vAy = a.Velocity.Magnitude * Math.Sin(angleA);
var vBx = b.Velocity.Magnitude * Math.Cos(angleB);
var vBy = b.Velocity.Magnitude * Math.Sin(angleB);
var vfAx = ((vAx * (a.Mass - b.Mass) + 2 * b.Mass * vBx) / (a.Mass + b.Mass)) * a.Material.Elasticity;
var vfBx = ((vBx * (b.Mass - a.Mass) + 2 * a.Mass * vAx) / (a.Mass + b.Mass)) * b.Material.Elasticity;
var vfAy = vAy * a.Material.Elasticity;
var vfBy = vBy * b.Material.Elasticity;
var magA = Math.Sqrt(Math.Pow(vfAx, 2) + Math.Pow(vfAy, 2));
var magB = Math.Sqrt(Math.Pow(vfBx, 2) + Math.Pow(vfBy, 2));
var dirA = Math.Atan2(vfAy, vfAx) + collisionAngle;
var dirB = Math.Atan2(vfBy, vfBx) + collisionAngle;
a.Velocity.X = magA * Math.Cos(dirA);
a.Velocity.Y = magA * Math.Sin(dirA);
b.Velocity.X = magB * Math.Cos(dirB);
b.Velocity.Y = magB * Math.Sin(dirB);
}
我尝试将不可移动物体的速度设置为与可移动物体的速度相反,但这会导致物体相互相位。
【问题讨论】:
-
您的“不可移动”对象有一个
Velocity,它可以更改。这与涉及移动的速度类似吗? -
我不这么认为。不动的物体不应该在相反的方向上施加相同的力吗? (我不完全确定您的问题是为了澄清还是您想引导我回答)
-
“不应该吗? 你有两个实体,
a和b。它们中的哪一个是不可移动的,你为什么要设置它的速度? -
a和b的代码适用于所有碰撞。它们都不必是不动的,但我需要添加一个案例来说明一个不动的情况。将问题更新为更具体。 -
这段代码一般有效吗?如果是这样,那么您可以通过将物体的质量设置得非常高来使物体不可移动(或不可驱动)。
标签: c# physics game-physics