Пример #1
0
    // invoked by Load-button
    public IEnumerator LoadButtonClicked()
    {
        // load scene
        string      sFilePath = FileUtils.GetPersitentDataPath("SavedSceneSurfaces.json");
        JsonArScene arScene   = LoadArScene(sFilePath);

        yield return(null);

        // show result
        if (arScene != null && sceneInfoText)
        {
            sceneInfoText.text = "Loaded " + alLoadedSurfaces.Count + " surfaces (head:" + (int)arScene.startHeading + ") from file: " + sFilePath;

            // wait for some time
            yield return(new WaitForSeconds(10f));

            // clear the info
            sceneInfoText.text = "Slide to load the saved scene.";
        }

        routineRunning = false;
    }
    // invoked by Load-button
    public IEnumerator LoadButtonClicked()
    {
        // load scene
        string sFilePath = sceneFilePath;         // FileUtils.GetPersitentDataPath("SavedSceneSurfaces.json");

        arScene = LoadArScene(sFilePath);

        yield return(null);

        // show result
        if (sceneInfoText)
        {
            if (arScene != null)
            {
                sceneInfoText.text = "Loaded " + alLoadedSurfaces.Count + " surfaces from file: " + sFilePath;
            }
            else
            {
                sceneInfoText.text = "Scene file not found: " + sFilePath;
            }
        }

        //routineRunning = false;
    }
    // loads AR scene and the detected surfaces
    public JsonArScene LoadArScene(string dataFilePath)
    {
        if (!File.Exists(dataFilePath))
        {
            return(null);
        }

        // load json
        string      sJsonText = File.ReadAllText(dataFilePath);
        JsonArScene data      = JsonUtility.FromJson <JsonArScene>(sJsonText);

        if (data != null)
        {
            if (useSavedHeading)
            {
                startHeading = data.startHeading;
            }

            Quaternion compStartRot = Quaternion.Euler(0f, -startHeading, 0f);

            if (data.surfaceSet != null)
            {
                // destroy currently loaded surfaces
                DestroyLoadedSurfaces();

                for (int i = 0; i < data.surfaceSet.surfaceCount; i++)
                {
                    GameObject overlaySurfaceObj = new GameObject();
                    overlaySurfaceObj.name = "surface-" + i;
                    overlaySurfaceObj.transform.SetParent(transform);

                    OverlaySurfaceUpdater overlaySurface = overlaySurfaceObj.AddComponent <OverlaySurfaceUpdater>();
                    overlaySurface.SetSurfaceMaterial(surfaceMaterial);
                    overlaySurface.SetSurfaceCollider(true, null);

                    Vector3 surfacePos = data.surfaceSet.surfaces[i].position;
                    surfacePos = compStartRot * surfacePos;

                    Quaternion surfaceRot = Quaternion.Euler(data.surfaceSet.surfaces[i].rotation);
                    surfaceRot = Quaternion.Euler(surfaceRot.eulerAngles + compStartRot.eulerAngles);                     //

                    List <Vector3> meshVertices = new List <Vector3>(data.surfaceSet.surfaces[i].vertices);
                    List <int>     meshIndices  = new List <int>(data.surfaceSet.surfaces[i].indices);

                    // update the surface mesh
                    overlaySurface.UpdateSurfaceMesh(surfacePos, surfaceRot, meshVertices, meshIndices);

                    alLoadedSurfaces.Add(overlaySurface);
                }
            }

            if (cameraTransform && data.sceneCam != null)
            {
                Vector3 camPos = data.sceneCam.camPos;
                camPos = compStartRot * camPos;

                Quaternion camRot = Quaternion.Euler(data.sceneCam.camRot);
                camRot = Quaternion.Euler(camRot.eulerAngles + compStartRot.eulerAngles);

                cameraTransform.position = camPos;
                cameraTransform.rotation = camRot;
            }

            if (displaySavedInfos)
            {
                if (locationInfoText)
                {
                    if (data.scenePos != null)
                    {
                        string sMessage = "Lat: " + data.scenePos.lat + ", Lon: " + data.scenePos.lon + ", Alt: " + data.scenePos.alt;
                        sMessage += "\nCompass Head: " + FormatHeading(data.compHeading) + ", Start: " + FormatHeading(data.startHeading);
                        locationInfoText.text = sMessage;
                    }
                    else
                    {
                        locationInfoText.text = "Location service not supported.";
                    }
                }

                if (gyroInfoText)
                {
                    if (data.sceneRot != null)
                    {
                        string sMessage = "Gyro Att: " + data.sceneRot.gyroAtt + ", Rot: " + data.sceneRot.gyroRot;
                        if (data.sceneCam != null)
                        {
                            sMessage += string.Format("\nCamera Pos: {0}, Rot: {1}", data.sceneCam.camPos, data.sceneCam.camRot);
                        }
                        gyroInfoText.text = sMessage;
                    }
                    else
                    {
                        gyroInfoText.text = "Gyroscope not supported.";
                    }
                }
            }

            Debug.Log("AR-Scene (head: " + (int)data.startHeading + ") loaded from: " + dataFilePath);
        }

        return(data);
    }
Пример #4
0
    // loads AR scene and the detected surfaces
    public JsonArScene LoadArScene(string dataFilePath)
    {
        if (!File.Exists(dataFilePath))
        {
            return(null);
        }

        // load json
        string      sJsonText = File.ReadAllText(dataFilePath);
        JsonArScene data      = JsonUtility.FromJson <JsonArScene>(sJsonText);

        if (data != null)
        {
            Quaternion compStartRot = Quaternion.Euler(0f, -startHeading, 0f);

            Vector3 camOffset = Vector3.zero;
            if (applyLocationDistance && locationEnabled &&
                Input.location.status == LocationServiceStatus.Running && data.scenePos != null)
            {
                Vector3 locSaved  = GeoUtils.LatLong2Meters(data.scenePos.lat, data.scenePos.lon, useLocationAltitude ? data.scenePos.alt : 0f);
                Vector3 locCamera = GeoUtils.LatLong2Meters(lastLoc.latitude, lastLoc.longitude, useLocationAltitude ? lastLoc.altitude : 0f);

                camOffset = locSaved - locCamera;
                camOffset = new Vector3(camOffset.y, camOffset.z, camOffset.x);                  // x=lon; y=alt; z=lat
            }

            if (data.surfaceSet != null)
            {
                // destroy currently loaded surfaces
                DestroyLoadedSurfaces();

                for (int i = 0; i < data.surfaceSet.surfaceCount; i++)
                {
                    GameObject overlaySurfaceObj = new GameObject();
                    overlaySurfaceObj.name = "surface-" + i;
                    overlaySurfaceObj.transform.SetParent(transform);

//					GameObject overlayCubeObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
//					overlayCubeObj.name = "surface-cube-" + i;
//					overlayCubeObj.transform.localScale = new Vector3(0.1f, 0.2f, 0.3f);
//					overlayCubeObj.transform.SetParent(overlaySurfaceObj.transform);

                    OverlaySurfaceUpdater overlaySurface = overlaySurfaceObj.AddComponent <OverlaySurfaceUpdater>();
                    overlaySurface.SetSurfaceMaterial(surfaceMaterial);
                    overlaySurface.SetSurfaceCollider(true, null);

                    Vector3 surfacePos = data.surfaceSet.surfaces[i].position;
                    surfacePos = compStartRot * surfacePos;

                    if (applyLocationDistance)
                    {
                        surfacePos += camOffset;
                    }

                    Quaternion surfaceRot = Quaternion.Euler(data.surfaceSet.surfaces[i].rotation);
                    surfaceRot = Quaternion.Euler(surfaceRot.eulerAngles + compStartRot.eulerAngles);                     //

                    List <Vector3> meshVertices = new List <Vector3>(data.surfaceSet.surfaces[i].vertices);
                    List <int>     meshIndices  = new List <int>(data.surfaceSet.surfaces[i].indices);

                    // update the surface mesh
                    overlaySurface.UpdateSurfaceMesh(surfacePos, surfaceRot, meshVertices, meshIndices);

//					// find the nearest currently tracked surface
//					MultiARInterop.TrackedSurface[] alTrackedSurf = arManager ? arManager.GetTrackedSurfaces(false) : null;
//
//					MultiARInterop.TrackedSurface nearestSurf;
//					float nearestDist = float.MaxValue;
//					bool foundNearestSurf = false;
//
//					if (alTrackedSurf != null && alTrackedSurf.Length > 0)
//					{
//						for (int s = 0; s < alTrackedSurf.Length; s++)
//						{
//							MultiARInterop.TrackedSurface trackedSurf = alTrackedSurf[s];
//
//
//						}
//					}

                    alLoadedSurfaces.Add(overlaySurface);
                }
            }

            Debug.Log("AR-Scene (head: " + (int)data.startHeading + ") loaded from: " + dataFilePath);
        }

        return(data);
    }
    // saves AR scene parameters and the detected surfaces
    public bool SaveArScene(string dataFilePath)
    {
        MultiARManager marManager = MultiARManager.Instance;

        if (!marManager || marManager.GetTrackedSurfacesCount() == 0)
        {
            return(false);
        }

        JsonArScene data = new JsonArScene();

        data.saverVer  = 1;
        data.sceneDesc = string.Empty;
        data.timestamp = marManager.GetTrackedSurfacesTimestamp();

        if (locationEnabled && Input.location.status == LocationServiceStatus.Running)
        {
            data.scenePos = new JsonScenePos();

            data.scenePos.lat = lastLoc.latitude;
            data.scenePos.lon = lastLoc.longitude;
            data.scenePos.alt = lastLoc.altitude;

            Vector3 latLonM = GeoUtils.LatLong2Meters(lastLoc.latitude, lastLoc.longitude, lastLoc.altitude);
            data.scenePos.latm = (long)((double)latLonM.x * 1000.0);
            data.scenePos.lonm = (long)((double)latLonM.y * 1000.0);
            data.scenePos.altm = (long)latLonM.z;
        }


        if (gyroEnabled)
        {
            data.sceneRot = new JsonSceneRot();

            data.sceneRot.gyroAtt = gyroAttitude.eulerAngles;
            data.sceneRot.gyroRot = gyroRotation.eulerAngles;
        }

        data.compHeading  = compHeading;
        data.startHeading = startHeading;
        Quaternion compStartRot = Quaternion.Euler(0f, startHeading, 0f);

        data.sceneCam        = new JsonSceneCam();
        data.sceneCam.camPos = compStartRot * camPosition;

        data.sceneCam.camRot = camRotation.eulerAngles + compStartRot.eulerAngles;
        data.sceneCam.camRot = Quaternion.Euler(data.sceneCam.camRot).eulerAngles;

        // surfaces
        data.surfaceSet              = new JsonSurfaceSet();
        data.surfaceSet.timestamp    = marManager.GetTrackedSurfacesTimestamp();
        data.surfaceSet.surfaceCount = marManager.GetTrackedSurfacesCount();
        data.surfaceSet.surfaces     = new JsonSurface[data.surfaceSet.surfaceCount];

        MultiARInterop.TrackedSurface[] trackedSurfaces = marManager.GetTrackedSurfaces(true);
        for (int i = 0; i < data.surfaceSet.surfaceCount; i++)
        {
            // transformed surfaces
            data.surfaceSet.surfaces[i] = new JsonSurface();

            Vector3 surfacePos = trackedSurfaces[i].position;
            data.surfaceSet.surfaces[i].position = compStartRot * surfacePos;

//			data.surfaceSet.surfaces[i].rotation = trackedSurfaces[i].rotation.eulerAngles;
            Vector3 surfaceRot = trackedSurfaces[i].rotation.eulerAngles + compStartRot.eulerAngles;
            data.surfaceSet.surfaces[i].rotation = Quaternion.Euler(surfaceRot).eulerAngles;

            data.surfaceSet.surfaces[i].bounds   = trackedSurfaces[i].bounds;
            data.surfaceSet.surfaces[i].vertices = trackedSurfaces[i].points;
            data.surfaceSet.surfaces[i].indices  = trackedSurfaces[i].triangles;
        }

        try
        {
            // save json
            string sJsonText = JsonUtility.ToJson(data, true);
            File.WriteAllText(dataFilePath, sJsonText);

            Debug.Log("AR-Scene (head: " + (int)data.startHeading + ") saved to: " + dataFilePath);

            return(true);
        }
        catch (System.Exception ex)
        {
            string sMessage = ex.Message + "\n" + ex.StackTrace;
            Debug.LogError(sMessage);
        }

        return(false);
    }