贝博恩创新科技网

Vuforia Android教程如何快速入门?

目录

  1. Vuforia 是什么?
  2. 环境准备
    • 1 安装 Android Studio
    • 2 配置 Android NDK 与 SDK
    • 3 创建 Vuforia 开发者账户并获取 Key
  3. 创建第一个 AR 项目:3D 模型跟踪
    • 1 步骤一:在 Vuforia Target Manager 中创建数据库
    • 2 步骤二:添加并准备 3D 模型
    • 3 步骤三:在 Android Studio 中创建新项目
    • 4 步骤四:配置项目依赖和权限
    • 5 步骤五:配置 ARCamera
    • 6 步骤六:加载并显示 3D 模型
    • 7 步骤七:运行和测试
  4. 核心概念解析
    • 1 Vuforia 数据库
    • 2 Target (目标)
    • 3 Image Target (图像目标)
    • 4 Model Target (模型目标)
    • 5 Trackable (可追踪对象)
    • 6 ARCamera (AR 相机)
    • 7 GameObject (游戏对象) 与 Behavior (行为)
  5. 进阶功能与资源
    • 1 平面检测
    • 2 多目标跟踪
    • 3 云识别
    • 4 官方资源与社区
  6. 常见问题与故障排除
    • Q1: 为什么我的 App 一打开就崩溃?
    • Q2: 为什么摄像头画面是黑的?
    • Q3: 为什么我的 3D 模型没有出现?
    • Q4: Vuforia Key 有什么限制?

Vuforia 是什么?

Vuforia 是一款功能强大的增强现实 开发引擎,由 PTC 公司开发,它被广泛用于为移动设备(iOS、Android)和头戴式显示器(如 HoloLens、Magic Leap)创建 AR 应用程序。

Vuforia Android教程如何快速入门?-图1
(图片来源网络,侵删)

Vuforia 的核心能力是识别和跟踪现实世界中的物体或图像,并将虚拟的 3D 模型、2D 图像、视频等数字信息叠加到摄像头捕捉到的真实画面上。

主要功能包括:

  • 图像识别: 识别特定的 2D 图片。
  • 模型识别: 识别 3D 物体(如玩具、机器零件)。
  • 平面检测: 在环境中检测水平面(如地面、桌面)和垂直面(如墙壁)。
  • 物体识别: 识别通用物体类别,无需预先训练。
  • Smart Terrain: 在设备周围实时构建 3D 网格,用于虚拟物体与现实环境的交互。
  • 云识别: 将庞大的目标数据库存储在云端,减轻应用体积。

环境准备

在开始编码之前,请确保你的开发环境已经准备就绪。

1 安装 Android Studio

这是开发 Android 应用的官方 IDE,如果你还没有安装,请从 Android 官网 下载并安装。

Vuforia Android教程如何快速入门?-图2
(图片来源网络,侵删)

2 配置 Android NDK 与 SDK

Vuforia 的本地库需要 Android NDK (Native Development Kit) 来编译。

  1. 打开 Android Studio,进入 File -> Settings (Windows) 或 Android Studio -> Preferences (macOS)。
  2. 导航到 Appearance & Behavior -> System Settings -> Android SDK
  3. SDK Tools 标签页中,勾选以下两项:
    • NDK (Side by side): 用于编译 C/C++ 代码。
    • CMake: 一个跨平台的构建工具。
  4. 点击 ApplyOK 进行安装。

3 创建 Vuforia 开发者账户并获取 Key

  1. 访问 Vuforia 开发者平台
  2. 注册一个免费账户。
  3. 登录后,进入 Develop -> License Manager
  4. 点击 Add a license key,给你的 App 起个名字("MyFirstARApp"),然后创建。
  5. 你将获得一个 Vuforia License Key(一长串字母和数字)。请妥善保管,这是我们配置 AR 应用程序的核心凭证。

创建第一个 AR 项目:3D 模型跟踪

我们将创建一个应用,当手机摄像头对准一个特定的 3D 模型(比如一个茶壶)时,屏幕上会显示一个 3D 茶壶模型并跟随它移动。

1 步骤一:在 Vuforia Target Manager 中创建数据库

