ARKit學習之2.0基礎及案例解析(後續再更新)
阿新 • • 發佈:2018-12-12
為了方便AR開發交流,博主建立了一個群 :891555732,歡迎一起討論
一.多人共享資料
官方案例原始碼 : https://github.com/Unity-Technologies/SharedSpheres
①.獲取資料及儲存
public enum ARWorldMappingStatus { //世界地圖不可用. ARWorldMappingStatusNotAvailable, //世界地圖是可用的,但功能有限。 //對於裝置的當前位置,不建議重新定位會話的世界地圖。 ARWorldMappingStatusLimited, //世界對映是通過使用者的運動積極地擴充套件地圖。 //世界地圖將可為以前訪問過的地區重新定位,但仍在為目前的空間更新。 ARWorldMappingStatusExtending, //世界地圖已經充分地映射了可見區域。 //該對映可用於重新定位裝置的當前位置 . ARWorldMappingStatusMapped }
public class UpdateWorldMappingStatus : MonoBehaviour { public Text text; public Text tracking; public UnityARSessionNativeInterface session; public ARWorldMap m_ARWorldMap; public string path = Path.Combine(Application.persistentDataPath, "myFirstWorldMap.worldmap"); void Start () { session = UnityARSessionNativeInterface.GetARSessionNativeInterface(); UnityARSessionNativeInterface.ARFrameUpdatedEvent += CheckWorldMapStatus; } void CheckWorldMapStatus(UnityARCamera cam) { if(cam.worldMappingStatus != ARWorldMappingStatus.ARWorldMappingStatusMapped) { text.text = cam.worldMappingStatus.ToString(); tracking.text = cam.trackingState.ToString() + " " + cam.trackingReason.ToString(); } else { session.GetCurrentWorldMapAsync(OnWorldMap); } } void OnDestroy() { UnityARSessionNativeInterface.ARFrameUpdatedEvent -= CheckWorldMapStatus; } void OnWorldMap(ARWorldMap worldMap) { m_ARWorldMap = worldMap; } public void Save() { if(m_ARWorldMap != null) { m_ARWorldMap.Save(path); } } }
②.載入本地空間資料
更改ARKitWorldTrackingSessionConfiguration中的worldMap即可
public void OnLoadClick() { UnityARSessionNativeInterface.ARSessionShouldAttemptRelocalization = true; //重定位 ARWorldMap new_worldmap = ARWorldMap.Load(path); ARKitWorldTrackingSessionConfiguration config = unityARCameraManage.sessionConfiguration; config.worldMap = new_worldmap; UnityARSessionRunOption sessionRunOption = UnityARSessionRunOption.ARSessionRunOptionRemoveExistingAnchors | UnityARSessionRunOption.ARSessionRunOptionResetTracking; //重置 移除 session.RunWithConfigAndOptions(config, sessionRunOption); }
實現原理 : 將現在掃描的環境特徵點與儲存的ARWorldMap 中特徵點進行匹配
③.多人聯網
官方演示案例中使用了CaptainsMess外掛 : https://github.com/hengineer/CaptainsMess,封裝了Unet,本文直接使用Unet實現
以下是測試,服務端更改球的顏色同步至客戶端
建立一個空物體新增以下指令碼:
建立三個btn,一個inputField,一個text,新增點選事件及賦值
建立Sphere預製體 :
需要在網路上流通的物體需要唯一的識別符號,新增以上兩個指令碼服務端就會同步位置到客戶端
建立好的 Sphere預製體賦值:
④.傳輸worldMap資料
unet 通過網路傳送大量資料(切塊傳輸):https://answers.unity.com/questions/1113376/unet-send-big-amount-of-data-over-network-how-to-s.html(直接拷貝指令碼並修改通道為0即可即可)
建立使用指令碼:
建立按鈕,點選事件呼叫OnStartGame
⑤.多裝置共享
接受資料完成後載入