【3D游戏编程】11. AR

作业要求

  1. 图片识别与建模
  2. 虚拟按键小游戏

实现内容

实验环境:unity2018.4.14f1

​ 本次是根据实验要求实现的一个简易AR程序。该程序能够识别指定的图片(如下)
在这里插入图片描述并在图片上方生成1个AR虚拟按钮和1个蓝色方块,按下按钮方块会向指定位置(根据按按钮的次数)移动一段距离,松开按钮方块又回到初始位置。创建一个变量move,假定每次按下按钮都会导致move在1-4之间循环变动,则move的值域方块的移动方向可以表示为下图:
在这里插入图片描述

演示视频:bilibili

项目地址:Github

实验过程

1. 下载并使用Vuforia

在Vuforia官网(https://developer.vuforia.com/downloads/sdk )注册账号,在Download页面下载相应的SDK安装到unity安装目录获取Vuforia支持
在这里插入图片描述

然后跳转到Develop页面,点击 Get Development Key
在这里插入图片描述

输入name注册Licence Key:

在这里插入图片描述

注册完成后转到Target Manager,点击Add Database
在这里插入图片描述

输入数据库名,选择Device,点击Create创建数据库
在这里插入图片描述

创建完成后点击数据库,点击Add Target增加Target
在这里插入图片描述
在这里插入图片描述
成功后可查看图片信息
在这里插入图片描述
然后将创建好的数据库下载下来(unity package文件)。

2. 完成AR小程序

新建unity项目,file->buidl setting->player settings,在XR settings中勾选 Vuforia Augmented Reality。
在这里插入图片描述

然后GameObject->Vuforia Engine->AR Camera为项目增加AR Camera,并且删去原有的Main Camera。点击AR Camera,在Inspector面板中点击 Open Vuforia Engine Configuration

在这里插入图片描述

填入刚刚注册的Licence Key:

在这里插入图片描述

并且将刚刚下载的数据库文件导入到项目内:
在这里插入图片描述

接着为项目增加一个Image Target:GameObject->Vuforia Engine->Image(组件名称为image,但是增加后默认名称为Image Target)。
在这里插入图片描述
将Image Target Behaviour中Type设置为From Database,使用相应的数据库和Target

在这里插入图片描述

添加Virtual Button:点击ImageTarget,在Inspector面板中点击Advanced,展开后点击Add Virtual Button按钮,并且为Virtual Button添加一个大小相同位置相同的plane子对象。最后为Image Target添加一个Cube子对象作为移动的方块
在这里插入图片描述
在这里插入图片描述

调节以上三个组件的位置和大小属性(主要是为了在点击按钮时方块的移动可以方便观察):
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述编写一个实现上述功能(点击按钮方块按四个方向规律移动)的脚本,挂载到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));
        }
    }

    // void update(){
    	// Debug.Log("move");
    	// if(move == 1.0f){
    	// 	 float Xposition = cube.transform.position.y;
    	// 	if (Xposition <= 0.5f && Xposition >= 0.0f) {
	    //     	cube.transform.position += distance * Time.deltaTime;
	    //     }else {
	    //     	direction = (-1.0f )* direction;
	    //     	cube.transform.position += distance * Time.deltaTime;
	    //     }
    	// }
    //}
    
}


然后就实现了 演示视频里的效果了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值