数据库是存储你想要识别的目标的集合。

  1. 登录 Vuforia 开发者平台,进入 Develop -> Target Manager
  2. 点击 Add Database,创建一个新的数据库,给它一个名字(MyFirstDatabase),选择 AccessDeveloper(免费),Create
  3. 进入刚创建的数据库,点击 Add Target -> Model Target
  4. 选择 3D 模型:点击 Choose File,上传一个 .obj 格式的 3D 模型文件(这里可以下载一个示例茶壶模型)。
  5. 命名和设置:给目标起个名字(Teapot),然后点击 Add
  6. 下载数据库:创建成功后,在数据库页面点击 Download 按钮,选择 Android 平台,下载一个 .xml 文件,这个文件包含了你目标的“数字指纹”,我们需要把它放到 Android 项目中。

2 步骤二:添加并准备 3D 模型

我们需要一个 3D 模型文件(如 .fbx.obj)来显示在 AR 场景中,你可以使用任何 3D 建模软件创建,或从网上下载免费资源。

Vuforia Android教程如何快速入门?-图3
(图片来源网络,侵删)
  1. 将你下载的 .obj 文件(或你自己的模型)放入 Android Studio 项目的 app/src/main/assets 文件夹下,如果这个文件夹不存在,请手动创建。

3 步骤三:在 Android Studio 中创建新项目

  1. 打开 Android Studio,选择 File -> New -> New Project...
  2. 选择 Empty Views Activity 模板,Next
  3. 配置你的项目:
    • Name: MyFirstARApp
    • Package name: com.example.myfirstarapp (根据你的实际情况修改)
    • Save location: 选择项目保存路径
    • Language: JavaKotlin (本教程以 Java 为例,但 Kotlin 的步骤类似)
    • Minimum SDK: API 24: Android 7.0 (Nougat) 或更高版本。
  4. 点击 Finish 等待项目构建完成。

4 步骤四:配置项目依赖和权限

  1. 添加 Vuforia 依赖

    • 打开 app/build.gradle 文件。
    • dependencies 代码块中,添加 Vuforia 核心库:
      implementation 'com.ptc.vuforia:vuforia:9.8.+' // 使用最新版本
    • 点击 "Sync Now" 同步 Gradle。
  2. 添加权限和配置

    • 打开 app/src/main/AndroidManifest.xml 文件。

    • <application> 标签之前,添加必要的相机和网络权限:

      <uses-permission android:name="android.permission.CAMERA" />
      <uses-feature android:name="android.hardware.camera" />
      <uses-feature android:name="android.hardware.camera.autofocus" />
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    • <application> 标签内部,添加 Vuforia Key 和配置 ARActivity

      <application
          ...>
          <!-- 将 YOUR_VUFORIA_LICENSE_KEY 替换为你在第 2.3 步获取的 Key -->
          <meta-data android:name="com.vuforia.KEY" android:value="YOUR_VUFORIA_LICENSE_KEY" />
          <activity
              android:name="com.vuforia.VuforiaPlayerActivity"
              android:configChanges="orientation|screenSize|keyboardHidden"
              android:screenOrientation="landscape"
              android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
          <!-- 如果你使用的是 Empty Views Activity,请保留 MainActivity -->
          <activity android:name=".MainActivity">
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
                  <category android:name="android.intent.category.DEFAULT" />
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
      </application>
    • 注意VuforiaPlayerActivity 是 Vuforia 的启动界面,它会初始化 AR 相机。MainActivity 将在 AR 初始化完成后被加载。

5 步骤五:配置 ARCamera

  1. 打开 app/res/layout/activity_main.xml 文件。
  2. 删除默认的 TextView,添加一个 ARCamera 组件,这是 Vuforia 的核心,负责处理相机预览和跟踪。
    <com.vuforia.arCamera.ARCamera
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/arCamera"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:context=".MainActivity" />

6 步骤六:加载并显示 3D 模型

  1. 将你在 3.1 步下载的数据库文件(MyFirstDatabase.xml)复制到 app/src/main/assets 文件夹。
  2. 修改 MainActivity.java 文件,加载数据库并创建 3D 模型。
