前言

最近有新成员加入本团队,为了方便其开发HoloLens1 / HoloLens2,将不定时更新HoloLens相关开发相关内容。

软件需求:

HoloLens 1:VS2017 + Unity2017;HoloLens 2:VS2019 + Unity2019;

1.安装VS2017 / VS2019,HoloLens 1安装Win10 SDK 17134或者17763,HoloLens2要求至少18362;相关安装与配置请参考博文.

2.Unity2017 / Unity2019,安装UWP平台;

注:如果使用的软件为VS2019和Unity2019来开发HoloLens1,可参考HoloLens2的开发过程,修改MRTK的配置文件为HoloLens1即可!可参考博文1,博文2.


以HoloLens结合Vuforia在二维码上显示一个立方体Cube,并实现点击变色为例。

一、Vuforia

1.注册及获取LicenseKey

1.目前世界上主流的AR SDK提供厂商,国外的主要是Vuforia、Metaio,国内的主要是EasyAR。

2.进入Vuforia官网后,点击注册,注册免费账号,登录;

3.在官网Develop-License Manager一栏中,点击“Get Development Key”按钮进行获取LicenseKey;

4.填入当前项目名称,同意协议,执行获取LicenseKey;

5.点击创建的LicenseKey进入到详细内容界面,如图所示,点击复制,保存在本地Txt中便于后期使用;

2.创建项目数据库

1.在官网Develop-Target Manager一栏中,点击“Add Datebase”;


2.进入刚刚新建的Database,点击Add Target,上传识别图;
注意识别图需要特征明显,上传后网站会显示照片特征质量,质量较低的建议重新上传;

1)上图中Type为识别类型,依次为图片,立方体,圆柱体和3D物体,识别图选择类型1;
2)选择对应图片;
3)查看图片详细信息,其像素宽度即为该数值;
4)数据库中该识别图的名称;
点击添加,如下图,勾选后点击下载

二、新建Unity工程,添加Vuforia

1.首先切换平台,“File-Build Settings-UWP”,点击switch Platform;再点击“Player Settings-Other Settings-Scripting Backend”,IL2CPP切换为.NET;点击Add Open Scene,UWP平台的相关配置如图所示。

2.选择菜单栏“Assets-Import Packages-Custom Packages”,选择刚刚下载的文件,点击Import;

3.右键新建Vuforia-AR Camera,删除默认的Main Camera;选中AR Camera,将World Center Mode选为Camera,点击Open Vuforia configuration,填写保存在本地的LicenseKey,相关配置如下;


在Database中取消默认的数据库,激活导入的用户数据库;

4.在面板中右键添加“Vuforia-Image”,选中该ImageTarget,在右侧修改其识别图;
尤其要注意:Image的Scale需要和实际打印的识别图大小保持一致,如这里我识别的图像大小为8cm,所以在Unity中填写Scale为0.08,否则将引起虚拟对象的漂移,与预想位置不符;

5.在面板中选中ImageTarget,右键添加“3D Object->Cube”,可以修改Cube的大小比例;

3.为了方便观察,可以修改Cube的材质。在Assets中右键创建材质,更改材质球颜色,然后拖到Cube上,可以观察到Cube颜色改变。

三、添加脚本,实现点击控制

1.在Assets中新建Script文件夹,在其中新建三个脚本,脚本内容如下。

1)GazeGesture.cs

using UnityEngine;
using UnityEngine.XR.WSA.Input;public class GazeGesture : MonoBehaviour
{public static GazeGesture Instance { get; private set; }// 保存当前凝视的物体;public GameObject FocusedObject { get; private set; }GestureRecognizer recognizer;// Use this for initializationvoid Start(){Instance = this;// 用来检测手势;recognizer = new GestureRecognizer();recognizer.TappedEvent += (source, tapCount, ray) =>{// 向凝视的物体和父物体发送OnSelect消息;if (FocusedObject != null){FocusedObject.SendMessageUpwards("OnSelect");}};recognizer.StartCapturingGestures();}// Update is called once per framevoid Update(){// Figure out which hologram is focused this frame.GameObject oldFocusObject = FocusedObject;//根据头的位置的方向发射射线;// Do a raycast into the world based on the user's// head position and orientation.var headPosition = Camera.main.transform.position;var gazeDirection = Camera.main.transform.forward;RaycastHit hitInfo;if (Physics.Raycast(headPosition, gazeDirection, out hitInfo)){// If the raycast hit a hologram, use that as the focused object.FocusedObject = hitInfo.collider.gameObject;}else{// If the raycast did not hit a hologram, clear the focused object.FocusedObject = null;}// If the focused object changed this frame,// start detecting fresh gestures again.if (FocusedObject != oldFocusObject){recognizer.CancelGestures();recognizer.StartCapturingGestures();}}
}

