bool is_back_facing(int tid) { Vector3d n = PreviewMesh.GetTriNormal(tid); Vector3d c = PreviewMesh.GetTriCentroid(tid); return((c - cameraFrameL.Origin).Dot(n) > -0.1); }
public bool FindHitTriangle(Ray3f sceneRay, bool snap_to_center, ref Frame3f hitFrameS, ref int hitTID) { Ray3f objRay = SceneTransforms.SceneToObject(Target, sceneRay); hitTID = PreviewSpatial.FindNearestHitTriangle(objRay); if (hitTID == DMesh3.InvalidID) { return(false); } if (allow_backface_hits == false && is_back_facing(hitTID)) { return(false); } var intr = MeshQueries.TriangleIntersection(PreviewMesh, hitTID, objRay); if (snap_to_center) { Frame3f hitFrameL = new Frame3f(PreviewMesh.GetTriCentroid(hitTID), PreviewMesh.GetTriNormal(hitTID)); hitFrameS = SceneTransforms.ObjectToScene(previewSO, hitFrameL); } else { Vector3f hitPoint = objRay.PointAt((float)intr.RayParameter); Frame3f hitFrameL = new Frame3f(hitPoint, PreviewMesh.GetTriNormal(hitTID)); hitFrameS = SceneTransforms.ObjectToScene(previewSO, hitFrameL); } return(true); }