AR/MR技术
作业要求
- 图片识别与建模
- 虚拟按键小游戏
Vuforia配置过程
虽然在课程网页上已经讲解过Vuforia的配置使用过程,但是我在实际使用过程中发现课程网页上的教程太过老旧,很多配置方法和现在的配置方法都不一样了,而且也有很多配置细节完全没有提到,因此我在这里详细说明一下我的Vuforia配置过程。我的unity版本是Unity 2018.3.14f1个人版,如果你的版本和我的版本差距太大的话,以下教程我就不保证管用了,但是你也可以将这个教程作为参考。
创建证书
首先在官网注册一个开发者账号,经过一系列注册验证操作之后,我们可以进入到如下证书管理界面:
这里我们添加一个证书密钥,名字就随便取一个。这里我们创建的密钥会用于之后unity内部的配置。
创建成功之后证书列表中就会出现一个新的证书项,点击进入之后就可以进入下面的页面,其中会有一长串密钥,点击这个密钥就会自动复制到剪切板。
创建目标数据库
在Develop界面选择Target Manager,创建一个数据库,可以对所有Target及其特征树进行管理和保存。
添加一个识别目标,这里选择Single Image类型,然后随便选择一张图片上传。注意选择图片时最好选择那些棱角分明的图片,这样更容易提取特征方便之后的识别工作。
添加成功之后我们就可以看到targets列表中出现了我们刚刚添加的图片。点击Download Database就会生成一个unity package。
在我们新建的unity项目中就可以导入刚刚生成的数据包,这些导入的数据会在之后用到。
安装vuforia扩展包
这一步的操作和课程网页上的差别比较大,我认为很有分享价值。
目前在官网上能够直接下载的vuforia engine的版本是8.6,已经没有下载unity扩展包的选项了。我在官网上下载了VuforiaSupportInstaller-Windows-8-6-7.zip并安装,但是由于版本不一致,所以我也无法进行后续操作。经过一番尝试,我发现了以下的安装方法供大家参考。
打开building settings,是的,就是那个导出游戏时使用的选项。进入如下界面:
选择其中的player settings,进入如下界面可以看到XR support Installers下面有一个链接。使用这个链接可以自动跳转到网页,并开始下载与你的unity版本一致的vuforia。
运行安装程序,将安装目录设置为你的unity所在的安装路径。不要使用默认安装路径,如果安装程序无法在指定路径下找到unity.exe,安装是无法正常进行的。注意,在安装之前必须要关闭当前所有unity项目,不然安装过程也是无法进行的。
这时我们再次在building setting里面打开player setting,可以看到XR setting下出现了一个新的选项。在如下界面中勾选Vuforia Augmented Reality,完成这一步之后才能进行进一步的配置。 如果你安装了与你的unity版本不对应的Vuforia,那么就不会出现那个选项。
安装完成之后,重新打开项目,我们可以看到GameObject选项下出现了Vuforia Engine的选项,这时我们导入一个AR Camera。导入过程中unity会提示你,导入AR Camera的同时还需要导入一些相关的包,这个时候选择让unity自动导入就行了,unity这时候导入的内容其实就是之前我们想得到的vuforia扩展包。
导入完成之后我们选择已导入的AR Camera,选择其中的VuforiaConfiguration选项,进入如下界面:
在这个界面中的App License Key位置粘贴上我们前面得到的证书密钥,完成这一步之后我们才能开始使用Vuforia。
到此为止我们就已经成功完成了Vuforia在unity上的配置工作,接下来我们就可以开始使用vuforia来开发我们的AR游戏了。
牧师与恶魔AR版
这里我将之前做的牧师与恶魔过河的小游戏改成AR版本。选择Gameobject->Vuforia Engine->Camera Image->Camera Image Target添加一个ImageTarget,然后在如下设置界面中将Type设置为Predefined,这时系统会自动选择之前已经导入的3D_Course数据库中的dragon图片。调整AR相机和ImageTarget之间的相对位置和大小之后我们就可以简单测试物体识别的效果了。
运行之后我就发现程序报错,而且屏幕上也没有任何显示。经过几番搜索,我发现了是摄像机设置出现了一点小问题。我电脑上使用的是Intel realsense D435i深度相机,所以我的显示输出里包含RGB图像和深度图像两种。
在Webcam设置中我们可以选择摄像机设备种类,这里要选择正确的相机作为图像输入。之前系统自动选为深度图输入了,所以运行自然出现了问题。但是这个问题不只是对于我这种使用奇怪相机的用户,对于有的笔记本用户即使电脑上只有一个前置摄像头,系统也会检测出前置和后置两个摄像头,这个时候也会遇到和我一样的问题。总之,使用之前一定要选择正确的摄像机设备。
测试效果:
为了实现用户与游戏的交互,我们这里使用Virtual button组件。virtual button可以在Image Target内创建,创建方法如下:
我们在ImageTarget下创建两个Virtual Button,并且在Virtual Button下加入两个平面使得按键可见。
在ImageTarget挂载脚本VirtualButtonEventHandler.cs用于控制两个虚拟按键对应的按下(OnButtonPressed)和松开(OnButtonReleased)对应的行为。在这里我就让两个按键分别对应游戏的运行和重启两个功能,详细实现如下:
VirtualButtonEventHandler.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Vuforia;
public class VirtualButtonEventHandler : MonoBehaviour, IVirtualButtonEventHandler
{
public VirtualButtonBehaviour[] vbs;
private IUserAction action;
public GameObject auto_button;
public GameObject restart_button;
// Start is called before the first frame update
void Start()
{
vbs = GetComponentsInChildren<VirtualButtonBehaviour>();
for (int i = 0; i < vbs.Length; i++)
{
vbs[i].RegisterEventHandler(this);
}
action = SSDirector.getInstance().currentSceneController as IUserAction;
}
// Update is called once per frame
void Update()
{
}
public void OnButtonPressed(VirtualButtonBehaviour vb)
{
switch (vb.VirtualButtonName)
{
case "restart":
Debug.Log("vbutton restart pressed");
restart_button.GetComponent<MeshRenderer>().material.color = Color.red;
action.restart();
break;
case "auto":
Debug.Log("vbutton auto pressed");
auto_button.GetComponent<MeshRenderer>().material.color = Color.red;
action.auto_move();
break;
default:
break;
}
}
public void OnButtonReleased(VirtualButtonBehaviour vb)
{
switch (vb.VirtualButtonName)
{
case "restart":
Debug.Log("vbutton restart released");
restart_button.GetComponent<MeshRenderer>().material.color = Color.white;
action.restart();
break;
case "auto":
Debug.Log("vbutton auto released");
auto_button.GetComponent<MeshRenderer>().material.color = Color.white;
action.auto_move();
break;
default:
break;
}
}
}
其他的代码方面的修改都比较小,就没有全部展示在博客中。如果感兴趣的话可以去我的 github 中查看。
这样直接将之前的游戏改为AR版本之后就出现了游戏中坐标的问题。我之前在游戏里使用的是世界坐标来控制游戏对象的运动,但是在AR环境下运行时Image Target的位置和方向都是时刻变化的,这就导致了运行时游戏对象的位置混乱的情况。
这时我们就需要到vuforia behaviour中修改world center mode属性。在默认情况下,世界坐标是以AR camera为中心的。现在我们将其修改为FIRST_TARGET,这个值的含义是以第一个检测到的Image Target为世界坐标中心。这样设置的结果就是Image Target保持静止,而AR camera运动,这样就完美解决了坐标系的问题。
运行效果
将之前导入的图片打印出来作为测试场景。用户可以使用两个虚拟按钮选择自动运行模式和重启游戏。我发现在屏幕上用鼠标也能同时对游戏角色进行操作。所以用户可以选择用鼠标也可以用虚拟按键来控制游戏。
可以看到整个游戏的运行效果还行。但是Vbutton的准确度不是非常高,所以我也没有做太过复杂的交互功能。