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
class example(MonoBehaviour):
def Update():
hit as RaycastHit
if not Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), hit):
return
meshCollider as MeshCollider = hit.collider
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)