我一直在尝试复制此处找到的系统:http ://www.myphysicslab.com/collision.html
到目前为止,这是我的代码(对于击中无限大物体的情况,例如不可移动的墙):
public static Orientation collide( float bodyMass_1, float bodyVelocityX_1, float bodyVelocityY_1, float bodyAngleMomentum_1 , float pointXFromCenterX_1,
float pointYFromCenterY_1, float momentOfInertia_1,
float edgeNormalX, float edgeNormalY, float elasticity )
{
Orientation returning;
float outAngleMomentum_1;
float outVelocityX_1, outVelocityY_1;
float relativeNormal;
float deltaParameter;
float pointVelocityX_1, pointVelocityY_1;
pointVelocityX_1 = bodyVelocityX_1 - bodyAngleMomentum_1 * pointYFromCenterY_1;
pointVelocityY_1 = bodyVelocityY_1 + bodyAngleMomentum_1 * pointXFromCenterX_1;
System.out.println( edgeNormalX );
System.out.println( edgeNormalY );
relativeNormal = (float) Funct3D.dotProduct( pointVelocityX_1, pointVelocityY_1,edgeNormalX, edgeNormalY );
if ( relativeNormal < 0 )
{
deltaParameter = (-(1 + elasticity) *( (float) Funct3D.dotProduct( pointVelocityX_1, pointVelocityY_1, edgeNormalX, edgeNormalY ) ))/
( 1/bodyMass_1 + Funct3D.sqr( (float) Funct3D.perpDotProduct(pointXFromCenterX_1,pointYFromCenterY_1,edgeNormalX,edgeNormalY)) / momentOfInertia_1 );
outVelocityX_1 = bodyVelocityX_1 + deltaParameter * edgeNormalX / bodyMass_1;
outVelocityY_1 = bodyVelocityY_1 + deltaParameter * edgeNormalY / bodyMass_1;
outAngleMomentum_1 = bodyAngleMomentum_1 + (float) Funct3D.perpDotProduct(pointXFromCenterX_1, pointYFromCenterY_1, deltaParameter*edgeNormalX, deltaParameter*edgeNormalY ) / momentOfInertia_1;
returning = new Orientation( outVelocityX_1, outVelocityY_1, outAngleMomentum_1 );
}
else
{
System.out.println( "NO COLLISION" );
returning = new Orientation( bodyVelocityX_1, bodyVelocityY_1, bodyAngleMomentum_1 );
}
return returning;
}
我的代码的结果通常导致速度没有通过法线反映,或者完全缺乏动量守恒。即使我有它只是让它在执行后立即输出结果,结果表明它不是多次注册碰撞的问题,它也会在第一次运行时发生。
dotProduct
返回两个向量的点积。
perpDotProduct
返回两个向量的 perp 点积
如果您需要任何解释,或者如果您想请求扩大代码范围,请随时提出。