package com.example.myfirstarapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.vuforia.DataSet;
import com.vuforia.ObjectTracker;
import com.vuforia.Trackable;
import com.vuforia.TrackableResult;
import com.vuforia.Vuforia;
import com.vuforia.Vector3;
import com.vuforia.ObjectTarget;
import com.vuforia.ObjectTrackerInstantiationException;
import com.vuforia.Trackables;
import com.vuforia.VuforiaException;
import com.vuforia.arCamera.ARCamera;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
    private ARCamera arCamera;
    private DataSet dataSet;
    private ObjectTracker objectTracker;
    private Trackable teapotTrackable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        arCamera = findViewById(R.id.arCamera);
        // 初始化 Vuforia
        Vuforia.setInitParameters(this, Vuforia.GL11, "");
        try {
            Vuforia.init();
        } catch (VuforiaException e) {
            Toast.makeText(this, "Vuforia 初始化失败: " + e.getMessage(), Toast.LENGTH_LONG).show();
            finish();
            return;
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        // 加载数据集
        loadDataSet();
        // 启动 AR 相机
        arCamera.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        // 暂停 AR 相机
        arCamera.onPause();
        // 释放数据集
        if (dataSet != null) {
            dataSet.deactivate();
            dataSet.destroy();
            dataSet = null;
        }
    }
    private void loadDataSet() {
        // 创建一个 Object Tracker
        objectTracker = ObjectTracker.getInstance();
        if (objectTracker == null) {
            Toast.makeText(this, "无法创建 ObjectTracker", Toast.LENGTH_LONG).show();
            return;
        }
        try {
            objectTracker.start();
        } catch (ObjectTrackerInstantiationException e) {
            Toast.makeText(this, "启动 ObjectTracker 失败: " + e.getMessage(), Toast.LENGTH_LONG).show();
            return;
        }
        // 加载数据集
        dataSet = objectTracker.createDataSet();
        InputStream inputStream = null;
        try {
            inputStream = getAssets().open("MyFirstDatabase.xml");
            if (!dataSet.load(inputStream, "", Vuforia.STORAGE_ABSOLUTE)) {
                Toast.makeText(this, "加载数据集失败", Toast.LENGTH_LONG).show();
                return;
            }
        } catch (IOException e) {
            Toast.makeText(this, "读取数据集文件失败: " + e.getMessage(), Toast.LENGTH_LONG).show();
            return;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        // 激活数据集
        if (!objectTracker.activateDataSet(dataSet)) {
            Toast.makeText(this, "激活数据集失败", Toast.LENGTH_LONG).show();
            return;
        }
        // 获取数据集中的第一个目标 (我们的茶壶)
        Trackables trackables = dataSet.getTrackables();
        teapotTrackable = (Trackable) trackables.get(0);
        teapotTrackable.start(); // 开始跟踪
        // 为目标创建一个 3D 渲染器
        // 注意:这里简化了,实际渲染需要 OpenGL ES
        // Vuforia 的 Unity 插件会处理这个,原生 SDK 需要自己写渲染代码。
        // 这是一个概念性的步骤,表明你需要在这里渲染模型。
        Toast.makeText(this, "数据集加载成功,请将摄像头对准目标物体", Toast.LENGTH_SHORT).show();
    }
}

重要提示:上面的代码加载了数据库并启动了跟踪,但并没有渲染 3D 模型,在原生 Android SDK 中,渲染 3D 模型需要你自己使用 OpenGL ES 编写复杂的渲染管线,这超出了“入门教程”的范畴,对于初学者,强烈推荐使用 Vuforia + Unity,Unity 内置了强大的渲染引擎,可以让你轻松地将 3D 模型拖拽到场景中即可显示。

7 步骤七:运行和测试

  1. 将你的 Android 设备通过 USB 连接到电脑,并开启“开发者选项”和“USB 调试”。
  2. 在 Android Studio 中,点击绿色的“运行”按钮。
  3. App 会启动,请求相机权限,请允许。
  4. 将摄像头对准你在 3.1 步上传的 实物 3D 模型(例如一个真实的茶壶)。
  5. 如果一切顺利,你应该会看到 App 成功识别并跟踪该模型。(由于我们没有写渲染代码,你可能只看到相机画面,但 Vuforia 的日志会显示跟踪成功)

核心概念解析

