private void OnDevicePoseStatusChanged(TrackableBehaviour.Status arg1, TrackableBehaviour.StatusInfo arg2) { sessionInfoString = $"OnDevicePoseStatusChanged: {arg1} - {arg2}"; Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", sessionInfoString, DebugMode); if (arg1 != TrackableBehaviour.Status.NO_POSE) { if (!trackingStarted) { trackingStarted = true; Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", "Tracking Started!.", DebugMode); trackingStartedCallback?.Invoke(); } else if (currentStatus == TrackableBehaviour.Status.NO_POSE) { Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", "Tracking Restored!", DebugMode); trackingRestoredCallback?.Invoke(); } if (onAfterReset != null) { Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", "Emitting 'OnAfterReset' event.", DebugMode); onAfterReset.Invoke(); onAfterReset = null; } } else if (currentStatus != TrackableBehaviour.Status.NO_POSE) { Logger.LogFromMethod("VuforiaSessionManager", "OnDevicePoseStatusChanged", "Tracking Lost!", DebugMode); trackingLostCallback?.Invoke(); } currentStatus = arg1; }
private void Start() { planeFinderBehaviour = FindObjectOfType <PlaneFinderBehaviour>(); mainCamera = ARLocationManager.Instance.MainCamera; if (planeFinderBehaviour == null) { Logger.WarnFromMethod("VuforiaGroundHeight", "Start", "No planeFinderBehaviour!"); } if (Settings.UseArLocationConfigSettings) { Settings.MaxGroundHeight = ARLocation.Config.MaxGroundHeight; Settings.MinGroundHeight = ARLocation.Config.MinGroundHeight; Settings.InitialGroundHeightGuess = ARLocation.Config.InitialGroundHeightGuess; Settings.MinHitDistance = ARLocation.Config.VuforiaGroundHitTestDistance; Settings.Smoothing = ARLocation.Config.GroundHeightSmoothingFactor; } state.CurrentGroundY = -Settings.InitialGroundHeightGuess; planeFinderBehaviour.Height = Settings.InitialGroundHeightGuess; planeFinderBehaviour.HitTestMode = HitTestMode.AUTOMATIC; planeFinderBehaviour.OnAutomaticHitTest.AddListener(HitTestHandler); planeFinderBehaviour.OnInteractiveHitTest.AddListener(HitTestHandler); UpdateObjectHeight(); }
private void HitTestHandler(HitTestResult result) { //Logger.LogFromMethod("VuforiaGroundHeight", "HitTestHandler", $"result.Position = {result.Position}"); // If the ground height is not in range, reject var height = -1.0f * result.Position.y; if (!(height > Settings.MinGroundHeight) && (height < Settings.MaxGroundHeight)) { //Logger.LogFromMethod("VuforiaGroundHeight", "HitTestHandler", $"Not in range: {result.Position.y} {height}) > {Settings.MinGroundHeight}"); return; } var distanceToObject = MathUtils.HorizontalDistance(transform.position, result.Position); // If hit to close to previous hit do nothing if (state.CurrentPlaneDistance >= 0 && distanceToObject <= Settings.MinHitDistance) { //Logger.LogFromMethod("VuforiaGroundHeight", "HitTestHandler", $"Too close :{distanceToObject}"); return; } // If there is no previous hit, or if the new hit is closes to the object, apply new // hit point. if (state.CurrentPlaneDistance < 0 || distanceToObject < state.CurrentPlaneDistance) { state.CurrentPlaneDistance = distanceToObject; state.CurrentGroundY = result.Position.y; state.NeedsUpdate = true; UpdateObjectHeight(); Logger.LogFromMethod("VuforiaGroundHeight", "HitTestHandler", $"New ground Y = {state.CurrentGroundY}"); } }