unity实现ar,unity做简易Ar

2023-10-16 1485阅读

温馨提示:这篇文章已超过534天没有更新,请注意相关的内容是否还可用!

本文是介绍在Unity引擎环境下,使用Apple ARKit来为iPhone或iPad设备制作一款AR应用,其中所需的最基础操作;及ARKit的简单的基本使用。Unity引擎; Unity ARKit插件; Xcode 9测试版; macOS High Sierra 10.13测试版; 搭载iOS 11测试版与A9或A10处理器的Apple设备。UnityARVideo: 用于Camera 是通过CommandBuffer将iOS设备的摄像头图像绘制到Unity的Camera中的类。UnityARCameraNearFar: 用于Camera 在Unity镜头剪切面的近/远类适当设置。通过AddComponent添加到任意的GameObject中,使用相机的引用并使用它。之后便是ARReferenceSet的创建,这里图片和对象的设置属性都是一样的。都是名字和ARReference对象的链表

ARKit的简单使用 ARKit插件下载介绍准备工作场景创建ARReference和ARReferenceSetARReferenceARReferenceSet 代码示例引用接收ARKit检测到的特征点:接收ARKit检测到的平面信息根据现实显示影子 打包

unity实现ar,unity做简易Ar
(图片来源网络,侵删)

ARKit 插件下载

该链接为我所使用的ARKit版本插件;最新版本的可到官网下载,需要Apple开发者账号。

介绍

本文是介绍在Unity引擎环境下,使用Apple ARKit来为iPhone或iPad设备制作一款AR应用,其中所需的最基础操作;及ARKit的简单的基本使用。由于项目比较急,我暂时还没有做更深入的解析,仅在插件最基本的应用阶段。

准备工作

想为iOS系统开发应用,需要具备一台搭载Mac OS系统的电脑,以及下载资源所需的Apple开发者账号。其它硬件与软件需求如下:

Unity引擎(需要使用Unity 2018.3或更新版本,该版本以前不支持ARKit2.0);

Unity ARKit插件;

Xcode 9测试版;

macOS High Sierra 10.13测试版;

搭载iOS 11测试版与A9或A10处理器的Apple设备。

场景

场景中最主要的需要的三个类:UnityARVideo,UnityARCameraNearFar,UnityARCameraManager。

UnityARVideo:

用于Camera


是通过CommandBuffer将iOS设备的摄像头图像绘制到Unity的Camera中的类。通过AddComponent添加到相机下并使用它。此外,如果SkyBox等出现在相机上,相机的图像将被隐藏,因此您需要将相机的清除标志设置为仅适用于深度(Depth only)。UnityARCameraNearFar:

用于Camera


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

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

如图,以插件本身的UnityARImageAnchor场景中的为例:

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

创建ARReference和ARReferenceSet

在UnityARCameraManager的组件脚本中,我们可以看到有两个字段需要我们添加。

这两个分别表示我们需要扫描的物体类型:Image Tracking和Object Tracking,前者为图片,后者为物体。将相应的对象放入其中,程序便可识别运行。

下面是创建对应对象的步骤:

如图,我们可以创建我们想要的几个对象,再进行设置。

ARReference

图片和对象的设置属性基本相同,这里我们用图片举例:

三个属性,分别为名字,图片和大小。名字自己起,只要确保不要用中文和重复便可;再将需要扫描的图片直接拖入框中即可。

还有一个注意的是,创建Object对象时,其中第一个属性是名字;第二个属性是一种后缀为arobject的文件,其创建方式可在官网中找到具体方式,由于我的项目中用不到,所以我暂时没有仔细研究,这里附上该处的官网链接。

ARReferenceSet

之后便是ARReferenceSet的创建,这里图片和对象的设置属性都是一样的。都是名字和ARReference对象的链表

再将创建完成的ARReferenceSet对象放入UnityARCameraManager组件脚本对应的位置即可。

代码 示例

以下为示例UnityARImageAnchor中的代码:

