我在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;
我认为这会因角动量守恒而导致问题,但我仍然坚持如何修复它。