本文主要实现在 Unity 中利用 Vuforia开发安卓平台应用,并且要求调用外接的UVC相机。实际上以安卓为目标平台开发AR应用,经常绕不开UVC相机,除非AR一体机。Vuforia的AR SDK没有直接提供支持UVC Camera的SDK,但是提供了一种方法指引。该指引对开发新手来说并不友好,反复研究很多遍才编译成功。接下来就按照该指引的框架展开。
1、说明本文所用的Unity版本是Unity2019.4.14f1c1和Unity2020.3.30f1c1,Vuforia Unity平台的SDK版本为9.8.5,版本选用上有些坑需要避开。
目前Vuforia官网提供下载的SDK版本只有10.5和9.8,Unity2019以后集成Vuforia SDK主要是通过Package Manager,但是常年不更新。路径如下Window-Package Manager-Vuforia Engine AR,默认版本是8.1.12,最高支持到8.5.9。这里之所以提到SDK版本,是因为本文的目标是编译Unity中使用的so库和jar包,编译的过程除了Vuroria SDK for Unity外,还需要到Vuroria SDK For Android和Vuforia提供的一个UVC Driver Sample,这些要求版本保持一致。
本文已测试的相机包括罗技C310、普通USB Camera,还有两款AR眼镜。
2、环境要求 1) *** 作系统要求Windows 10 都可以,这部分可以忽略。Platform Support:
2)Python要求Python2及以上。后续编译会用到。Python直接官网下载,安装即可,安装过程会自动配置环境变量(需勾选)。
这个其实可有可无,毕竟由于网络问题,使用git命令clone代码就没成功过,所以也可以直接将代码下载下来解压使用。
git的安装也比较简单,官网下载直接安装就行。
要求CMake3.6及以上。官网找到自己需要的版本安装即可:https://cmake.org/download/
CMake版本查询命令:cmake --version
这个是个开源工具,直接下载、解压即可。需要配置环境变量。下载地址:https://github.com/ninja-build/ninja/releases
这个最重要,安装同样简单,下载然后配置环境变量即可。注意:要求的是r13b
下载地址:https://developer.android.google.cn/ndk/downloads/older_releases
通过Android Studio的SDK Manager下载就行。
此处不需要下载。后续使用时通过git clone或者直接从github Download ZIP。
3、编译步骤整体步骤如下:
2)文件整理 解压Vuforia Engine for Android和UVCDriver Sample,得到vuforia-sdk-android-9-8-11和vuforia-driver-sample-uvcdriver-android-9-8-5 两个文件夹,将后者文件夹改名为“UVCDriver”并剪切到“/vuforia-sdk-android-9-8-11/samples”文件夹下。结果如下:
解压UVCCamera-master并将解压后文件夹改名为“UVCCamera”,如下:
将“UVCCamera”文件夹剪切到“vuforia-sdk-android-9-8-11\samples\UVCDriver”文件夹下,如下:
3)编译
第一步:打开cmd窗口,转到“…/UVCCamera/libuvccamera/src/main/jni”路径下。具体路径根据自己文件位置调整。
第二步:执行ndk-build。命令前部分为ndk路径,即[path-to-ndk-on-your-machine]/ndk-build,这边是在D盘单独放置了一份NDK r13b,编译时指向自己就可以。
e:
cd E:\Unity2019.4.14f1c1Project\9.8\vuforia-sdk-android-9-8-11\samples\UVCDriver\UVCCamera\libuvccamera\src\main\jni
D:/MyTools/android-ndk-r13b-windows-x86_64/android-ndk-r13b/ndk-build
编译完成后,如下:
第三步:转到 "/samples/UVCDriver "路径下,并执行python build.py
编译完成后,如下:
至此,在 /UVCDriver/build/bin/Android目录下可以看到我们编译出来的so和jar包
以Unity2019.4.14f1c1为例,Vuforia 9.8这个版本Package Manager内是没有的,Vuforia官网提供的是git下载工具,经过多次测试,均以失败告终(网络问题)。这里的解决办法是找到Vuforia的代码仓库,切换到对应版本,直接Download Zip。具体 *** 作如下:
1)对应版本的Vuforia SDK for Unity集成打开Unity Hub–新建Unity工程–打开Package Manager面板–点击左上角“+”按钮–选择“Add package from disk”–找到下载的代码,选择“package.json”文件并打开即可载入对应版本的Vuforia SDK for Unity。
Vuforia SDK仓库:https://dev.azure.com/vuforia-engine/unity-extension/_git/com.ptc.vuforia.engine?path=/&version=GB9.8.5&_a=contents
就是识别图像的载入。本步骤可以忽略,当没有自定义Datbase时,系统可选择载入系统自带图库。
3)场景内 *** 作。1、在Hierarchy面板内,新建一个ARCamera、一个Image Target、一个Empty并改名为UVCManager(用于挂脚本),选择ARCamera–Open Vuforia Engine configuration–App License Key,输入应用License Key(官网注册申请即可:https://developer.vuforia.com/vui/develop/licenses)
2、 新建一个脚本,挂载到场景内的UVCManager上(实际上可挂载任意位置),内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class UVCManager : MonoBehaviour
{
private void Awake()
{
#if UNITY_ANDROID
bool driverLibrarySet = false;
driverLibrarySet = VuforiaUnity.SetDriverLibrary("libUVCDriver.so");
if (driverLibrarySet)
{
// Load your applications scene here
// InitAndLoadScene(VUFORIA_DRIVER_CAMERA_SCENE_INDEX);
// The application needs to ask for USB permissions to run the USB camera
// this is done after the driver is loaded. We call a method in the UVC driver
// Java code to request permissions, passing in the Unity app's activity.
AndroidJavaClass unityJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityJC.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass usbControllerJC = new AndroidJavaClass("com.vuforia.samples.uvcDriver.USBController");
usbControllerJC.CallStatic("requestUSBPermission", unityActivity);
}
else
{
Debug.Log("Failed to initialize the UVC driver - defaulting to the standard scene");
// Fall back to the in-built camera
}
#endif
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
3、 将上面编译的jar包和so拷贝到Assets/Plugins/Android/libs文件夹下:
在Player Setting内,需要将Graphics API内的Vulkan去掉。然后打包即可。
关于Vuforia版本。官网最新版本为10.5,该版SDK对Unity版本要求较高,需要Unity2020才能打得开。并且使用Vuforia10.5在Unity2020内发布时,Vuforia Engine configuration需要取消Include ARCore library选项,并且Player Setting内发布的Minimum API Level需要改为API Level 23。 另外10.5版本感觉UVC这一块,我这边测试是失效的,UVC相机压根就没工作。9.8版本中Android SDK是9.8.11,UVC sample和Unity SDK对应的是9.8.5,测试过程中发现9.8.11会导致Vuforia启动失败,直到降版本至9.8.5这些问题才全部解决。
关于UVCCamera库。这个第三方库默认调用一个USB设备,当外接多个Camera或者包含其他USB设备时,可能会导致启动失败。如果想在连接多USB Camera时启动指定Camera,那么可以在 “\UVCDriver\src\Java\com\vuforia\samples\uvcDriver\USBController.java” 这个脚本内修改。
参考资料:[1].Building and Using the UVC Camera Driver Sample
[2].Vuforia Engine Package for Unity
[3].Vuforia用在安卓设备中外接USB摄像头(一)
[4].Vuforia用在安卓设备中外接USB摄像头(二)
[5].Unity Vuforia 之 简单实现Vuforia调用Android设备外接摄像头camera实现AR
这里是编译好的so和jar包:https://download.csdn.net/download/uthinkd/83328413
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)