public void UpdateMeasurePoint(Vector3d point, CoordSpace eSpace, int nPointNum, bool isFixedPoint = true) { if (eSpace == CoordSpace.ObjectCoords) { throw new NotSupportedException("TwoPointMeasureTool.UpdateMeasurePoint"); } Vector3d pointS = (eSpace == CoordSpace.SceneCoords) ? point : scene.ToSceneP(point); int i = MathUtil.Clamp(nPointNum, 0, 1); setPointsS[i] = pointS; snappedPointsS[i] = setPointsS[i]; point_initialized[i] = true; if (isFixedPoint) { return; } // snap List <SceneObject> targets = (SpecificTargets != null) ? SpecificTargets : new List <SceneObject>(scene.SceneObjects); float fAvgSnapDist = 0; int avgcount = 0; foreach (var so in targets) { fAvgSnapDist += VRUtil.GetVRRadiusForVisualAngle(so.GetLocalFrame(CoordSpace.WorldCoords).Origin, scene.ActiveCamera.GetPosition(), snapThresholdAngle); avgcount++; } if (avgcount == 0) { return; } fAvgSnapDist /= avgcount; SORayHit nearestW; Vector3d pointW = (eSpace == CoordSpace.WorldCoords) ? point : scene.ToWorldP(point); if (SceneUtil.FindNearestPoint(targets, pointW, fAvgSnapDist, out nearestW, CoordSpace.WorldCoords)) { snappedPointsS[i] = scene.ToSceneP(nearestW.hitPos); } }