2)Cursor.cs

using UnityEngine;
public class Cursor : MonoBehaviour
{private MeshRenderer meshRenderer;// Use this for initialization 初始化时候调用void Start(){// Grab the mesh renderer that's on the same object as this script.// 获取 meshRenderermeshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();}// Update is called once per frame 每一帧都会自动更新void Update(){// 根据用户头的位置和朝向发射射线;// head position and orientation.var headPosition = Camera.main.transform.position;//头部位置是相机的位置;var gazeDirection = Camera.main.transform.forward;//头部朝向;RaycastHit hitInfo;//用于存储射线碰撞到的第一个对象信息。需要提前创建这个对象。if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))//Physics.Raycast此静态函数用于在场景中发射一条可以喝碰撞器碰撞的射线{// 如果射线碰到了hologram,显示光标;meshRenderer.enabled = true;// Move the cursor to the point where the raycast hit.把光标移到射线碰撞的地方;this.transform.position = hitInfo.point;//将光标移到射线碰撞位置;将光标与hologram的表面平行;this.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);}else{//如果没有碰到物体隐藏光标;meshRenderer.enabled = false;}}
}

3)执行脚本(CubeScript):

using System.Collections;
using UnityEngine;public class CubeScript : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}public void OnSelect(){//随机变换物体颜色gameObject.GetComponent<MeshRenderer>().material.color = new Color(Random.Range(0, 255) / 255f, Random.Range(0, 255) / 255f, Random.Range(0, 255) / 255f);}
}

2.在面板中分别新建一个空物体和一个Sphere,空物体命名为Manager,Sphere的比例修改为(0.01,0.01,0.01).

3.将GazeGesture脚本拖到Manager上,Cursor脚本拖到Sphere上,执行脚本CubeScript拖至Cube上.

4.选中作为视线的Sphere,在面板中做出以下修改(两种方法任选一种):

1)修改Layer为Ignore Raycast;

2)取下勾选Sphere Collider,添加Rigidbody组件;

如果不进行以上处理,读者可自行尝试可能出现的小问题

四、工程发布与部署

1.工程发布

1.在Unity的player setting中找到Publishing Settings,在Capabilities中勾选:Internet Client、WebCam、Microphone、SpatialPreception;在XR Settings中设置如下。

2.点击Build,选择发布文件夹,生成VS2017解决方案.

2.工程部署

1.双击打开生成目录中的VS工程,选中“Package.appxmanifest”,右键选择“查看代码”,修改以下内容;如果出现提示打不开,多尝试几次即可。


2.选择Debug,x86平台,用USB连接HoloLens与PC,选择Device,“调试-开始执行(不调试)”,点击运行。

3.第一次连接HoloLens部署工程需要输入PIN码,根据提示,在HoloLens的设置中,选择安全-开发者选项,点击Pair,在PC输入HoloLens中出现的6位PIN码即可。

4.部署成功后,在HoloLens端打开程序,扫描二维码即可看到Cube,点击Cube颜色改变!

总结

以上是HoloLens1结合Vuforia开发的简单Demo以及程序发布与部署流程,欢迎批评指正!

项目工程获取网盘. 提取码:36ry 或码云.

