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