Unity ARKit Plugin 分析

作者: 黑亚当 | 来源:发表于2017-08-01 14:03 被阅读981次
    下载地址 https://www.assetstore.unity3d.com/en/#!/content/92515

    可以看随时查Unity-ARKit-Plugin的项目进展:
    https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/src/aa4933787df366c2d3ab15f65a8ceed57f23f1a6?at=default

    首先看Unity-ARKit-Plugin的三个文档:

    1.README.md:

    两个核心文件:

    /Assets/Plugins/iOS/UnityARKit/NativeInterface/ARSessionNative.mm

    /Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs

    包含下面重要API:

    public void RunWithConfigAndOptions(ARKitWorldTackingSessionConfiguration config,UnityARSessionRunOption runOptions)

    public void RunWithConfig(ARKitWorldTackingSessionConfiguration config)

    public void Pause()

    public List HitTest(ARPoint point,ARHitTestResultType types)

    public ARTextureHandles GetARVideoTextureHandles()

    public float GetARAmbientIntensity()

    public int GetARTrackingQuality()

    还有delegate:

    public delegate void ARFrameUpdate(UnityARCamera camera)

    public delegate void ARAnchorAdded(ARPlaneAnchor anchorData)

    public delegate void ARAnchorUpdated(ARPlaneAnchor anchorData)

    public delegate void ARAnchorRemoved(ARPlaneAnchor anchorData)

    public delegate void ARSessionFailed(string error)

    一些回调:

    public static event ARFrameUpdate ARFrameUpdatedEvent;

    public static event ARAnchorAdded ARAnchorAddedEvent;

    public static event ARAnchorUpdated ARAnchorUpdatedEvent;

    public static event ARAnchorRemoved ARAnchorRemovedEvent;

    public static event ARAnchorAdded ARUserAnchorAddedEvent;

    public static event ARAnchorUpdated ARUserAnchorUpdatedEvent;

    public static event ARAnchorRemoved ARUserAnchorRemovedEvent;

    public static event ARSessionCallback ARSessionInterruptedEvent;

    public static event ARSessionCallback ARSessioninterruptionEndedEvent;

    public static event ARSessionTrackingChanged ARSessionTrackingChangedEvent;


    2. TUTORIAL.txt

    一些要点作如下总结:

    1>一切都从session开始,在文件UnityARCameraManager.cs中有

    m_session = UnityARSessionNativeInterface.GetARSessionNativeInterface();

    2> ARSession的config根据精度不同分为

    ARKitWorldTrackingSessionConfiguration(6DOF)和ARKitSessionConfiguration(3DOF),

    这也是UnityARCameraManager.cs和AR3DOFCameraManager.cs两个文件的原因。

    3>想要获取相机的位置,可以使用

    Matrix4x4 matrix = m_session.GetCameraPose();

    camera.transform.localPosition = UnityARMatrixOps.GetPosition(matrix);

    camera.transform.localRotation = UnityARMatrixOps.GetRotation(matrix);

    同样代码在UnityARCameraManager.cs中。

    4> UnityARVideo.cs相机上组件,使用YUVMaterial shader渲染视频纹理。

    5> UnityARHitTestExample处理Hit事件,获得Hit与接触平面的相交坐标,可以关联任何GameObject,Hit中的坐标可以控制相关GameObject.

    6>可用使用UnityARAnchorManager执行AddAnchor,RemoveAnchor,UpdateAnchor操作。

    7> PointCloudParticleExample,显示PointCloud的小黄点。

    8> UnityARAmbient,ARKit光照亮度向Unity亮度的转化,Light的组件。

    9> UnityARUserAnchorComponent用来移除用户自己添加的ARUserAnchor。

    10>重要事件的回调还得去看UnityARSessionNativeInterface.cs


    3. SCENES.txt

    对Example中给出了Scene进行了介绍

    UnityARKitScene.unity:最小场景的ARkit功能演示;

    UnityParticlePainter.unity:空间粒子系统画点;

    UnityARBallz.unity:平面小球移动与碰撞;

    UnityARShadows.unity:在平面显示物体的阴影;

    UnityAROcclusion.unity:遮光材料遮挡物体;;

    UnityARUserAnchorScene.unity:通过Anchor添加删除物体;

    ### UnityARKitScene.unity

    ### UnityParticlePainter.unity

    ### UnityAROcclusion.unity
    效果描述:出现立方体,点击出现小人,场景出现Cloud黄点,但没有显示平面

    ### UnityARShadows.unity

    ### UnityARBallz.unity

    ### AddRemoveAnchorScene.unity

    效果描述:点击创建黑白网格立方体,4秒钟后消失

    ## 重要文件分析

    Directional light

    类型是Directional,绑定UnityARAmbient.cs

    void UpdateAmbientIntensity(UnityARCamera camera)

    {

    // Convert ARKit intensity to Unity intensity

    // ARKit ambient intensity ranges 0-2000

    // Unity ambient intensity ranges 0-8(for over-bright lights)

    float newai = camera.ambientIntensity;

    l.intensity = newai / 1000.0f;

    }

    Main Camera

    因为YUVMaterial是下面这样,所以在Unity中运行的背景是绿色

    UnityARCameraManager

    将Unity的Camera转成UnityARCamera,需要与MainCamera关联

    其中公有成员public Camera m_camera;

    公有方法public void SetCamera(Camera newCamera)

    GeneratePlanes

    与之相关联的UnityARGeneratePlane.cs

    公有成员public GameObject planePrefab;

    私有成员private UnityARAnchorManager unityARAnchorManager;

    在Start()方法中会创建unityARAnchorManager和planePrefab

    显示的平面是下面的样子

    其中包含UnityARAnchorManager

    顾名思义,是ARAnchor的管理类,

    初始化时将以下方法绑定UnityARSessionNativeInterface中的Event:

    AddAnchor(ARPlaneAnchor arPlaneAnchor)

    RemoveAnchor(ARPlaneAnchor arPlaneAnchor)

    UpdateAnchor(ARPlaneAnchor arPlaneAnchor)

    该类本身存储了对象

    Dictionary planeAnchorMap;

    其中key string对应arPlaneAnchor.identifier

    可通过下面函数获得

    public List GetCurrentPlaneAnchors() {

        return planeAnchorMap.Values.ToList();

    }

    ARPlaneAnchorGameObject有个专门的类,代码如下:

    namespace UnityEngine.XR.iOS

    {

        public class ARPlaneAnchorGameObject

    {

        public GameObject gameObject;

        public ARPlaneAnchor planeAnchor;

    }

    }

    还是用到了UnityARUtility

    用来对应ARPlaneAnchor生成GameObject,如下面这种GameObject

    三个重要方法:

    void InitializePlanePrefab(GameObject go)

    GameObject CreatePlaneInScene(ARPlaneAnchor arPlaneAnchor)

    GameObject UpdatePlaneWithAnchorTransform(GameObject plane,ARPlaneAnchor arPlaneAnchor)


    UnityARHitTestExample

    点击屏幕,出现灰色立方体

    通过hitResult来获取点击位置

    PointCloudParticleExample

    生成Cloud小黄点的类

    其他:

    Unity最初在论坛里发布的ARkit Plugin以及介绍

    https://forum.unity3d.com/threads/arkit-support-for-ios-via-unity-arkit-plugin.474385/

    Unity ARKit Remote

    https://forum.unity3d.com/threads/arkit-support-for-ios-via-unity-arkit-plugin.474385/page-13#post-3153415

    相关文章

      网友评论

      本文标题:Unity ARKit Plugin 分析

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