3
我正在創建一個2D物理引擎,並且遇到可移動和不可移動對象之間的某種類型的碰撞問題。我的意思是可移動的是(x,y)值可以改變,而不是參考框架可以或不可以改變。如何解決與不可移動物體的2D碰撞?
例如,一個碰到牆上的球會是可移動的與某些不動的東西碰撞的東西。
我相信,我需要使用類似普通部隊在這種情況下,但我不知道如何將用來查找碰撞的結果。
這是我到目前爲止的代碼。此代碼是兩個移動實體之間的碰撞,但我需要補充的情況下,當一個人不動了:
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',這可以改變。這就像是涉及移動的速度嗎? – Beta
我不這麼認爲。不動的物體不應該在相反的方向上施加相同的力量嗎? (我不完全確定你的問題是爲了澄清,還是如果你想引導我回答) –
*「不應該?*你有兩個實體,'a'和'b'。哪一個是不動的,你爲什麼要設置它的速度? – Beta