【Unity3d学习】AR技术的简单了解
文章目录
- 写在前面
- AR简介
- Vuforia使用
- Unity内嵌的Vuforia模块
- 使用Vuforia的AR组件
- 使用AR Camera组件
- 添加虚拟按钮
- AR小游戏制作
写在前面
- 本次项目Github地址:传送门
- 本次项目的视频演示地址:传送门
- 项目的详细内容见老师的课程网站:网站链接
AR简介
增强现实(Argumented Reality (AR))是一种将真实世界信息和虚拟世界信息“无缝”集成的新技术,是把原本在现实世界的一定时间空间范围内很难体验到的实体信息(视觉信息,声音,味道,触觉等),通过电脑等科学技术,模拟仿真后再叠加,将虚拟的信息应用到真实世界,被人类感官所感知,从而达到超越现实的感官体验。
混合现实(Mixed reality (MR)) 有时被称为超现实(hybrid reality),是真实和虚拟世界的合并,产生新的可视化环境,物理和数字对象实时共存且在其中交互。混合现实不仅发生在物理世界或虚拟世界中,而是融合了现实和虚拟现实,通过身临其境的技术包含增强现实和增强虚拟。
实际应用中,我们对 AR 和 MR 技术通常是不区分,简称 AR/MR 技术。
Vuforia使用
Vuforia一直是开发者最青睐的AR SDK,众多的功能以及高质量的识别技术,良好的跨平台性和兼容性,兼容目前主流的PC,Android,IOS平台。 Vuforia 引擎支持 Unity 引擎以及三个主要平台:iOS、Android 和 UWP (Windows)。所以它收到许多开发者的喜爱。
Unity内嵌的Vuforia模块
使用Unity2017以上版本就可以在安装的时候选择添加Vuforia的模块,从而能够在Unity编辑器上使用Vuforia的组件。
或者是从官网中下载(链接地址)相应的安装包。
对于2019版本,有一点坑就是需要导入相应的package,然后该包中含有一个自动执行的脚本,会将所需要安装包的链接加入到Unity2019版的包管理器中,然后自动从链接中下载所需要的资源,但是由于服务器的国外的,所以下载速度非常慢,会造成卡住不动的现象。
所以我安装了2018版的Unity来使用。
安装完成之后,需要在Unity中打开相应的设置:
然后就可以在对象树中添加相应的AR组件了:
使用Vuforia的AR组件
到官网(链接)注册一个账号,然后添加一个License Key。
然后添加数据库:
并且添加一张图片,作为识别的目标:
注意图片的识别度,星越多,越容易识别。
把数据库下载下来:
使用AR Camera组件
进入Unity,设置playsetting:
然后就可以在Unity中添加Vuforia的AR组件了:
添加AR Camera,删除原有的Camera。然后进行一点设置:
添加License和database:
数据库的添加通过导入之前我们下载的包来实现。
在场景中添加Image,就会在结构树中出现一个ImageTarget的对象。将准备好的模型添加在上面,并且调整一下位置:
运行,然后摄像头对着图片,就能够显示相应的模型了:
添加虚拟按钮
在Image Target 的 Inspecter中找到添加虚拟按钮的选项:
给虚拟按钮挂载一下代码:
using UnityEngine;
using Vuforia;public class VirtualButtonEventHandler : MonoBehaviour, IVirtualButtonEventHandler {public GameObject vb;public Animator ani;void Start() {VirtualButtonBehaviour vbb = vb.GetComponent<VirtualButtonBehaviour>();if(vbb){vbb.RegisterEventHandler(this);}}public void OnButtonPressed(VirtualButtonBehaviour vb) {ani.SetTrigger("Take Off");ani.SetBool("onPress", true);Debug.Log("Pressed!");}public void OnButtonReleased(VirtualButtonBehaviour vb) {ani.SetTrigger("Land");ani.SetBool("onPress", false);Debug.Log("Released!");}
}
其中改变了模型的动画,动画状态转换图如下:
然后为了显示button,可以在button的位置加一个平面对象(Plane),使其能够显示在屏幕中。
触碰虚拟按钮(需要完全覆盖),就能发现模型能够动起来。
项目地址:传送门
AR小游戏制作
利用AR组件制作一个简单的躲避球小游戏:
玩家控制角色(天蓝色小球),向上移动(会自然下落),从而躲避冲来的障碍小球。
碰到障碍则游戏失败
首先还是一样用到Vuforia的图像数据库,这里直接用之前的龙纹图片。
然后将我们控制的角色(一个天蓝色小球)添加为ImageTarget的子对象,就能够随着图像的识别而显示出来,基本布局很简单,上面已经有过相关的实践了。
直接来游戏设计部分:
首先需要有各种障碍出现,来躲避。所以这里可以给这些障碍制成预制体,并且挂载一个控制移动的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move : MonoBehaviour
{public Controller controller;public float speed = 9;Vector3 target;float time = 0;bool flag = true;// Start is called before the first frame updatevoid Start(){GameObject tmp = GameObject.Find("Bird");target = 3*tmp.transform.position - 2*this.transform.position;controller = Director.getInstance().currentSceneController as Controller;}// Update is called once per framevoid Update(){if (controller.getState() == 0) return;if (time > 5) {controller.addScore();flag = false;Debug.Log("score: " + controller.getScore());Destroy(this.gameObject);return;}time += Time.deltaTime;this.transform.position = Vector3.MoveTowards(transform.position,target,Time.deltaTime * speed);// this.transform.Translate(target*speed*Time.deltaTime);}
}
就是朝着我们控制目标的方向移动,但是这不是实时追踪,而只是设定一个初始目标位置的方向。并且设定一段时间后就消失。
而这里,场景控制器的作用就是不断地抛出障碍:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Controller : MonoBehaviour, SceneController, Interaction{public PipeFactory pipeFactory;public int score = 0;float time = 0;public int state = 1;public void loadResources() {}private void Start(){score = 0;pipeFactory = this.gameObject.AddComponent<PipeFactory>();Director director = Director.getInstance();director.currentSceneController = this;}private void Update() {if (state == 1) {GameObject tmp = null;if (time > 3){ tmp = pipeFactory.getPipe();time = 0;}else{time += Time.deltaTime;}}}public int getState() {return state;}public void addScore() {score += 1;}public int getScore() {return score;}
}
然后给我们的主角,添加一个刚体属性,使其能够受到重力作用。还要挂载一个控制脚本,这里暂时用鼠标点击来触发向上的动作:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Fly : MonoBehaviour
{public float speed = 5.5f;private Rigidbody rig;public Controller controller;// Start is called before the first frame updatevoid Start(){rig = GetComponent<Rigidbody>();controller = Director.getInstance().currentSceneController as Controller;}// Update is called once per framevoid FixedUpdate(){if (controller == null) {controller = Director.getInstance().currentSceneController as Controller;return;}if (controller.getState() == 0) {this.transform.localPosition = Vector3.zero;rig.useGravity = false;return;}if (this.transform.position.y < -5f) {rig.useGravity = false;rig.velocity = Vector3.zero;}else {rig.useGravity = true;}if(Input.GetButtonDown("Fire1")) {rig.velocity = Vector3.up * speed;}}
}
添加碰撞检测,如果碰到了障碍就游戏失败:
private void OnCollisionEnter(Collision other)
{Controller controller = Director.getInstance().currentSceneController as Controller;controller.state = 0;Destroy(other.gameObject);}
使用工厂进行障碍物的创建:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PipeFactory: MonoBehaviour{List<GameObject> activeList = new List<GameObject>();List<GameObject> freeList = new List<GameObject>();public GameObject getPipe() {GameObject pipe = null;GameObject img = GameObject.Find("ImageTarget");if (img != null) {if (freeList.Count > 0){pipe = freeList[0].gameObject;freeList.Remove(freeList[0]);pipe.transform.Rotate(0,0,0);}else{pipe = Instantiate(Resources.Load<GameObject>("Prefabs/Pipe"), new Vector3(8, Random.Range(-3,3),0), Quaternion.identity);}pipe.SetActive(true);pipe.transform.parent = img.transform;float x = Random.Range(-1,1) > 0 ? 0.5333f : -0.5333f;pipe.transform.localPosition = new Vector3(x, Random.Range(-1f,1f),0);}return pipe;}public void free(GameObject pipe) {GameObject tmp = null;foreach (GameObject i in activeList){if (pipe.GetInstanceID() == i.gameObject.GetInstanceID()){tmp = i;break;}}if (tmp != null) {tmp.gameObject.SetActive(false);freeList.Add(tmp);activeList.Remove(tmp);}}
}
使用虚拟按钮,添加相应的事件:
使得一直按着按钮的时候,小球会一直向上运动。
using UnityEngine;
using Vuforia;public class VirtualButtonEventHandler : MonoBehaviour, IVirtualButtonEventHandler {public GameObject vb;public GameObject ball;public float speed = 7f;private Rigidbody rig;public Controller controller;bool isPressed = false;void Start() {VirtualButtonBehaviour vbb = vb.GetComponent<VirtualButtonBehaviour>();if(vbb){vbb.RegisterEventHandler(this);}rig = ball.GetComponent<Rigidbody>();controller = Director.getInstance().currentSceneController as Controller;}public void OnButtonPressed(VirtualButtonBehaviour vb) {if (controller == null) {controller = Director.getInstance().currentSceneController as Controller;return;}if (controller.getState() == 0) {return;}isPressed = true;Debug.Log("Pressed!");}public void OnButtonReleased(VirtualButtonBehaviour vb) {isPressed = false;Debug.Log("Released!");}private void FixedUpdate(){if (isPressed) {rig.velocity = Vector3.up * speed;}}
}
还可以根据情况调整button的灵敏度:
最终效果:
【Unity3d学习】AR技术的简单了解相关推荐
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader
直接看代码,即使已经理解了代码,但是还是会有种没有学到手的感觉.真正的掌握来自实践,来自己动手做出来."简单AB任务切换程序"系列文章的目的是,在bochs下,实践出简单AB两个任 ...
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(3)-调试手段和方法
写底层代码,我们需要特别的手段去调试,去debug.本文针对几种应用场景,介绍几种手段. 1. 查看文件的二进制值 - hexdump命令 以文章(2)中的head程序为例子 ld head.o -m ...
- VR/AR 技术学习园地
VR技术课堂 [熱門話題]&[最近活動] 与您分享我(高焕堂)的VR讲座视频和Q&A VR產业快速入门法,从技术应用.商业模式说起 ==> 请听视频 or 腾讯 ...
- 学习也能身临其境?看AR技术如何改变课堂教育
作者:Yaling Hou 来源:硅谷洞察 海明威的<老人与海>,大家都很熟悉吧!你们的高中老师当年是怎么教这篇课文的呢?朗读.背诵.讲PPT? 这一切将被改变!你能想象吗,不苟言笑的语文 ...
- unity3d学习(三)制作敌人简单AI和发射火球
制作敌人简单AI和发射火球 写在前面: - 学习课本:Unity5实战 使用c#和unity开发多平台游戏-作者:Joseph Hocking - 内容:第三章 -unity3d学习(一)制作第一人称 ...
- 基于Unity3D的AR小游戏开发【100011412】
本科毕业设计(论文) GRADUATION DESIGN(THESIS) 基于 Unity3D 的增强现实游戏程序 摘要 增强现实(AR)作为一项新兴技术近年来被越来越多的人群所获知,AR 也渐渐走进 ...
- Unity3D 学习笔记4 —— UGUI+uLua游戏框架
Unity3D 学习笔记4 -- UGUI+uLua游戏框架 使用到的资料下载地址以及基础知识 框架讲解 拓展热更过程 在这里我们使用的是uLua/cstolua技术空间所以提供的UGUI+uLua的 ...
- 先试后买!解析购物新体验背后的移动AI+AR技术
导读:本文将介绍如何以人像AI算法作为驱动力,结合3D穿戴/2D上妆的仿真渲染,直接将无线AR互动技术切入电商腹地,带来全新的线上购物体验. 背景 AR(增强现实)并不是一个新鲜的词汇,15年开始各大 ...
- 《AR与VR开发实战》——第1章AR技术简介
本节书摘来自华章出版社<AR与VR开发实战>一书中的第1章,第1.1节,作者 张克发 赵兴 谢有龙,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第1章 AR ...
最新文章
- 用onerror处理图片获取失败问题
- python注册人工智能专业_从专业程度上分析Python和人工智能(AI) 它们如何相关?...
- springboot 做表白墙_华农表白墙144期 | 等什么时候,她从我开的花店前经过,我把整个花店送个她可好。...
- poj2976 Dropping tests(01分数规划 好题)
- pytorch数据加载时报错OSError: [Errno 22] Invalid argument
- srand(设置随机数种子)
- MyBatis框架 传参、事务、缓存(二级)
- js动态加载HTML元素时出现的无效的点击事件
- Ruby Fiber指南(五): 实现Actor,兼谈Erlang的process调度
- 电脑小手图标怎么去除_图文教你去除桌面图标箭头_消除电脑图标小箭头的方法-系统城...
- 企业微信打标签功能在企鲸客SCRM管理系统里面的作用
- mysql initialize 什么意思_mysql initialize
- 位运算bitwise_and和bitwise_not函数
- 如何解决在线医疗语音问诊的技术难题 | 以眩晕问诊为例
- Spring Boot 整合MyBatis(23)
- 2014年校园招聘新签约工资待遇
- 前端-Excel在线预览
- Linux C编程下没有 itoa()函数的问题
- 搜图、裁剪一步到位,有人用YOLOv5和CLIP做了一个找图神器,在线可试用
- 手写体数字图像识别图像_手写识别调整笔画大小而不是图像
热门文章
- 5年匠心之作,深度探索Linux虚拟化
- 惯性导航原理(3):姿态微分方程及初始对准
- 全民一起玩python求分享_全民一起玩Python(基础篇+提高篇)
- Artical--2--TCP_IP服务器端/客户端迭代一
- baocms伪静态_baocms7.7 本地生活系统无限制版 功能强大带农家乐版本
- Faster RCNN笔记
- (1-4)sklearn库的----模型评估
- 930页!熬夜整理了一份包含算法+数据结构+大厂面经 高分原创文章的电子书送给你
- INS-32042 安装程序检测到用户oracle 不是主产品清单组成员
- 一个合格的项目管理者应该具备什么能力呢?