private void UpdatePositioned() { GeoArithmetic.GeoCoordinates currentOrigin = GetCurrentGeoCoordinates(); foreach (GeoPositioned positionedObject in positionedObjects) { UpdatePositioned(positionedObject, currentOrigin); } }
private void UpdatePositioned(GeoPositioned posed, GeoArithmetic.GeoCoordinates currentOrigin) { double latOff = posed.GeoCoordinates.latitude - currentOrigin.latitude; double lonOff = posed.GeoCoordinates.longitude - currentOrigin.longitude; Vector3 transformPosition = posed.transform.position; if (Debug) { transformPosition.z = arCoreCam.transform.position.z; transformPosition.x = arCoreCam.transform.position.x; } else { transformPosition.z = (float)(latOff * Scale); transformPosition.x = (float)(lonOff * Scale); } posed.transform.position = transformPosition; var infoMsg = string.Format("Updated GeoPos {0},{1}) @ {2},{3}, with O={4},{5} @ {6},{7}", posed.GeoCoordinates.latitude, posed.GeoCoordinates.longitude, transformPosition.z, transformPosition.x, currentOrigin.latitude, currentOrigin.longitude, arCoreCam.transform.position.z, arCoreCam.transform.position.x); logger.Debug(infoMsg); UIManager.ShowAndroidToastMessage(infoMsg); if (posed.IsBearingSet()) { if (Debug) { posed.transform.Rotate(Vector3.up, 180, Space.Self); } else { posed.transform.Rotate(Vector3.up, posed.Bearing, Space.Self); } logger.Debug("Bearing was: {0}, actual euler angles: {1},{2},{3}", posed.Bearing, posed.transform.eulerAngles.x, posed.transform.eulerAngles.y, posed.transform.eulerAngles.z); } DebugUI.PlacementInfo.SetPlacementInfo(posed.transform.position.x, posed.transform.position.z, posed.transform.rotation.eulerAngles.y); //DisplayText(string.Format("x={0},z={1}", posed.transform.position.x, posed.transform.position.z)); }
// Update is called once per frame void Update() { switch (state) { case State.PRE_INIT: // DO Nothing, wait for LOCATION return; case State.INITIALISING: if (Session.Status != SessionStatus.Tracking) { Screen.sleepTimeout = 15; if (Time.frameCount % 100 == 0) { UnityEngine.Debug.Log("Not tracking"); // Debug print doesn't have to be printed that often } } Session.GetTrackables <TrackedPlane>(listOfTrackedPlanes, TrackableQueryFilter.New); if (gpsReady) { current = GetCurrentGeoCoordinates(); } if (!anchorSet) { if (Experimental) { var originGo = new GameObject("Origin"); originTransform = originGo.transform; originTransform.transform.position = Vector3.zero; } else { origin = Session.CreateAnchor(Pose.identity); originTransform = origin.transform; } anchorSet = true; } if (anchorSet && CalibrationUtility.IsCalibrated() && !originOriented) { if (originTransform != null) { originTransform.Rotate(Vector3.up, -CalibrationUtility.GetNorthOffset(), Space.World); originOriented = true; UnityEngine.Debug.Log("Anchored!"); } else { UnityEngine.Debug.LogWarning("Tried to orient origin-anchor, but was null"); anchorSet = false; // Not really sure how to get there } } if (gpsReady && anchorSet && originOriented) { state = State.INITIALISED; UnityEngine.Debug.Log("Initialised"); } break; case State.INITIALISED: if (!OnInitInvoked) { OnInitialised.Invoke(); OnInitInvoked = true; } break; case State.RUNNING: if (Time.frameCount % 10 == 0) { // Every 10th frame if (DoUpdates && gpsReady && anchorSet) { UpdatePositioned(); // maybe only upon creation geoposition the object, from there on, ARCore does the magic? } UnityEngine.Debug.Log(string.Format("GpsReady={0}, anchorSet={1}", gpsReady, anchorSet)); } break; case State.STOPPED: return; // Nothing to do case State.AWAITING_LOCATION: // DO Nothing, wait for LOCATION break; case State.AWAITING_AR: break; default: throw new ArgumentOutOfRangeException(); } }