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)); }
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)); }