unity-ar-vuforia记录


title: unity-ar-vuforia记录
categories: Unity3d
tags: [unity, ar, 增强现实]
date: 2018-10-11 10:35:18
comments: false

unity-ar-vuforia记录, vuforia 是 Unity 2017.3 之后直接内置支持的第三方ar库.


相关资料

  • 官网: https://developer.vuforia.com/
  • api: https://library.vuforia.com/content/vuforia-library/en/reference/unity/classVuforia_1_1ImageTargetBehaviour.html
  • vuforia 价目表
    • 别人总结价目表 - http://www.arreverie.com/blogs/best-augmented-reality-sdk-in-2018/
    • 官方 - https://developer.vuforia.com/vui/pricing
  • unity中可以使用的各种识别 - https://unity-landing.vuforia.com/

识别相关使用

参考官方测试工程: Vuforia-Core-Samples (我的git仓库放着)

本地识别

ImageTarget

  1. 识别对象go (有材质球贴图为识别图) 中添加一个组件 ImageTargetBehavior, 该组件中指定 识别方式 (本地识别, 云识别), 识别库 等等

    指定 识别图 为后台配置的图. (后台链接 , 测试工程, 其实应该是 Astronaut)

  2. 添加识别回调. 识别对象go 中添加一个 xxx.cs 自定义脚本, 实现 ITrackableEventHandler 接口的方法. (参考 DefaultTrackableEventHandler.cs)

    public void OnTrackableStateChanged(
            TrackableBehaviour.Status previousStatus,
            TrackableBehaviour.Status newStatus) {
            m_PreviousStatus = previousStatus;
            m_NewStatus = newStatus;
            if (newStatus == TrackableBehaviour.Status.DETECTED ||
                newStatus == TrackableBehaviour.Status.TRACKED ||
                newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) {
                OnTrackingFound();
            } else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
                     newStatus == TrackableBehaviour.Status.NO_POSE) {
                OnTrackingLost();
            } else {
                OnTrackingLost();
            }
        }
    

    可以在 OnTrackingFound , OnTrackingLost 中实现 显示/隐藏 等逻辑, (获取 识别对象go 下所有子节点的 Render 组件 enable = false/true)

  3. 所有需要逻辑控制的 3d模型 都必须放在 识别对象go 之下作为子节点. (第2步 可以控制显示隐藏逻辑)

  • 教程参考: https://blog.csdn.net/ChinarCSDN/article/details/79721399

云识别

CloudRecoTarget

  • 参考: https://blog.csdn.net/he_wen_jian/article/details/53203626

  • 识别之后 可以开追踪

    public void OnNewSearchResult(TargetFinder.TargetSearchResult targetSearchResult)
    // Enable the new result with the same ImageTargetBehaviour:
    m_TargetFinder.EnableTracking(targetSearchResult, m_ImageTargetBehaviour.gameObject);
    
    • 这样可以让 m_ImageTargetBehaviour.gameObject 实时追踪, 并回调 改 gameObject 身上的注册的处理回调 ITrackableEventHandler. !!!但是!!!, 这样如果云识别再次开启, 且识别到相同的目标, 就不会再次回调 OnNewSearchResult

      public class TrackEventHandler : MonoBehaviour, ITrackableEventHandler 
      mTrackableBehaviour.RegisterTrackableEventHandler(this);
      public void OnTrackableStateChanged	
      

隐藏识别图go

在 ImageTarget 上直接挂上 vuforia 内置脚本 TurnOffBehavior 即可


错误处理

注册/反注册 vuforia 报错回调即可. 参考 DefaultInitializationErrorHandler.cs

void Awake() {
	VuforiaRuntime.Instance.RegisterVuforiaInitErrorCallback(OnVuforiaInitializationError);
}

void OnDestroy() {
	VuforiaRuntime.Instance.UnregisterVuforiaInitErrorCallback(OnVuforiaInitializationError);
}

