ARKit 与Unity桥接
一:ARkit
1.ARkit 们看看它到底带来了什么功能
第一,快速稳定的运动定位,非常稳定且准确,说明精度很不错,说明鲁棒性很好,渲染模型很流畅,实时性和算法能耗都深度优化过,尺度估计,估计整个场景和模型的走动,对各个开发平台或引擎的支持。
2.目前ARkit有何不足:
三维重建的能力,目前的ARkit仅仅支持平面的“重建”,这里姑且先算做重建,因为是否支持垂直面,任意角度的平面,甚至多个平面目前都还不确定(从目前发出来的文档看只支持水平面,说明平面的拟合可能是依赖于IMU的,仅用部分点云判断深度信息)。就算ARkit包含完整的平面重建能力,对于AR应用来说依然还是不足够的。
就是识别的能力:
与Vuforia 对比他没有识别物体,这种算法!他有一个跟踪类,里面具体算法效果,从现在看能够识别平面!其余的没有!
1.苹果生态上不再需要第三方AR SDK
2.对开发者而言,仅需了解跟进ARKit。
3.目前的能力还有限,9月份看iPhone 8 。
4.对各个开发平台或引擎的支持。
对unity 开发人员来说
ARKit对于熟悉iOS原生开发的开发者来说,非常容易上手;对于习惯了基于Unity做AR开发的国内开发者来说,则需要掌握一定的OC或Swift 语言。功能上,ARKit和当下的AR SDK有一定的区别,它的功能里面没有包含图像识别、云识别等基础的AR功能,并且它不是一个跨平台的开发工具。
应用范围:
ARKit更像是苹果提供给iOS开发者的一个AR SLAM功能开发包。ARKit的SLAM表现是很好的,对基于AR SLAM功能来开发应用的开发者来说,是一个福音。所以,如果开发者只面向iOS ipohne6S以及以上机型市场,且应用开发不需要图像识别、云识别等基础AR功能的前提下,ARKit会是很好的选择。
SLAM解释:移动机器人的同步自定位与地图创建研究进展,真正全自主移动机器人的关键。
https://www.leiphone.com/news/201605/5etiwlnkWnx7x0zb.html
二:
Unity与ARKit
Apple 提供一个开源的Unity-ARKit-Plugin 插件。
是专门为ARKit制作的unity包!
这个插件公开了ARKit SDK的世界跟踪能力,显示了摄像头的视频输入、平面检测和更新、点云提取、光估计,以及为他们的AR项目向Unity开发人员测试API。这个插件是一个预览质量构建,可以帮助您快速启动并快速运行此技术,但是实现和api可能会改变以迎合底层技术。
要求配置:
统一unity版本,v5.6.1p1 +
iOS 11 +
Xcode beta 9和最新的iOS SDK,包含了ARKit框架
支持ARKit的iOS设备(iPhone 6S或更高版本,iPad(2017年)或以后),目前demo已经做出来了。
1.在iOS里实现AR场景的,模型只能读SCN后缀和obj后缀的模型,OBJ的模型是没有动画的。!(然后效果是比较差的,还是有很多局限性的,这块我还要进一步的研究ARKit);
2.在unity方面,具体跟unity效果对比我不知道(还是需要进一步的研究,和深挖的,目前都是基本的)
下面是ARKit在unity流程顺序:
1。读读ARKit和它是如何工作的高水平(https://developer.apple.com/documentation/arkit/understanding_augmented_reality)
这个插件提供了与ARKit本地接口相对应的脚本API,然后通过创建一些使用该接口的GameObject组件来建立它。
2。请参考本项目中的示例场景,了解我们如何构建提供的ARKit示例应用程序。UnityARSessionNativeInterface。cs和NativeInterface文件夹具有最低级别的API。详情见下文。
3。获得一个基于“增大化现实”技术的使用UnityARSessionNativeInterface.GetARSessionNativeInterface原生会话界面()。让我们在本教程中调用这个m_session。(见UnityARCameraManager.cs)
4。创建一个ARSession通过调用m_session.RunWithConfig(配置),将一个ARKitWorldTrackingSessionConfiguration配置(6自由度)或ARKitSessionConfiguration(3自由度)与相应的参数设置来确定你想要什么样的会话。还可以使用m_session初始化。RunWithConfigAndOption(config,option),如果其中一个已经启动,则允许重置会话。(见UnityARCameraManager.cs))
5。每一次更新,使用m_session . getcamerapose()来获得对摄像机位置和旋转的ARKit理解。使用改变坐标系统的效用函数来确定在统一场景中摄像机的位置和旋转应该是什么。例如camera.transform。localPosition = UnityARMatrixOps.GetPosition(矩阵);camera.transform。localRotation = UnityARMatrixOps。GetRotation(矩阵);(见UnityARCameraManager.cs)
6。每次更新,使用m_session。getcamera投影()来获取相机投影参数和使用相机的ARKit理解。在Unity相机上设置一个投影矩阵(见unityarcameramanager . cs)
7。在主相机上,添加UnityARVideo单行为组件,并在检查器中设置清楚的材料,以指向项目中的YUVMaterial。你可以从源代码中看到它的功能:每一个帧,它都采用两个纹理来组成ARKit想要从相机中显示出来的视频,并使用YUVMaterial着色器将它们组合到由相机呈现的背景中。(见UnityARVideo,cs)
8。此时,您应该能够在场景中放置一堆3D对象,构建并运行它,并能够看到您放置的对象,并在场景中移动设备,从而在场景中移动设备。
9。您可以使用ARKit提供HitTest API来与场景交互。看到https://developer.apple.com/documentation/arkit/arhittestresult.resulttype类型的东西你可以在现场。m_session。HitTest(point,resultTypes)将返回命中结果的列表。您可以使用结果来确定放置虚拟对象的位置。(见UnityARHitTestExample.cs)
10。如果你有要求ARKit为你做飞机检测在会话中配置,可以钩到ARKit返回的事件对于那些通过插件:UnityARSessionNativeInterface。ARAnchorAddedEvent UnityARSessionNativeInterface。ARAnchorUpdatedEvent,UnityARSessionNativeInterface.ARAnchorRemovedEvent。所有这些的代表都采用了形式锚点更新(ARPlaneAnchor ARPlaneAnchor)。您可以选择渲染与这些飞机相对应的游戏对象,或者仅仅使用它们来“锚定”您的虚拟内容。(见UnityARAnchorManager.cs)
- 如果你想获得ARKit帧更新,包括点云数据(https://developer.apple.com/documentation/arkit/arpointcloud),钩到UnityARSessionNativeInterface.ARFrameUpdatedEvent事件。委托的形式ARFrameUpdated(unityarcamera),你可以从unityarcamera.pointCloudData获得点云数据。(见PointCloudParticleExample.cs)
12。在前面的步骤中使用ARFrameUpdateEvent还可以使用更新摄像机的位置、旋转和投影矩阵(而不是步骤5和步骤6),但是要注意,这将以ARKit的速度更新,而不是更新统一渲染引擎的速率。您可能必须使用提供的实用功能来获取正确的坐标系统的结果。
13。您可以获得场景的光估计(https://developer.apple.com/documentation/arkit/arlightestimate)通过调用m_session.GetARAmbientIntensity()在每一个更新。(见UnityARAmbient.cs)
三: Unity code追踪:
UnityARCameraNearFar
1.unity 入口。!获取相机的距离,物体和相机距离小于最近和大于最远都看不到(在视野范围内) void UpdateCameraClipPlanes() { currentNearZ = attachedCamera.nearClipPlane; currentFarZ = attachedCamera.farClipPlane; UnityARSessionNativeInterface.GetARSessionNativeInterface ().SetCameraClipPlanes (currentNearZ, currentFarZ);
}类目:
2。UnityARSessionNativeInterface (这个类里面就是创建一个AR,和iOS搭建起来)
public static UnityARSessionNativeInterface GetARSessionNativeInterface()
这个方法就返回一个AR场景。! 如果是unity编辑器,他就调用unity_CreateNativeARSession
时时获取相机的各种属性来,
private static UnityARCamera s_Camera;这个相机下面的全部都是外部方法就是用这些方法来设置的
来创建一个m_NativeARSession,
最后通过m_session.RunWithConfig 来运行一个AR。
3.UnityARCameraManager
void Update () { if (m_camera != null) { // JUST WORKS! Matrix4x4 matrix = m_session.GetCameraPose(); m_camera.transform.localPosition = UnityARMatrixOps.GetPosition(matrix); m_camera.transform.localRotation = UnityARMatrixOps.GetRotation (matrix); m_camera.projectionMatrix = m_session.GetCameraProjection (); } }4.UnityARHitTestExample
这是一个ARkit追踪类的一个类型。。!
这里面是获取显示的内容的,AR追踪的是什么物体。。!