理解这些概念是掌握 Vuforia 的关键。

  • Vuforia 数据库: 一个 .xml 文件,包含了你想要识别的“目标”的数字信息,一个 App 可以加载多个数据库。
  • Target (目标): 你想让 Vuforia 识别的任何东西,可以是图像、3D 模型、物体等。
  • Image Target (图像目标): 最常见的目标类型,基于一张 2D 图片,Vuforia 会提取图片的特征点进行识别。
  • Model Target (模型目标): 基于 3D 模型的目标,Vuforia 会从 3D 模型中生成多个 2D 视图,从而实现从不同角度识别实物。
  • Trackable (可追踪对象): 在代码中,一个被识别并跟踪的目标实例,当你创建一个 ImageTargetModelTarget 并加载到场景中时,它就变成了一个 Trackable
  • ARCamera (AR 相机): Vuforia 的核心组件,它负责:
    1. 访问设备的相机。
    2. 初始化 Vuforia 引擎。
    3. 执行目标识别和跟踪算法。
    4. 将相机画面作为背景渲染到屏幕上。
  • GameObject (游戏对象) 与 Behavior (行为): 在 Unity/Vuforia 生态中,你在场景中放置的任何东西(如 3D 模型、图片、灯光)都是一个 GameObjectBehavior 是附加在 GameObject 上的脚本,赋予其特定功能。ImageTarget 本身是一个 GameObject,你可以将一个 3D 模型作为它的子对象,并附加一个 ModelTargetBehaviour 来让它只在目标被识别时显示。

进阶功能与资源

当你掌握了基础后,可以探索更强大的功能。

  • 平面检测:

    • 功能: 不需要特定的目标图片或模型,Vuforia 可以自动检测环境中的平面,如地面、桌面、墙壁。
    • 用途: 将虚拟家具放置在你的房间里,或在墙上挂虚拟画框。
    • 实现: 在 Unity 中,只需添加一个 PlaneFinder GameObject 并将其作为其他虚拟物体的父对象即可。
  • 多目标跟踪:

    • 功能: 在一个数据集中添加多个目标(多张图片或多个 3D 模型),Vuforia 可以同时跟踪它们。
    • 用途: 创建一个复杂的 AR 产品说明书,用户扫描不同部件时,显示对应的 3D 动画和信息。
  • 云识别:

    • 功能: 将目标存储在 Vuforia 的云端服务器上,你的 App 只需发送请求到云端进行识别,无需在本地存储庞大的数据库文件。
    • 用途: 识别海量的、频繁更新的目标,如杂志上的广告、产品包装等。
    • 注意: 云识别需要付费订阅。
  • 官方资源与社区:

    • Vuforia 官方文档: https://library.vuforia.com/ (最权威的参考资料)
    • Vuforia 开发者社区: https://developer.vuforia.com/forum (提问和交流的好地方)
    • Unity Asset Store: 搜索 "Vuforia",有大量现成的插件、示例和扩展。
    • 推荐: 对于绝大多数开发者,Vuforia + Unity 是最高效、最友好的组合,Unity 可视化的编辑环境和强大的渲染引擎能让你专注于创意,而不是底层的 OpenGL 编程。

常见问题与故障排除

  • Q1: 为什么我的 App 一打开就崩溃?

    • A1: 最常见的原因是 AndroidManifest.xml 中的 Vuforia License Key 错误或无效,请仔细检查 Key 是否正确粘贴,其次是缺少必要的相机权限。
  • Q2: 为什么摄像头画面是黑的?

    • A2:
      1. 检查是否授予了相机权限。
      2. 检查设备是否被其他应用占用(如正在视频通话)。
      3. 检查 ARCamera 组件是否正确添加到布局中。
      4. 在某些模拟器上,相机功能可能无法正常工作,请务必在真机上测试。
  • Q3: 为什么我的 3D 模型没有出现?

    • A3:
      1. 原生 SDK: 因为你没有编写渲染代码,模型自然不会显示,这是正常的,原生 SDK 开发复杂。
      2. Unity: 检查你的 3D 模型是否被正确放置为 ImageTargetModelTarget 的子对象,检查 ModelTargetBehaviourEnabled 属性是否勾选。
  • Q4: Vuforia Key 有什么限制?

    • A4: 免费的 Developer Key 有一些限制:
      • 每个月处理的请求数量有限制。
      • 不能用于商业发布的产品。
      • 如果你的应用需要公开发布并盈利,你需要申请一个商用 Key,这通常是付费的。

希望这份详尽的教程能帮助你顺利开启 Vuforia AR 开发之旅!祝你编码愉快!

分享:
扫描分享到社交APP
上一篇
下一篇