RaycastHit.barycentricCoordinate
var barycentricCoordinate: Vector3;
Vector3 barycentricCoordinate;
barycentricCoordinate as Vector3
Description

The barycentric coordinate of the triangle we hit.

This lets you interpolate any of the vertex data along the 3 axes.
	// Attach this script to a camera and it will 
	// draw a debug line pointing outward from the normal 
	function Update () { 
	   // Only if we hit something, do we continue 
	   var hit : RaycastHit; 
	   if (!Physics.Raycast (Camera.main.ScreenPointToRay(Input.mousePosition), hit)) 
	      return; 

// Just in case, also make sure the collider also has a renderer // material and texture var meshCollider = hit.collider as MeshCollider; if (meshCollider == null || meshCollider.sharedMesh == null) return;

var mesh : Mesh = meshCollider.sharedMesh; var normals = mesh.normals; var triangles = mesh.triangles;

// Extract local space normals of the triangle we hit var n0 = normals[triangles[hit.triangleIndex * 3 + 0]]; var n1 = normals[triangles[hit.triangleIndex * 3 + 1]]; var n2 = normals[triangles[hit.triangleIndex * 3 + 2]]; // interpolate using the barycentric coordinate of the hitpoint var baryCenter = hit.barycentricCoordinate;

// Use barycentric coordinate to interpolate normal var interpolatedNormal = n0 * baryCenter.x + n1 * baryCenter.y + n2 * baryCenter.z; // normalize the interpolated normal interpolatedNormal = interpolatedNormal.normalized; // Transform local space normals to world space var hitTransform : Transform = hit.collider.transform; interpolatedNormal = hitTransform.TransformDirection(interpolatedNormal);

// Display with Debug.DrawLine Debug.DrawRay(hit.point, interpolatedNormal); }
using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    void Update() {
        RaycastHit hit;
        if (!Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
            return;
        
        MeshCollider meshCollider = hit.collider as MeshCollider;
        if (meshCollider == null || meshCollider.sharedMesh == null)
            return;
        
        Mesh mesh = meshCollider.sharedMesh;
        Vector3[] normals = mesh.normals;
        int[] triangles = mesh.triangles;
        Vector3 n0 = normals[triangles[hit.triangleIndex * 3 + 0]];
        Vector3 n1 = normals[triangles[hit.triangleIndex * 3 + 1]];
        Vector3 n2 = normals[triangles[hit.triangleIndex * 3 + 2]];
        Vector3 baryCenter = hit.barycentricCoordinate;
        Vector3 interpolatedNormal = n0 * baryCenter.x + n1 * baryCenter.y + n2 * baryCenter.z;
        interpolatedNormal = interpolatedNormal.normalized;
        Transform hitTransform = hit.collider.transform;
        interpolatedNormal = hitTransform.TransformDirection(interpolatedNormal);
        Debug.DrawRay(hit.point, interpolatedNormal);
    }
}
import UnityEngine
import System.Collections

public class Example(MonoBehaviour):

	def Update() as void:
		hit as RaycastHit
		if not Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), ):
			return
		meshCollider as MeshCollider = (hit.collider as MeshCollider)
		if (meshCollider == null) or (meshCollider.sharedMesh == null):
			return
		mesh as Mesh = meshCollider.sharedMesh
		normals as (Vector3) = mesh.normals
		triangles as (int) = mesh.triangles
		n0 as Vector3 = normals[triangles[((hit.triangleIndex * 3) + 0)]]
		n1 as Vector3 = normals[triangles[((hit.triangleIndex * 3) + 1)]]
		n2 as Vector3 = normals[triangles[((hit.triangleIndex * 3) + 2)]]
		baryCenter as Vector3 = hit.barycentricCoordinate
		interpolatedNormal as Vector3 = (((n0 * baryCenter.x) + (n1 * baryCenter.y)) + (n2 * baryCenter.z))
		interpolatedNormal = interpolatedNormal.normalized
		hitTransform as Transform = hit.collider.transform
		interpolatedNormal = hitTransform.TransformDirection(interpolatedNormal)
		Debug.DrawRay(hit.point, interpolatedNormal)