public bool ScreenHitTest(Vector2 screenPosition, out MRHitTestResult result, MRHitTestResultTypes types = MRHitTestResultTypes.Any)
        {
            if (m_Camera == null)
            {
                result = default;
                return(false);
            }

            var ray = m_Camera.ScreenPointToRay(screenPosition);

            return(Raycast(ray, out result, types));
        }
Esempio n. 2
0
        public bool WorldHitTest(Ray ray, out MRHitTestResult result, MRHitTestResultTypes types = MRHitTestResultTypes.Any)
        {
            if (m_ARRaycastManager == null)
            {
                result = default(MRHitTestResult);
                return(false);
            }

            k_Hits.Clear();
            if (m_ARRaycastManager.Raycast(ray, k_Hits, HitTestResultTypeToTrackableType(types)))
            {
                foreach (var hit in k_Hits)
                {
                    result = hit.ToMRHitTestResult();
                    return(true);
                }
            }

            result = new MRHitTestResult();
            return(false);
        }
 /// <summary>
 /// Perform a world-based hit test against MR feature points.
 /// </summary>
 /// <param name="ray">The ray to test</param>
 /// <param name="result">The result of the hit test</param>
 /// <param name="types">The types of results to test against</param>
 /// <returns>Whether the test succeeded</returns>
 public static bool WorldHitTestHitTest(this IUsesMRHitTesting obj, Ray ray,
                                        out MRHitTestResult result, MRHitTestResultTypes types = MRHitTestResultTypes.Any)
 {
     return(obj.provider.WorldHitTest(ray, out result, types));
 }
 /// <summary>
 /// Perform a screen-based hit test against MR data
 /// </summary>
 /// <param name="screenPosition">The screen position from which test will originate</param>
 /// <param name="result">The result of the hit test</param>
 /// <param name="types">The types of results to test against</param>
 /// <returns>Whether the test succeeded</returns>
 public static bool ScreenHitTest(this IUsesMRHitTesting obj, Vector2 screenPosition,
                                  out MRHitTestResult result, MRHitTestResultTypes types = MRHitTestResultTypes.Any)
 {
     return(obj.provider.ScreenHitTest(screenPosition, out result, types));
 }
        bool Raycast(Ray ray, out MRHitTestResult result, MRHitTestResultTypes types)
        {
            if (!m_Enabled)
            {
                result = default;
                return(false);
            }

            if (types.HasFlag(MRHitTestResultTypes.HorizontalPlane) || types.HasFlag(MRHitTestResultTypes.VerticalPlane))
            {
                this.GetPlanes(m_Planes);
                var checkAllOrientations = types.HasFlag(MRHitTestResultTypes.Plane);
                var checkHorizontal      = types.HasFlag(MRHitTestResultTypes.HorizontalPlane);
                var checkVertical        = types.HasFlag(MRHitTestResultTypes.VerticalPlane);
                foreach (var marsPlane in m_Planes)
                {
                    if (!checkAllOrientations)
                    {
                        // Test orientation
                        var normal = marsPlane.pose.up;
                        if (checkHorizontal &&
                            (marsPlane.alignment & (MarsPlaneAlignment.HorizontalUp | MarsPlaneAlignment.HorizontalDown)) == 0)
                        {
                            continue;
                        }
                        if (checkVertical && !marsPlane.alignment.HasFlag(MarsPlaneAlignment.Vertical))
                        {
                            continue;
                        }
                    }

                    var plane = new Plane(marsPlane.pose.up, marsPlane.pose.position);
                    if (plane.Raycast(ray, out var distance))
                    {
                        var worldSpacePoint = ray.GetPoint(distance);
                        var planeSpacePoint =
                            Quaternion.Inverse(marsPlane.pose.rotation) * (worldSpacePoint - marsPlane.pose.position);
                        if (GeometryUtils.PointInPolygon(planeSpacePoint, marsPlane.vertices))
                        {
                            result      = new MRHitTestResult();
                            result.pose = new Pose(ray.GetPoint(distance), marsPlane.pose.rotation);
                            return(true);
                        }
                    }
                }
            }

            if (types.HasFlag(MRHitTestResultTypes.FeaturePoint))
            {
                var points = this.GetPoints();
                foreach (var pointCloud in points.Values)
                {
                    foreach (var p in pointCloud.Positions)
                    {
                        // Ray-sphere intersection
                        var eo   = p - ray.origin;
                        var v    = Vector3.Dot(eo, ray.direction);
                        var disc = k_PointDistanceThresholdSquared - (Vector3.Dot(eo, eo) - v * v);
                        if (disc >= 0)
                        {
                            result      = new MRHitTestResult();
                            result.pose = new Pose(p, Quaternion.identity);
                            return(true);
                        }
                    }
                }
            }

            result = default;
            return(false);
        }
 public bool WorldHitTest(Ray ray, out MRHitTestResult result, MRHitTestResultTypes types = MRHitTestResultTypes.Any)
 {
     return(Raycast(ray, out result, types));
 }