F = ma或a = F / m。计算球体和平面之间的碰撞点。通常是球体中心-法线*半径。如果需要更高的精度,请计算球体穿透平面的距离,然后调整计算。当然,这在很大程度上是可选的,除非您想要真正精确的物理。现在计算沿法线的相对速度。对于静态平面,这是:Vball DotN。然后将VballDotN乘以-1,然后乘以质量。在现阶段的物理学中,您还可以将其乘以恢复系数(反弹系数)。将此标量乘以N,即可得到所需的力。
调整Vball时,再次将力除以质量,便得到最终的加速度,因此只需将其加到速度上,便得到最终的碰撞后速度。
vec3 Vrel = Ball.getVelocity();
float vDotN = Vrel.Dot(CollisionNormal);
vec3 F = -(1.0f+Ball.getRestitution())*vDotN;
F*=Ball.getMass();
Ball.accelerate(F/Ball.getMass());
该方法对于碰撞响应的公式是准确的。如果您想要更高的准确性,则需要考虑摩擦,这将导致球旋转,但是我不知道您是否希望在比赛中这么做。如果这样做,这是计算切向力的方式:
vec3 Ft = -(Ball.getvelocity()+(vDotN*CollisionNormal));
Ft*=Ball.getKineticFriction()+Wall.getKineticFriction(); //you could fudge these numbers
Ft*=Ball.getMass();
vec3 vec2Centre = Ball.getPosition()-ContactPoint;
vec3 Torque = cross(vec2Centre,Ft);
Ball.AngularAccelerate(Torque/Ball.getMomentofInertia(glm::normalize(Torque)));
确保在应用任何线性效应之前计算Ft,否则摩擦将不准确。