Пример #1
0
        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);
            }
        }