ARFoundation集成SenseAR(二)

本文介绍了SenseAR在Unity不同版本中的使用方法及注意事项,包括版本要求、渲染管线配置、兼容设置等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       隔了好久又用上了senseAR,上一篇说到senseAR的文章也只是个调研,也没有多深入进使用这个插件。在这里不得不吐槽一下ARFoundation。。。对于用ARFoundation进行跨平台AR开发,ios往往会比android省事。因为ios所需要做的事情arkit都帮开发者做好了;但andriod的ar开发简直是个噩梦,因为ARCore的适配原因,我都不记得向产品解释过多少次为啥xx机型用不了AR,再加上后面的制裁事件,新的支持ARCore的安卓机型也越来越少,到后面基本都放弃安卓AR的开发了。总总原因使用对机型硬件没有限制的senseAR简直是安卓开发的明灯,一是使用的ARFoundation开发框架不需要重构可以直接使用,二是可以接替ARCore直接适配所有安卓机型,让安卓AR的开发跟ios一样轻松。这么一说的话senseAR简直是AR的业界明灯啊。。。在深入使用之前本人是这么想的,但实际用起来却又是一坑接一坑。因为网上的文章大多数都是基于Unity2018的,虽然有些博主说了能支持Unity2019的版本,但都是一笔带过,并没有可以参考的文章与工程,这次又是着实地踩了个大坑。但好歹还在是多次尝试后把这个坑给填上了,在这里进行一下SenseAR的使用总结。

1.版本要求

senseAR不仅对Unity有版本要求,自身的版本也对其他依赖插件的版本有要求。

在PackageManager是不能直接搜索到SenseAR XR Plugin的,需要勾选到show preview packages,senseAR里面显示的插件都是preview版本。

其中preview3.1.1.0以下的版本可以在所有的Unity2018.4.x的版本号里运行,这里建议还是使用unity2018的长期维护版里使用(即后缀带LTS的版本),同时,在PackageManager里也可以看到SenseAR对依赖插件的版本需求:

它需要ARFoundation1.5.0-preview.6与ARSubsysytem2.20-preview.3这两个插件的依赖,当AR运行不正常的话可以检查这两个插件的版本号。同时要注意的是SenseAR的这个版本必需要安装对应的这两个依赖插件,当你使用的Unity版本是2018.4.x的话就只能使用preview3.1.1.0,不可以使用更高的版本了。如果你使用Unity2019的版本可以继续往下看。

截止到现在为止,SenseAR最新的版本是preview.1 -3.1.0,文档上说明是可以在Unity2019以上的版本使用,但其实这是个坑的!准确来说最新版本的SenseAR XR Plugin preview.1 -3.1.0只能在指定的unity版本中运行,当使用unity过高或者过低的版本时,senseAR虽然能运行,但会导致其他的报错:例如跳转场景会闪退、显示会黑屏、禁用摄像机会闪退等等问题。

在preview.1 -3.1.0的版本中可以看到它的相关依赖

可以看到它依赖的ARFoundation与ARSubsystems版本是3.1.0- preview.8,Android JNI是1.0.0。这三个插件都是有对应的版本安装的,没多大问题。但要求的XRManagement使用版本是是3.0.4(这里我安装了3.0.5,也可以正常运行),在2019以上的unity版本中senseAR报错大多是因为这个XRManager。我使用的unity版本是2019.3.0,在PackageManager面板上可以看到XRManagement的最低版本就是3.0.5,但senseAR要求的是3.0.4

查了unity的官方资料,3.0.4版本只存在2019.2的版本里面,而且只有一个preview版本。

在最后我使用了Unity2019.3.0版本运行senseAR,虽然没有出现闪退黑屏的现象,但在安装的logcat界面还是有看到senseAR的报错信息的,估计并不是致命的错误所以并没有影响app的运行。所以当需要用到senseAR时,有三种选择

1.使用旧的preview3.1.1.0版本,配合unity2018.4.x的unity版本进行开发

2.使用最新的preview1.3.1.0版本,配合unity2019.2.x的unity版本进行开发

3.使用最新的preview1.3.1.0版本,并配合存在版本号是3.0.5的XRManagement的unity版本进行开发

至于版本号过高的unity版本运行senseAR会报错,这里说一下个人的猜测:

打开ProjectSetting界面,当安装了XRManagement后可以找到XR Plugin Management这一选项:

就是因为上面的Plugin Provider选项中无法添加SenseAR Loader,导致senseAR无法启动或者闪退,估计因为新版本的unity中ARSubsystem已经把senseAR移除之类的。

2.渲染管线

unity使用AR时可以使用默认的渲染管线,也可以配合使用LWRP或者URP:

当使用unity2018.4.x的版本时,可以使用LWRP,当使用2019的版本时,可以使用URP,同时有一点要注意的是,当使用了这两个渲染管线时,需要检查管线的配置文件

这两个文件是在创建urp或者lwrp后自动生成的。选择_Render后缀的这个文件

我们需要在Renderer Features中添加对AR的一个background进行配置,点击+号就可以添加。这也是使用senseAR能成功运行但项目黑屏的一个原因:因为摄像头显示压根就没有添加到渲染队列中。

