我正在使用 C# 开发 2D 物理引擎。除了在碰撞期间解决旋转之外,我已经完成了所有工作。我有一个我认为是解决方案的解决方案,但它会导致物体疯狂地反弹并高速旋转。
我计算两点的相对速度如下:
Vector2 collisionPointVelocityA = bodyA.linearVelocity; + (bodyA.angularVelocity * collisionPointRadiusAPerpendicular);
Vector2 collisionPointVelocityB = bodyB.linearVelocity; +(bodyB.angularVelocity * collisionPointRadiusBPerpendicular);
//Relative velocity of bodyA's with respect to bodyB's collision-point velocity
collisionPointRelativeVelocityAtoB = collisionPointVelocityA - collisionPointVelocityB;
然后,我计算要对项目施加的冲动:
j = Vector2.Dot(-(1 + (bodyA.Restitution + bodyB.Restitution) * 0.5f) * collisionPointRelativeVelocityAtoB, collisionInfo.CollisionNormal)
/ (Vector2.Dot(collisionInfo.CollisionNormal, (collisionInfo.CollisionNormal * (bodyA.InverseMass + bodyB.InverseMass))));
并像这样对物体施加旋转力:
float torque = Vector2.Dot(parameter_Force, radiusVectorNormal) * radiusVector.Length();
并像这样添加扭矩:
angularVelocity += parameter_Torque * InverseInertia;
我认为这会由于角动量守恒而导致问题,但我一直坚持如何解决它。