HoloLens1开发(二):结合Vuforia开发相关推荐

  1. 蓝牙mesh系统开发二 mesh节点开发

    前言 在开发蓝牙mesh系统中,使用泰凌微8258的蓝牙作为节点方案,本章讲解通过8258搭建普通mesh节点,ble mesh基础可以点这里 SDK获取 下载SIG MESH SDK mesh项目工 ...

  2. Android 10.0 关机对话框UI定制化开发(二)

    1.概述 在10.0的定制化开发中,需要对关机对话框的UI界面进行定制化开发,需要对话框全屏,去掉多余项保留关机 重启 飞行模式 静音模式等选项 现在开始定制化二的开发 实现关机 重启 飞行模式 静音 ...

  3. Vuforia开发完全指南

    作者:Mac玩家 原文:Vuforia开发完全指南(二)--- 不懂编程也能做AR程序 链接:https://www.jianshu.com/p/5871935aba02 來源:简书 简书著作权归作者 ...

  4. 使用高通Vuforia开发AR增强现实游戏(开篇)

    @废话在前 之前想做暴风魔镜的VR游戏,最后来香港学习设备没带过来就没继续做,现在开始学习研究做一下AR游戏开发,毕竟对设备的要求比较低,很方便,看了不少资料,最后还是选了Vuforia这个经典的AR ...

  5. springboot flask php,使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发(二)

    使用Vue完成前后端分离开发(二) Bravery never goes out of fashion. 勇敢永远不过时. 前面简单说了一下 Vue 项目的搭建和项目的大致页面,这里讲一下 Djang ...

  6. 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置...

    今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎 ...

  7. Qt计算器开发(二):信号槽实现数学表达式合法性检查

    表达式的合法性 由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式.然而假设用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比方, ...

  8. SQL2K数据库开发二十三之索引操作重建索引

    1.可以使用下面的语句创建索引,重建索引应使用DROP_EXISTING选项. 2.在SQL Server查询分析器中输入如下的SQL语句,点击工具栏上的执行查询图标. 3.查询语句执行完毕后,结果窗 ...

  9. 以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约

    以太坊开发(二)使用Ganache CLI在私有链上搭建智能合约 在上一篇文章中,我们使用Truffle自带的客户端Truffle Develop,在私有链上搭建并运行了官方提供的WebPack智能合 ...

最新文章

  1. 8个让人相见恨晚的软件,每一款都十分良心
  2. Java黑皮书课后题第6章:6.1(数学:五角数)一个五角数被定义为n*(3*n-1)/2,其中n=1、2…。所以开始的几个数字就是1、5、12、22…,编写具有以下方法头的方法,返回一个五角数
  3. 【自用】 TensorFlow merge_all_summaries SummaryWriter 报错问题
  4. SAP UI5 应用开发教程之二十五 - 使用代理服务器解决 SAP UI5 应用访问远端 OData 服务的跨域问题
  5. 真香警告!2021Android高级面试题,挥泪整理面经
  6. Asp.net MVC 3实例学习之ExtShop(六)——登录对话框
  7. 遵化计算机培训,遵化人力资源培训
  8. c语言中typeof关键字
  9. c语言火车票管理系统360问答,C语言 车票管理系统 前面一点点的程序,不知道报错是什么意思,可以解释一下吗?代码的具体问题是什么...
  10. 【OpenCV入门指南】第六篇 轮廓检测 下
  11. fpv freerider穿越机模拟器怎么和HTC Vive vr 设备连接配置
  12. Java怎么安装 详细教程来了 附带安装包
  13. 用python写Hello World
  14. IcedTea6版本1.8
  15. 华为手机隐藏的3大功能,现在才知道,怪不得别人手机这么好用
  16. Python 圆的周长和面积计算
  17. 关于2D-DCT字典和克罗内克积以及二维字典的separable特性的个人理解
  18. 使用AutoIt获取控件信息
  19. 超文本传输协议-HTTP/1.1
  20. 【Unity3D】 读写 CSV 数据表

热门文章

  1. android AsyncTask 只能在线程池里单个运行的问题
  2. dynamic的使用
  3. 企业实战|Mysql不停机维护主从同步
  4. CentOS 7防火墙开启路由功能和开放特定端口
  5. VBA处理文件框架代码 【第七部分:程序页面布局】
  6. safari浏览器中的菜单栏中,显示[开发]按钮
  7. 查看目录下所有文件 dir 。
  8. java什么会引用传递_在java中为什么很多人说有值传递和引用传递?引用传递的本质...
  9. 【Python】Python中文编码
  10. 微信小程序获取windowHeight出现不同页面高度不一致问题及解决方案