版本:Unity 6 (6000.0)
语言英语
  • C#

RaycastHit.barycentricCoordinate

提出更改建议

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们会阅读用户提出的每项更改建议,并在适用时进行更新。

关闭

提交失败

由于某种原因,无法提交您的更改建议。请在几分钟后<a>重试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

public Vector3 barycentricCoordinate;

说明

我们命中的三角形的重心坐标。

这可让您沿 3 条轴插值其中任何一个顶点数据。

using UnityEngine;

public class Example : MonoBehaviour { // Attach this script to a camera and it will // draw a debug line pointing outward from the normal void Update() { // Only if we hit something, do we continue RaycastHit hit;

if (!Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit)) { return; }

// Just in case, also make sure the collider also has a renderer // material and texture 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.DrawLine Debug.DrawRay(hit.point, interpolatedNormal); } }