/// <summary> /// Find point-normal frame at ray-intersection point on mesh, or return false if no hit. /// Returns interpolated vertex-normal frame if available, otherwise tri-normal frame. /// </summary> public static bool RayHitPointFrame(DMesh3 mesh, ISpatial spatial, Ray3d ray, out Frame3f hitPosFrame, bool bForceFaceNormal = false) { hitPosFrame = new Frame3f(); int tid = spatial.FindNearestHitTriangle(ray); if (tid == DMesh3.InvalidID) { return(false); } var isect = TriangleIntersection(mesh, tid, ray); if (isect.Result != IntersectionResult.Intersects) { return(false); } Vector3d surfPt = ray.PointAt(isect.RayParameter); if (mesh.HasVertexNormals && bForceFaceNormal == false) { hitPosFrame = SurfaceFrame(mesh, tid, surfPt); // TODO isect has bary-coords already!! } else { hitPosFrame = new Frame3f(surfPt, mesh.GetTriNormal(tid)); } return(true); }
public bool RayIntersect(Ray3d ray, out Vector3d vHit, out Vector3d vHitNormal) { vHit = Vector3d.Zero; vHitNormal = Vector3d.AxisX; int tHitID = Spatial.FindNearestHitTriangle(ray); if (tHitID == DMesh3.InvalidID) { return(false); } IntrRay3Triangle3 t = MeshQueries.TriangleIntersection(Mesh, tHitID, ray); vHit = ray.PointAt(t.RayParameter); if (UseFaceNormal == false && Mesh.HasVertexNormals) { vHitNormal = Mesh.GetTriBaryNormal(tHitID, t.TriangleBaryCoords.x, t.TriangleBaryCoords.y, t.TriangleBaryCoords.z); } else { vHitNormal = Mesh.GetTriNormal(tHitID); } return(true); }