3.兼容设置

senseAR是ARCore的一种替代方案,unity在安卓的版本中只能使用其中一种(两种插件共存的情况暂时还没有测试过,不过也没必要这样做)。对于在哪个平台使用哪种AR插件,这个在上面说到的XR Plugins Management面板中可以通过设置plugin providers来确定

在一个工程项目中当需要打包出android跟ios两种app时,可以兼容设置来防止打包的报错

因为senseAR还需要一个启动脚本SenseARModeSet

可以在脚本的awake中进行判断,如果是android版本才激活脚本,如果下所示:

void Awake()
{
#if UNITY_ANDROID
senseARModeSet.enable=true;
#end 
}

同时,因为senseAR跟ARCore一样需要依赖AR运行库才能启动,可以在场景的激活前进行检测:

 Promise<SessionAvailability> promise = new SenseARSessionSubsystem().GetAvailabilityAsync();
            yield return promise;
            Debug.Log("senseAR的状态" + promise.result);
            if (promise.result == SessionAvailability.None)
            {
                //不支持
                unSupportUI.SetActive(true);
            }
            else if (promise.result == SessionAvailability.Supported)//支持但未安装
            {
                 //跳转到下载界面
                 Application.OpenURL("https://openar.sensetime.com/platform/api/file-manager/v1/files/4/download?contentSHA256=6c99675adea48510a1de6fec9f8b7a5a4479ca9757a51d0e3d0e3e6999331b02");
            }
            else
            {
                //进入AR场景
                SceneManager.LoadScene("Root");
            }

在代码中,对senseAR的引用会在xcode中报错,所以需要用#if UNITY_UNITY这个宏来进行控制。

这样基本可以在最少代码的改动下,使用senseAR来代替ARCore作为安卓版本的AR依赖,功能跟稳定性基本是看硬件的性能,虽然说跟ios相比还是差距挺大的,但跟ARCore相比基本AR效果差不多。

 

暂时总结到这里:)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

      

### Unity 中实现 AR 手势识别的方法 在 Unity 中实现 AR 手势识别可以通过多种方式完成,具体取决于所选的技术栈和目标平台。以下是几种常见的解决方案及其实施细节: #### 使用 AR Foundation 和第三方插件 Unity 提供了一个强大的框架——AR Foundation,用于支持跨平台的增强现实开发。然而,AR Foundation 自身并不直接提供手势识别功能,因此通常需要结合其他工具或插件来实现这一需求。 ##### ManoMotion 插件 ManoMotion 是一款专注于手部识别的商业插件,能够为 Unity 开发者提供高度精确的手势检测能力[^2]。其主要特性包括但不限于: - **手部深度识别**:通过摄像头捕捉用户手掌的位置和距离信息。 - **骨骼追踪**:实时跟踪手指关节运动轨迹。 - **手势回调**:允许开发者定义特定事件触发逻辑,例如缩放、旋转或点击操作。 要集成 ManoMotion 到项目中,请按照官方文档说明配置环境并导入必要的资源文件。完成后即可利用 API 调用手势数据处理函数。 ```csharp using UnityEngine; using Manomotion; public class GestureRecognizer : MonoBehaviour, IManoGestureListener { void Start() { ManoManager.Instance.AddListener(this); } public void OnGesture(Gesture gesture) { Debug.Log($"Detected {gesture.Name}"); } } ``` 此脚本片段演示了如何监听简单的手势变化情况,并打印对应的名称至控制台窗口。 --- #### 结合 SenseAR SDK 另一种可行方案是采用商汤科技推出的开源框架 SenseAR[^3]。它不仅具备基础的人脸特效编辑器组件,还额外提供了丰富的肢体动作解析接口。对于希望构建更具沉浸感的应用程序而言,这是一个不错的选择。 需要注意的是,在正式部署之前可能需要手动调整某些参数设定以适配不同设备型号之间的差异性表现。比如针对小米系列机型可能存在冲突现象,则建议提前做好兼容测试工作。 下面给出一段基于 C# 编写的伪代码样例作为参考指南: ```csharp // 假设已经成功初始化好 SenseAR 环境... void Update () { var handPose = HandTrackingModule.GetLatestHandPose(); if (handPose != null && IsPinch(handPose)) { PerformZoomAction(); // 如果检测到捏合动作则执行相应放大缩小行为 } else if(IsSwipeLeft(handPose)){ NavigateToPreviousPage();// 向左滑动翻页 } } bool IsPinch(HandPose pose){ return Mathf.Abs(pose.Fingers[0].Position.z - pose.Fingers[1].Position.z)<THRESHOLD; } ``` 上述例子简单描述了一种判断两指之间相对位移量小于阈值时判定为“捏”的情形;当然实际应用场景下还需要考虑更多边界条件约束等因素影响最终效果呈现质量。 --- #### 定制化机器学习模型训练 如果既定选项无法满足特殊定制需求的话,还可以尝试自行搭建专属的数据集并通过 TensorFlow Lite 或 ONNX Runtime 将经过充分优化后的神经网络导出给移动终端加载运行。这种方法虽然前期投入较大但长远来看灵活性更高也更贴近业务本身特点。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值