The barycentric coordinate of the triangle we hit.
// 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)