示例#1
0
 private void UpdatePositioned()
 {
     GeoArithmetic.GeoCoordinates currentOrigin = GetCurrentGeoCoordinates();
     foreach (GeoPositioned positionedObject in positionedObjects)
     {
         UpdatePositioned(positionedObject, currentOrigin);
     }
 }
示例#2
0
    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));
    }
示例#3
0
    // 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();
        }
    }