How to get collision point when using onTriggerEnter

I have a number of colliders attached to isKinematic=true rigidbodies as I do not want physics to affect my objects. I am using triggers to detect collisions between the colliders and this works fine. I was wondering if it is possible to determine the collision point (Vector3) and normal using triggers? onTriggerEnter takes a Collider instead of a Collision as a parameter. If this is not possible what would be the best way to have my objects not being affected by physics in anyway yet be able to detect collisions and the point of collision as well?

i accomplished this task using a Raycast upon collision (or colliderEnter) event.

OnTriggerEnter(Collider other){

     RaycastHit hit;
        if (Physics.Raycast(transform.position, transform.forward, out hit))
        {
            Debug.Log("Point of contact: "+hit.point);
        }
}

On this topic because of google, hope this will help future users. I used the @Sdgd method, but there is no need to use radius to me, the following code is applied on a “shield” objet. I instantiante an impact prefab (containing particles) at the collision point and tell the bullet to die.

This code is in Monobehaviour of my object, having SphereCollider Component, without Rigidbody as player bullets already have kinematic ones. This can work with any kind of collider I guess (sphere or box). This code is for whom wants to use kinematic rigidbodies with trigger colliders (as OnCollisionEnter() doesn’t care about them).

The only part that is doing the job are these two lines (all Vector3s) :
tmpDirection = (col.transform.position - myTransf.position);
tmpContactPoint = myTransf.position + tmpDirection;

The rest of the code is for context…

	private Vector3 tmpContactPoint;
	private Vector3 tmpDirection;
	private GameObject tmpGamob;
	private Transform myTransf;

void Start() {
		myTransf = transform;
	}
void OnTriggerEnter(Collider col) {
		if (col.tag !="PlayerBullet") return;
		tmpDirection = (col.transform.position - myTransf.position);
		tmpContactPoint = myTransf.position + tmpDirection;
		col.GetComponent<BulletControl> ().Die ();
		tmpGamob= (GameObject)Instantiate(impactBouclier, tmpContactPoint,Quaternion.identity);
		Destroy (tmpGamob, 0.3f);
	}

Depending on how big your objects are, you might get away with just using other.transform.position. I use this for playing a splash particle effect when my player hits water and it looks pretty good.

Here’s my solution. Only works with a box collider.

localCollider.ClosestPointOnBounds(target.transform.position) does an okay job but is AABB based.

        void OnTriggerEnter(Collider target)
        {
            //print("TouchDamage trigger with " + collider.name);

            var damageable = target.gameObject.GetComponent<Damageable>();
            if (damageable != null)
            {
                var localCollider = GetComponent<BoxCollider>();
                if (localCollider != null)
                {
                    if (CheckEdge(target, damageable, BottomRightEdge(localCollider)))
                        return;
                    if (CheckEdge(target, damageable, TopRightEdge(localCollider)))
                        return;
                    if (CheckEdge(target, damageable, BottomLeftEdge(localCollider)))
                        return;
                    if (CheckEdge(target, damageable, TopLeftEdge(localCollider)))
                        return;

                    CollideWith(target, localCollider.ClosestPointOnBounds(target.transform.position), damageable);
                }
                else
                    CollideWith(target, transform.position, damageable);
            }
        }

        bool CheckEdge(Collider target, Damageable damageable, Ray edge)
        {
            foreach (var hit in Physics.RaycastAll(edge, edge.direction.magnitude))
            {
                if (hit.collider == target)
                {
                    CollideWith(target, hit.point, damageable);
                    return true;
                }
            }
            return false;
        }

        Ray BottomRightEdge(BoxCollider collider)
        {
            var bottomRight = transform.TransformPoint(collider.center + new Vector3(collider.size.x, -collider.size.y, collider.size.z) * 0.5f);
            var topRight = transform.TransformPoint(collider.center + new Vector3(collider.size.x, collider.size.y, collider.size.z) * 0.5f);
            return new Ray(bottomRight, topRight - bottomRight);
        }

        Ray TopRightEdge(BoxCollider collider)
        {
            var bottomRight = transform.TransformPoint(collider.center + new Vector3(collider.size.x, -collider.size.y, -collider.size.z) * 0.5f);
            var topRight = transform.TransformPoint(collider.center + new Vector3(collider.size.x, collider.size.y, -collider.size.z) * 0.5f);
            return new Ray(bottomRight, topRight - bottomRight);
        }

        Ray BottomLeftEdge(BoxCollider collider)
        {
            var bottomLeft = transform.TransformPoint(collider.center + new Vector3(-collider.size.x, -collider.size.y, collider.size.z) * 0.5f);
            var topLeft = transform.TransformPoint(collider.center + new Vector3(-collider.size.x, collider.size.y, collider.size.z) * 0.5f);
            return new Ray(bottomLeft, topLeft - bottomLeft);
        }

        Ray TopLeftEdge(BoxCollider collider)
        {
            var bottomLeft = transform.TransformPoint(collider.center + new Vector3(-collider.size.x, -collider.size.y, -collider.size.z) * 0.5f);
            var topLeft = transform.TransformPoint(collider.center + new Vector3(-collider.size.x, collider.size.y, -collider.size.z) * 0.5f);
            return new Ray(bottomLeft, topLeft - bottomLeft);
        }

        void OnDrawGizmosSelected()
        {
            BoxCollider b = GetComponent<BoxCollider>();
            if (b != null)
            {
                Gizmos.color = Color.red;
                Gizmos.DrawRay(BottomRightEdge(b));
                Gizmos.DrawRay(TopRightEdge(b));
                Gizmos.DrawRay(BottomLeftEdge(b));
                Gizmos.DrawRay(TopLeftEdge(b));
            }
        }

This should do it in most cases and should be cheaper than a raycast:

private void OnTriggerEnter2D(Collider2D collision)
{
    Vector2 point = collision.ClosestPoint(transform.position);
}

Surely col.gameObject.transform.position is the simplest solution for the hit point.

To get the normal, Surely these will work for you:

2D -col.gameObject.transform.up

3D -col.gameObject.transform.forward