1. 程式人生 > >ARKit學習之2.0基礎及案例解析(後續再更新)

ARKit學習之2.0基礎及案例解析(後續再更新)

 為了方便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

⑤.多裝置共享

接受資料完成後載入