public Vector3 barycentricCoordinate;
Описание
Барицентрическая координата треугольника, в который мы попали.
Это позволяет интерполировать любые данные вершин по трем осям.
using UnityEngine;
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;
// Extract local space normals of the triangle we hit
Vector3 n0 = normals[triangles[hit.triangleIndex * 3 + 0]];
Vector3 n1 = normals[triangles[hit.triangleIndex * 3 + 1]];
Vector3 n2 = normals[triangles[hit.triangleIndex * 3 + 2]];
// interpolate using the barycentric coordinate of the hitpoint
Vector3 baryCenter = hit.barycentricCoordinate;
// Use barycentric coordinate to interpolate normal
Vector3 interpolatedNormal = n0 * baryCenter.x + n1 * baryCenter.y + n2 * baryCenter.z;
// normalize the interpolated normal
interpolatedNormal = interpolatedNormal.normalized;
// Transform local space normals to world space
Transform hitTransform = hit.collider.transform;
interpolatedNormal = hitTransform.TransformDirection(interpolatedNormal);
// Display with Debug.DrawLineDebug.DrawRay(hit.point, interpolatedNormal);
}
}