【Unity3d学习】AR技术的简单了解

2023-11-16

写在前面

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 update
    void 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 frame
    void 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 update
    void Start()
    {
        rig = GetComponent<Rigidbody>();
        controller = Director.getInstance().currentSceneController as Controller;
    }

    // Update is called once per frame
    void 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的灵敏度:
在这里插入图片描述

最终效果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity3d学习】AR技术的简单了解 的相关文章

  • 正则匹配规则

    规则1 优先选择最左端的匹配结果 Rule 1 The Match That Begins Earliest Wins 根据这条规则 起始位置最靠左的匹配结果总是优先于其他可能的匹配结果 这条规则并没有规定优先的匹配结果的长度 稍后将会讨论
  • Java项目本地访问resource目录文件运行正常,打包成jar后提示没有那个文件目录

    本地获取方法代码入下 这种方式得到的路径 打包成jar后会访问不到这个路径 this getClass getClassLoader getResource FONT PATH getPath usr local api fxq contr
  • Android开发环境的搭建

    Android开发环境的搭建 在开始Android开发之旅启动之前 首先要搭建环境 然后创建一个简单的HelloWorld 本文的主题如下 1 环境搭建 1 1 JDK安装 1 2 Eclipse安装 1 3 Android SDK安装 1
  • 生于1999年的11家互联网公司:为何唯独阿里巴巴化茧成蝶?

    1999年 是中国互联网发展史上颇具传奇性的一年 这一年 QQ的前身OICQ横空出世 搜狐和张朝阳风头正劲 李彦宏辞职回京创业 李国庆创立当当 陈天桥创立盛大 马云创立了阿里巴巴 同一起跑线之下 还有携程 中华网 易趣 天涯社区 8848
  • Map 转化为数组

    含义 Map 数据结构类似于对象 也是键值对的集合 但是键的范围不限于字符串 各种类型的值 包括对象 都可以当做键 Map 结构提供了 值 值 的对应 是更完善的 Hash 结构实现 Map 可以作为构造函数 新建 Map new Map
  • python distutils、setuptools打包第三方库

    1 项目目录 src 引用时的包名 可随意修改 http 子类包名 可随意修改 init py xxx py init py xxx py readme md setup py 打包信息 例如上命名方式 打包后引用时为 import src
  • 如何在 Python 中终止 Windows 上运行的进程?

    当深入研究Windows操作系统上的Python开发领域时 无疑会出现需要终止正在运行的进程的情况 这种终止背后的动机可能涵盖多种情况 包括无响应 过度资源消耗或仅仅是停止脚本执行的必要性 在这篇综合性的文章中 我们将探讨各种方法来完成使用
  • 算法二分查找之第一个错误的版本

    java方法 The isBadVersion API is defined in the parent class VersionControl boolean isBadVersion int version public class
  • P-tuning v2 利用深度提示调优

    P tuning v2 利用深度提示调优 即对预训练变压器的每一层输入应用连续提示 Deep prompt tuning 增加了连续提示的能力 并缩小了跨各种设置进行微调的差距 特别是对于小型模型和艰巨的任务 感谢 rainatam 为发布
  • 网络数据保障ptop_智能IP网络,引领广域网进入全业务智能时代

    当前 伴随数字化的浪潮 各行各业都在加速数字化探索和转型 对企业而言 数字化转型的根本是通过对业务模式 业务流程 企业组织的改造 让所有的业务能够基于数据进行驱动 实现更好的客户体验和更高的组织效能 从而推动业务的增长 企业数字化转型的终极
  • 在 BSV 上构建机器学习竞赛市场

    我们提出了一种在 BSV 上实现去中心化机器学习 ML 市场的新方法 任何人都可以通过发布附带奖励的智能合约来外包机器学习任务 任何提交表现最佳模型的人都将通过区块链交易获得奖励 而无需通过中心化机构 如何在 BSV 上进行机器学习竞赛 K
  • 1.2 管理 NetBackup 许可证

    关于管理 NetBackup 许可证 NetBackup许可证密钥是在安装软件时添加的 对于需要单独购买的选件 可以稍 后在 许可证密钥 对话框中添加许可证 注意 在进行任何许可证更新之后 请重新启动 NetBackup 管理控制台 注意
  • Fedora 18 安装VMware Tools

    1 宿主机 windows 8 4G内存 2 虚拟机 VMware 9 0 1 3 虚拟主机 VMware下Fedora 18 1G内存 VMware Tools是VMware虚拟机中自带的一种增强工具 相当于 VirtualBox 中的增
  • ipv6文件服务器,ipv6怎么配置服务器

    ipv6怎么配置服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 IPv6的使用 可以有效弥补IPv4网络地址资源有
  • StrongSORT(deepsort强化版)浅实战+代码解析

    1 实战部分 1 1 具体操作 其实和之前的deepsort没差 到github上下载Yolov5 StrongSORT OSNet 下载对应的yolov5去替代原文件中yolov5 下载yolov5权重 可以自动下载 和ReID权重 可能

