Head on collision vs skinning the wall.

Trying to get the force of an impact in a low altitude racing game. I wish to make my collision detection more robust. RIght now I get the same magnitude returned regaurdless of the colliding objects attack angle.

I am using:

function OnCollisionEnter(collision : Collision) {
    if (collision.relativeVelocity.magnitude > 16){
    // go boom
   } else {
    // make sparks
   }
}

It detecects collision and things blow up well.

However when a collision is very shallow in angle it is still detected as big collision, not as sliding down the wall. I recieve the same relativeVelocity.magnitude for hitting a wall head on as for glancing it with at a very light attack angle. How should someone calculate collision magnitude adjusted for the angle of the incoming force.

EDIT: this is working, thanks to efge's answer:

function OnCollisionEnter(collision : Collision) {
    var tempCount=0;
    var angleTot=0;
    var damageTot=0;
    for (var contact : ContactPoint in collision.contacts) {
        // finds the avrg of the difference of the angles of 
        // the Contact points from our transform's forward
        tempCount++;
        var angle = Vector3.Angle(contact.normal, transform.forward);
        angleTot+=angle;
        damageTot+=collision.relativeVelocity.magnitude;
    }
    Debug.Log ("avg angle:"+angleTot/tempCount+"  avg force:"+damageTot/tempCount+"  Adjusted force:"+damageTot/tempCount*angleTot/tempCount/180);
    //blow up or not based on adjusted force
}

it might be better to calculate baced on traveling direction (forces) than player rotation, but this feels good.

You could compare the ContactPoint.normal with the driving direction (or the velocity vector of the rigidbody).


Edit:

In the function OnCollisionEnter you could use Collision.relativeVelocity and ContactPoint.normal.

Maybe you have to normalize the vectors to set its length to 1.0.