/// <summary> /// convenience function to construct a IntrRay3Triangle3 object for a mesh triangle /// </summary> public static IntrRay3Triangle3 TriangleIntersection(DMesh3 mesh, int ti, Ray3d ray) { if (!mesh.IsTriangle(ti)) { return(null); } Triangle3d tri = new Triangle3d(); mesh.GetTriVertices(ti, ref tri.V0, ref tri.V1, ref tri.V2); IntrRay3Triangle3 q = new IntrRay3Triangle3(ray, tri); q.Find(); return(q); }
public static int FindHitTriangle_LinearSearch(DMesh3 mesh, Ray3d ray) { int tNearestID = DMesh3.InvalidID; double fNearestT = double.MaxValue; var tri = new Triangle3d(); foreach (int ti in mesh.TriangleIndices()) { // [TODO] optimize this mesh.GetTriVertices(ti, ref tri.V0, ref tri.V1, ref tri.V2); var ray_tri_hit = new IntrRay3Triangle3(ray, tri); if (ray_tri_hit.Find()) { if (ray_tri_hit.RayParameter < fNearestT) { fNearestT = ray_tri_hit.RayParameter; tNearestID = ti; } } } return(tNearestID); }
void find_hit_triangle(int iBox, ref Ray3d ray, ref double fNearestT, ref int tID) { int idx = box_to_index[iBox]; if (idx < triangles_end) // triange-list case, array is [N t1 t2 ... tN] { Triangle3d tri = new Triangle3d(); int num_tris = index_list[idx]; for (int i = 1; i <= num_tris; ++i) { int ti = index_list[idx + i]; // [TODO] optimize this mesh.GetTriVertices(ti, ref tri.V0, ref tri.V1, ref tri.V2); IntrRay3Triangle3 ray_tri_hit = new IntrRay3Triangle3(ray, tri); if (ray_tri_hit.Find()) { if (ray_tri_hit.RayParameter < fNearestT) { fNearestT = ray_tri_hit.RayParameter; tID = ti; } } } } else // internal node, either 1 or 2 child boxes { double e = MathUtil.ZeroTolerancef; int iChild1 = index_list[idx]; if (iChild1 < 0) // 1 child, descend if nearer than cur min-dist { iChild1 = (-iChild1) - 1; double fChild1T = box_ray_intersect_t(iChild1, ray); if (fChild1T <= fNearestT + e) { find_hit_triangle(iChild1, ref ray, ref fNearestT, ref tID); } } else // 2 children, descend closest first { iChild1 = iChild1 - 1; int iChild2 = index_list[idx + 1] - 1; double fChild1T = box_ray_intersect_t(iChild1, ray); double fChild2T = box_ray_intersect_t(iChild2, ray); if (fChild1T < fChild2T) { if (fChild1T <= fNearestT + e) { find_hit_triangle(iChild1, ref ray, ref fNearestT, ref tID); if (fChild2T <= fNearestT + e) { find_hit_triangle(iChild2, ref ray, ref fNearestT, ref tID); } } } else { if (fChild2T <= fNearestT + e) { find_hit_triangle(iChild2, ref ray, ref fNearestT, ref tID); if (fChild1T <= fNearestT + e) { find_hit_triangle(iChild1, ref ray, ref fNearestT, ref tID); } } } } } }