ARKit学习之2.0基础及案例解析(后续再更新)

版权声明:个人原创,转载请注明出处 https://blog.csdn.net/dengshunhao/article/details/84646958

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

⑤.多设备共享

接受数据完成后加载

猜你喜欢

转载自blog.csdn.net/dengshunhao/article/details/84646958