随机推荐

  • (Java 基础知识) Java 正则表达式

    一 概述 正则表达式是Java处理字符串 文本的重要工具 Java对正则表达式的处理集中在以下两个两个类 java util regex Matcher 模式类 用来表示一个编译过的正则表达式 java util regex Pattern
  • 编译原理三大经典书籍(龙书 虎书 鲸书)

    1 龙书 Dragon book 英文名 Compilers Principles Techniques and Tools 作者 Alfred V Aho Ravi Sethi Jeffrey D Ullman 中文名 编译原理技术和工具
  • 《python语言程序设计》第5章第10题 里EOFError:EOF when reading a line? 问题的解决(小白分享)

    废话不多说上题 编写程序提示用户输入学生个数以及每个学生的分数 然后显示最高分 假设输入是存储在一个名为score txt的文件 程序从这个文件获取输入 codeNumber eval input Enter class input 输入学
  • 位运算的那些奇技淫巧

    这里写目录标题 一 常 装 见 逼 的位操作 先看几个有意思的位操作 1 判断奇数偶数 2 交换两个数字 3 找出没有重复的数字 4 m的n次方 5 判断一个数是不是二的指数 6 找出不大于N的最大2的幂指数 二 leetcode解题 13
  • LINQ语句查询

    连接数据库 Linq语句查询 目前的学习进度来说也就是我们的单表和多表查询 它为匿名类型查询提供了一种很方便的方法 可用来将一组只读属性封装到单个对象中 而且还不需要先定义一个显示类型 因为它的类型名字直接由编译器生成 而且每一个属性的类型
  • 算法---栈的最小值

    实现一个这样的栈 这个栈除了可以进行普通的push pop操作以外 还可以进行getMin的操作 getMin方法被调用后 会返回当前栈的最小值 栈里面存放的都是 int 整数 并且数值的范围是 100000 100000 要求所有操作的时
  • 关于css nth-child

    选择第n个 n位数字 nth child n 选择列表中的偶数标签 nth child 2n 选择列表中的奇数标签 nth child 2n 1 选择前几个元素 负方向范围 选择第1个到第6个 nth child n 6 从第几个开始选择
  • FreeBSD简单汉化终结篇[基于core font的汉化]

    此贴解决了FreeBSD基本的汉化 字体的模糊 Win分区的 中文显示 XMMS的菜单及其他的中文显示 输入法fcitx的 安装等问题 1 安装kde i18n zh CN cd usr ports chinese kde3 i18n zh
  • 硬件参数 调整 麦克风MIC灵敏度 原理

    1 先看MIC电路连接 这是个差分输入的例子 MICP2和MICN2是一对差分信号 经过C156的滤波 输入到MIC两端 MIC两引脚分别是到地和供电 上图的R177参数就关系到MIC输入的灵敏度 2 电阻R177影响灵敏度分析 MICBI
  • three.js中通过gsap动画库实现物体的动画

    一 什么是gsap GSAP GreenSock Animation Platform 是一个JavaScript动画库 由GreenSock公司开发 用于在Web应用程序中创建高性能动画 使用GSAP可以通过一些简单的动画操作来实现复杂的
  • C语言怎么把int类型转为char,c++ 如何把一个int转为char*

    把int类型数字转成char类型 可以使用以下方法 char b 4 i nt a for int i 00 i lt 4 i b i char a a a gt gt 8 int用于符号 int s 符号表达式s的不定积分 int s v
  • DAPP开发之-Truffle命令手册

    安装框架 npm install g truffle 初始化 truffle init 编译 truffle compile 网络配置 truffle config 或 config 配置网络 例如 BSC测试网 mnemonic为助记词
  • Quartus II运行综合时警告Warning 15714

    Quartus II运行综合时警告Warning 15714 一 出现问题 第一次使用Quartus II编译项目代码时 软件报告如下警告 意思就是管脚有不完整的I O分配 二 问题解决 我当时也没多想 直接百度 看到一篇回答如下 看到这里
  • 11.Xaml DatePicker控件 时间控件

    1 运行效果 2 运行源码 a Xaml源码
  • python基础----03-----if语句、while、for循环、range语句、continue和break

    一 布尔类型和比较运算符 1 1 布尔类型和比较运算符 定义变量存储布尔类型数据 变量名称 布尔类型字面量 布尔类型不仅可以自行定义同时也可以通过计算的来 也就是使用比较运算符进行比较运算得到布尔类型的结果 在C C 中 比较运算符称之为关
  • 聊聊HotSpot VM的Native Memory Tracking

    序 本文主要研究一下HotSpot VM的Native Memory Tracking Native Memory Tracking java8给HotSpot VM引入了Native Memory Tracking NMT 特性 可以用于
  • react-router v6嵌套路由简单案例

    react router V6版本路由用法和V5用法差距较大 一个简单的使用案例 新版本组件也开始使用函数式组件 hooks react router dom 6 2 1 1 入口main import App css import Bro
  • 删除符合一定条件的若干行数据

    关键 删除month字段中内容是 1 2 6 7 8 9 10 11 12 的行 data data data month isin 1 2 6 7 8 9 10 11 12 仅删除字段名为month的一整列数据 data data dro
  • squid源码安装下的conf文件默认值和提示

    WELCOME TO SQUID 3 0 STABLE26 This is the default Squid configuration file You may wish to look at the Squid home page h
  • 【Unity3d学习】AR技术的简单了解

    文章目录 写在前面 AR简介 Vuforia使用 Unity内嵌的Vuforia模块 使用Vuforia的AR组件 使用AR Camera组件 添加虚拟按钮 AR小游戏制作 写在前面 本次项目Github地址 传送门 本次项目的视频演示地址