using UnityEngine;using UnityEngine.XR.iOS;public class GenerateImageAnchor : MonoBehaviour{ [SerializeField] private ARReferenceImage referenceImage; [SerializeField] private GameObject prefabToGenerate; private GameObject imageAnchorGO; void Start() { UnityARSessionNativeInterface.ARImageAnchorAddedEvent += AddImageAnchor; UnityARSessionNativeInterface.ARImageAnchorUpdatedEvent += UpdateImageAnchor; UnityARSessionNativeInterface.ARImageAnchorRemovedEvent += RemoveImageAnchor; } void AddImageAnchor(ARImageAnchor arImageAnchor) { Debug.Log(\”image anchor added\”); if (arImageAnchor.referenceImageName == referenceImage.imageName) { Vector3 position = UnityARMatrixOps.GetPosition(arImageAnchor.transform); Quaternion rotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform); imageAnchorGO = Instantiate(prefabToGenerate, position, rotation); } } void UpdateImageAnchor(ARImageAnchor arImageAnchor) { Debug.Log(\”image anchor updated\”); if (arImageAnchor.referenceImageName == referenceImage.imageName) { imageAnchorGO.transform.position = UnityARMatrixOps.GetPosition(arImageAnchor.transform); imageAnchorGO.transform.rotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform); } } void RemoveImageAnchor(ARImageAnchor arImageAnchor) { Debug.Log(\”image anchor removed\”); if (imageAnchorGO) { GameObject.Destroy(imageAnchorGO); } } void OnDestroy() { UnityARSessionNativeInterface.ARImageAnchorAddedEvent -= AddImageAnchor; UnityARSessionNativeInterface.ARImageAnchorUpdatedEvent -= UpdateImageAnchor; UnityARSessionNativeInterface.ARImageAnchorRemovedEvent -= RemoveImageAnchor; }}

其中最主要的便是UnityEngine.XR.iOS命名空间下的UnityARSessionNativeInterface类。大意的月饼,它有一个与本地ARKit桥接的作用,可以接收后面描述的检测结果的获取作为这个类的代表。

我的项目中用到的便是图像识别,用的就是上面的代码,只是我不是实例化(

Instantiate

)对象,而是使用GameObject.SetAction函数对对象进行显示隐藏操作。

private void AddImageAnchor(ARImageAnchor arImageAnchor){ Debug.Log(\”image anchor showed\”); if (arImageAnchor.referenceImageName == referenceImage.imageName) { Vector3 position = UnityARMatrixOps.GetPosition(arImageAnchor.transform); Quaternion rotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform); imageAnchorGO.transform.position = position; imageAnchorGO.transform.rotation = rotation; imageAnchorGO.SetActive(true); }} 引用

下面是我在网上找到的网文对UnityARSessionNativeInterface类的一些静态属性的介绍,这里介绍记录一下。

先上链接:https://www.jianshu.com/p/251b0893fa86

接收ARKit检测到的特征点:

可以使用名为

UnityARSessionNativeInterface.ARFrameUpdatedEvent

的委托方法接收ARKit检测到的特征点的更新。

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

UnityARCamera具有

pointCloudData

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

在Unity ARKit插件的示例中,相应的处理在名为

PointCloudParticleExample

的类中实现。

接收ARKit检测到的平面信息

ARKit的检测平面信息是

UnityARSessionNativeInterface.ARAnchorAddedEvent



UnityARSessionNativeInterface.ARAnchorUpdatedEvent



UnityARSessionNativeInterface.ARAnchorRemovedEvent

可以接收三个委托方法。

public void Start(){UnityARSessionNativeInterface.ARAnchorAddedEvent + = AddAnchor;UnityARSessionNativeInterface.ARAnchorUpdatedEvent + = UpdateAnchor;UnityARSessionNativeInterface.ARAnchorRemovedEvent + = RemoveAnchor;}public void AddAnchor(ARPlaneAnchor arPlaneAnchor){Debug.Log();}public RemoveAnchor(ARPlaneAnchor arPlaneAnchor){Debug.Log();}public void UpdateAnchor(ARPlaneAnchor arPlaneAnchor){Debug.Log();}

平面信息存储在

ARPlaneAnchor

结构中。

为了实现计划信息游戏物体,在存储必要的信息,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是作为仅显示阴影的素材准备的,请将其设置为flo活动:慈云数据爆款香港服务器,CTG+CN2高速带宽、快速稳定、平均延迟10+ms 速度快,免备案,每月仅需19元!! 点击查看or等。 打包

该项目打包,可使用Xcode将项目打包成IPA,发布到IOS的一般过程即可。

88251052

《unity实现ar,unity做简易Ar》来自互联网同行内容,若有侵权,请联系我们删除!

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]