public void OnVuforiaInitializationError(VuforiaUnity.InitError initError) {
...
}

识别分类

  • https://unity-landing.vuforia.com/

删除 DataSet

  1. 删除 Assets/Editor/VuforiaAssets/StreamingAssets 两个文件夹
  2. 用 sublime 编辑器将整个项目拖进去, 全文搜索 xxx 数据集, 找到并删除. (vscode 屏蔽了 .unity .prefab 会搜索不到)

只识别, 不同步ar相机slam

ar相机 会把所有场景中所有能看见的物体 (cull layer), 同步到当前识别图位置, 以识别图位置为 (0, 0, 0), 识别图移动, 所有物体跟随移动

所以如果需要不跟随移动, 需要另一个 普通相机 支持, 设定一个 layer a, 将物体设置为 layer a, ar相机剔除 layer a, 普通相机 只识别 layer a


打包

  • android 打包支持 ARCore, 参考: https://library.vuforia.com/content/vuforia-library/en/articles/Solution/arcore-with-vuforia.html

采坑记录

  • 实例化prefab ImageTarget 不能识别

    必须直接放在场景中, 才能进行识别

  • ar 相机问题

    1. ar 相机和 ImageTarget 同时在 场景中 预制好才能生效. 都不能通过 GameObject.Instantiate 实例化出来, 否则无法识别.
    2. ar相机 能看到的所有物体, 都会同步定位到 Target 上. 所以不限被同步定位的话, 需要新增另一个辅助相机, 设置 物体的layer, ar相机剔除这个layer, 普通相机可以看到这个layer的物体. 如果要渲染叠加到 ar相机上面, 需要将 普通相机 的 clear flags 设置为 solid color
  • 启用 vuforia ar 模式下, 自动启用 vuforia behavior

    即使没有添加 vuforia 的 ar camera, 而是添加自己的 camera, 会自动往 camera 中添加 vuforia behavior

  • 删除了 导进去的数据集, 还是报错: Dataset xxx could not be loaded

    用 sublime 编辑器将整个项目拖进去, 全文搜索 xxx 数据集, 找到并删除.

    (用 vscode 屏蔽了 .unity .prefab 文件, 所以一直没搜到, 晕)

  • pc 平台运行报错: DllNotFoundException: VuforiaWrapper

    vuforia 不支持 pc平台. 官方回答: Standalone Windows applications are not currently supported by Vuforia.

    参考: https://developer.vuforia.com/forum/unity/dll-not-found-vuforiawrapper

  • android 平台打包报错: Vuforia does not support Android TV. Please disable the Android TV compatibility in the Player Settings.

    取消掉 Other SettingsAndroid TV compatibility 的勾选

  • unity 编译报错: does not exist in the namespace 'Vuforia' , 找不到, 没有导入 vuforia 的程序集

    1. 无论什么平台都要先设置 Build Settings -> Player Settings -> Other Settings, 勾选 Vuforia Augmented Reality
      • mac 环境下的unity 需要安装 unity 对应版本的 pkg 包, 如 UnitySetup-Vuforia-AR-Support-for-Editor-2018.2.8f1.pkg
      • mac 环境下安装包之前, 必须确保 unity 是在系统 Applications -> Unity 文件夹里. 很多时候我们装了多个版本一般都会命名为对应的版本的文件夹 如 Applications -> Unity2018.2.8f1 , 此时安装 pkg包是会失败的. 必须是 Unity 文件夹才能安装成功
    2. 在场景里随便新建一个 vuforia 的东西, 如: 右键 -> vuforia -> ar camera , 会提示 import Vuforia Assets 是否导入 vuforia 相关资源, 点击导入
    3. 重启项目. 如果还是提示 找不到 vuforia 程序集, 升级到最新的 vuforia 即可. 如升级到 7.5.26 VuforiaSupportInstaller-Mac-7-5-26.zip

你可能感兴趣的:(Unity3d,Unity3D)