1、 图片识别与建模
环境配置
首先,在官网上注册账号,在Download页面下载相应的SDK安装到unity安装目录获取Vuforia支持,如下:
然后,打开Develop页面,点击Get Development Key:
然后,注册一个License Key:
接下来,打开Target Manager页面,点击Add Database:
输入数据库名,创建数据库:
然后,点击数据库, 点击Add Target:
在数据库中添加新的target,如下:
添加成功后,查看图片信息,如下:
将创建好的数据库unity package文件下载到本地,如下:
具体实现
然后,打开unity,新建一个项目,点击file->buidl setting->player settings,在XR settings中勾选 Vuforia Augmented Reality:
这里由于我之前用的是unity 2017版本,没有vuforia的相关选项,所以这里我下载了新的unity 2018.4,在下载时将vuforia勾选进下载选项,就可以在XR Settings中找到Vuforia选项,而不用下载新的Vuforia扩展包了。
然后,点击GameObject->Vuforia Engine->AR Camera为项目增加AR Camera,并且删去原有的Main Camera:
点击AR Camera,点击Inspector面板中的 Open Vuforia Engine Configuration:
将注册好的license key拷贝到指定位置:
将下载好的数据库导入到项目中:
点击GameObject->Vuforia Engine->Image,增加一个Image Target,将Image Target Behaviour中Type设置为Predefined
然后,我们运行游戏,并在手机上打开之前数据库中的图片。调整摄像头的位置,当摄像头识别到图片时,就会自动生成一个小立方体,如下:
二. 完成AR小程序
接下来,在之前完成的项目的基础上,点击ImageTarget,在Inspector面板中点击Advanced,展开后点击Add Virtual Button:
为Virtual Button添加一个大小相同位置相同的plane子对象:
接下来写一个脚本,使得点击按钮方块按四个方向规律移动,并将脚本挂载到Image Target上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Vuforia;
public class ButtonEvent : MonoBehaviour, IVirtualButtonEventHandler
{
public VirtualButtonBehaviour[] vbs;
public GameObject cube;
public GameObject button;
public float move;
public float moveback;
public Vector3 Xdistance;
public Vector3 Zdistance;
//public float speed;
void Start()
{
vbs = GetComponentsInChildren<VirtualButtonBehaviour>();
for (int i = 0; i < vbs.Length; i++)
{
vbs[i].RegisterEventHandler(this);
}
move = 0.0f;
moveback = 0.0f;
//speed = 0.02f;
Xdistance = new Vector3(0.02f,0.0f,0.0f);//X方向移动的距离
Zdistance = new Vector3(0.0f,0.0f,0.02f);//Y当向上移动的距离
}
public void OnButtonPressed(VirtualButtonBehaviour vb)
{
//方块按规律朝4个方向移动
move = move % 4.0f + 1.0f;
Debug.Log("move");
if(move == 1.0f){
cube.transform.Translate(move * Xdistance);
}
else if(move == 2.0f){
cube.transform.Translate(move * Xdistance * (-1.0f));
}
else if(move == 3.0f){
cube.transform.Translate(move * Zdistance);
}else {
cube.transform.Translate(move * Zdistance * (-1.0f));
}
}
public void OnButtonReleased(VirtualButtonBehaviour vb)
{
//方块恢复初始位置
moveback = -1.0f * move;
Debug.Log("move back");
if(move == 1.0f){
cube.transform.Translate(moveback * Xdistance);
}
else if(move == 2.0f){
cube.transform.Translate(moveback * Xdistance * (-1.0f));
}
else if(move == 3.0f){
cube.transform.Translate(moveback * Zdistance);
}else {
cube.transform.Translate(moveback * Zdistance * (-1.0f));
}
}
}
最终效果如下: