public CustomHitInfo GlobalClosestHit(Vector3 position) { Mesh mesh = mf.sharedMesh; Vector3[] vertices = mesh.vertices; int[] triangles = mesh.triangles; Vector3 positionModelSpace = mf.gameObject.transform.InverseTransformPoint(position); int vertexIdx = kdTree.nearest(positionModelSpace); float minDistance = 100000f; CustomHitInfo hit = new CustomHitInfo(); hit.point = mf.gameObject.transform.TransformPoint(vertices[vertexIdx]); foreach (var triangleIdx in vertexToTriangle[vertexIdx]) { Vector3 a = vertices[triangles[3 * triangleIdx]]; Vector3 b = vertices[triangles[3 * triangleIdx + 1]]; Vector3 c = vertices[triangles[3 * triangleIdx + 2]]; Vector3 s = ClosestPointOnTriangle(a, b, c, positionModelSpace); float distance = Vector3.Distance(s, positionModelSpace); if (distance < minDistance) { minDistance = distance; hit.point = mf.gameObject.transform.TransformPoint(s); Vector3 n = Vector3.Cross(b - a, c - a); n.Normalize(); hit.normal = n; hit.triangleIndex = triangleIdx; } } hit.collider = mc; hit.success = true; return(hit); }
public bool Raycast(CustomRay ray, out CustomHitInfo hitInfo, int maxDistance) { hitInfo = new CustomHitInfo(); // TODO: Write raycast function /* * for (int i = 0; i < 3; ++i) * { * float invD = 1/ray.m_direction[i]; * float t0 = (i - ray.m_origin[i])*invD; * } */ return(true); }
public CustomHitInfo LocalClosestHit(Vector3 position) { if (tOld == -1) { CustomHitInfo hitInfo = GlobalClosestHit(position); tOld = hitInfo.triangleIndex; return(hitInfo); } Mesh mesh = mf.sharedMesh; int[] visited = new int[mesh.triangles.Length / 3]; Vector3 positionModelSpace = mf.gameObject.transform.InverseTransformPoint(position); CustomHitInfo hit = new CustomHitInfo(); Vector3 a = mesh.vertices[mesh.triangles[3 * tOld]]; Vector3 b = mesh.vertices[mesh.triangles[3 * tOld + 1]]; Vector3 c = mesh.vertices[mesh.triangles[3 * tOld + 2]]; Vector3 s = ClosestPointOnTriangle(a, b, c, positionModelSpace); hit.point = mf.gameObject.transform.TransformPoint(s); float minDistance = 10000f; List <int> trianglesInCurRing = new List <int>(); List <int> trianglesInNextRing = new List <int>(); trianglesInCurRing.Add(tOld); int count = 0; while (true) { bool gettingCloser = false; foreach (int triangleIdx in trianglesInCurRing) { visited[triangleIdx] = 1; a = mesh.vertices[mesh.triangles[3 * triangleIdx]]; b = mesh.vertices[mesh.triangles[3 * triangleIdx + 1]]; c = mesh.vertices[mesh.triangles[3 * triangleIdx + 2]]; s = ClosestPointOnTriangle(a, b, c, positionModelSpace); float distance = Vector3.Distance(s, positionModelSpace); if (distance < minDistance) { gettingCloser = true; if (count >= 1) { Debug.Log("rings away"); Debug.Log(count); } minDistance = distance; hit.point = mf.gameObject.transform.TransformPoint(s); Vector3 n = Vector3.Cross(b - a, c - a); n.Normalize(); hit.normal = n; hit.triangleIndex = triangleIdx; } AddTrianglesToRing(trianglesInNextRing, triangleIdx, visited); } trianglesInCurRing = trianglesInNextRing; trianglesInNextRing = new List <int>(); if (!gettingCloser) { break; } count++; } hit.collider = mc; tOld = hit.triangleIndex; hit.success = true; return(hit); }