Unity ARKit的基本使用

作者: 光明程辉 | 来源:发表于2017-11-13 15:14 被阅读327次

    首先去官网下载插件: https://www.assetstore.unity3d.com/en/#!/content/92515
    或者这个网站【更新比官网快】 https://bitbucket.org/Unity-Technologies/unity-arkit-plugin

    ARKit至少需要以下三个类别。

    UnityEngine.XR.iOS.UnityARVideo
    通过CommandBuffer将iOS设备的摄像头图像绘制到Unity的Camera中的类。将AddComponent添加到相机并使用它。请将YUVMaterial设置为 ClearMaterial属性。
    此外,如果SkyBox等出现在相机上,相机的图像将被隐藏,因此您需要将相机的清除标志设置为仅适用于深度。

    UnityARCameraNearFar
    在Unity镜头剪切面的近/远类适当设置。将它添加到主相机并使用它。

    UnityARCameraManager
    除了使摄像机的运动与终端的运动同步以外,还可以设置多个项目的类别。将AddComponent添加到任意的GameObject中,使用相机的引用并使用它。


    12.png

    在这种状态下,如果在执行过程中检查MainCamera的位置和Debug.Log等位置,可以看到MainCamera的位置与摄像机的
    运动同步移动。

    UnityARSessionNativeInterface

    UnityARSessionNativeInterface也是一个重要的类。
    顾名思义,它有一个与本地ARKit桥接的作用,
    可以接收后面描述的检测结果的获取作为这个类的代表。

    接收ARKit检测到的特征点:

    可以使用名为
    UnityARSessionNativeInterface.ARFrameUpdatedEvent的
    委托方法接收ARKit检测到的特征点的更新。

    public void Start()
    {
    UnityARSessionNativeInterface.ARFrameUpdatedEvent + = ARFrameUpdated;
    }
    public void ARFrameUpdated(UnityAR Camera camera)
    {
    向量3 [] pointCloud = camera.pointCloudData;
    }

    UnityARCamera具有pointCloudData属性,
    特征点的位置以Vector3的数组存储。

    在Unity ARKit插件的示例中,相应的处理在名为
    PointCloudParticleExample的类中实现。

    接收ARKit检测到的平面信息

    ARKit的检测平面信息是
    YuenuaitiyARSessionNativeInterface.ARAnchorAddedEvent
    YuenuaitiyARSessionNativeInterface.ARAnchorUpdatedEvent
    YuenuaitiyARSessionNativeInterface.ARAnchorRemovedEvent
    可以接收三个所谓的委托方法。

    public void Start()
    {
    UnityARSessionNativeInterface.ARAnchorAddedEvent + = AddAnchor;
    UnityARSessionNativeInterface.ARAnchorUpdatedEvent + = UpdateAnchor;
    UnityARSessionNativeInterface.ARAnchorRemovedEvent + = RemoveAnchor;
    }
    public void AddAnchor(ARPlane Anchor arPlaneAnchor)
    {
    Debug.Log();
    }
    公共无效RemoveAnchor(ARPlane锚arPlaneAnchor)
    {
    Debug.Log();
    }
    public void UpdateAnchor(ARPlaneAnchor arPlaneAnchor)
    {
    Debug.Log();
    }

    平面信息存储在ARPlane Anchor结构中。

    为了实现计划信息游戏物体,
    在存储必要的信息,ARPlaneAnchorGameObject使用,
    受到游戏物体和如下ARPlaneAnchor它有一套。

    targetGameObject.name = arPlaneAnchor.identifier;
    ARPlaneAnchorGameObject arpag = new ARPlaneAnchorGameObject();
    arpag.planeAnchor = arPlaneAnchor;
    arpag.gameObject = UpdatePlaneWithAnchorTransform(targetGameObject,arPlaneAnchor);

    另外,由于ARPlaneAnchor与 PointCloud 不同,它的连续性
    如下更新。

    UpdatePlaneWithAnchorTransform(arpag.gameobject,arPlaneAnchor);

    在Unity ARKit插件的示例中,相应的处理在名为
    UnityARAnchorManager的类中实现。

    UnityARAnchorManager在,UnityARUtility已成为实施有地板到一个预制,如果是在一个单一的预制没问题,是顺利的利用。

    根据现实显示影子

    为了显示阴影,需要以下三个步骤。

    将UnityARCameraManager的EnableLightEstimation设置为true
    在统一DirectionalLight的创建,UnityARAmbient到AddComponent的
    由于shadowPlaneMaterial是作为仅显示阴影的素材准备的,请将其设置为floor等。

    在Unity编辑器上进行调试

    在Unity ARKit插件中有一个名为UnityARKitRemote的场景文件。
    通过在iPhone真机上移动场景,您可以像Unity Remote一样在Unity Editor上操作ARKit。

    程序如下。

    1 ARKitRemoteConnection装配式放置在现场的
    2统一编辑器中的运行运行
    在3 iOS的终端UnityARKitRemote打开的场景的含有应用程序
    4统一控制台的,连接的播放机,诸如从该选择的“iPhone”
    “开始在5统一游戏窗口远程ARKit会话“按钮出现,所以点击

    借助此功能,您可以使用Unity Editor在iOS设备上接收相机信息和ARKit信息。
    有时视频和识别结果会不断跳过,延迟时间相当长,但我认为这对于需要时间构建的项目会很有用。

    相关文章

      网友评论

      • c7b5c4fd164e:文章不错, 对于初次接触Unity开发AR的同学来说很实用

        关于UnityARKitRemote, 不知道作者有没有遇到这种情况, 在Build中已设置Development Build, 运行时设备也Connected, 点击 Start Remote ARKit Session之后, Game场景中无变化, Console也没error, 设备里也没有看到正常的画面, 这也是延迟的原因么?
        光明程辉:会有一些所谓的延迟。其实是在识别加载场景。

      本文标题:Unity ARKit的基本使用

      本文链接:https://www.haomeiwen.com/subject/lqlzmxtx.html