前言

注意:本文已更新到5.5.1f1版本

个人建议,学习Holograms 230之前,一定完成《Hololens官方教程精简版 - 02. Introduction with Device》的学习。

本篇集中学习空间映射功能,完成以下目标:

Chapter 1 - 空间扫描

目标

  • 完成空间扫描
  • 替换三角面材质

实践

完成空间扫描

  1. 请按照第一篇的教程,完成项目的创建。
  2. 新建文件夹:”Assets/_Scenes/Holograms 230/”
  3. 新建场景:”Assets/_Scenes/Holograms 230/Holograms 230.unity
  4. 打开场景,删除默认的Main Camera
  5. 将”Assets/HoloToolkit/Input/Prefabs/HololensCamera.prefab”添加到Hierarchy根级
  6. 将”Assets/HoloToolkit/Input/Prefabs/InputManager.prefab”添加到Hierarchy根级
  7. 将”Assets/HoloToolkit/Input/Prefabs/Cursor/DefaultCursor.prefab”添加到Hierarchy根级
  8. 将”Assets/HoloToolkit/SpatialMapping/Prefabs/SpatialMapping.prefab”添加到Hierarchy根级

本节完成!

使用Hololens远程连接Unity进行调试,等待“一段时间”(这个一段时间,第一次可能很长……)。将会看到Hololens根据空间扫描结果,绘制了很多三角面。

替换三角面材质

  1. 点击SpatialMapping
  2. 找到Inspector面板中的Surface Material,替换为SpatialUnderstandingSurface

本节完成!

再次测试,会发现三角面的材质被替换。

Chapter 2 - 扫描结果处理

目标

扫描结束后,用手势点击,将扫描结果转换为地板模型

实践

  1. Hierarchy面板根级,新建空对象,重命名为:Controller
  2. 点击Controller,在Inspector面板中点击Add Component,加入:Surface Meshes To Planes组件
  3. 点击Surface Meshes To Planes组件属性Surface Plane Prefab右侧的圆钮,选择:SurfacePlane
  4. 同第2步相同的方法,为Controller添加Remove Surface Vertices
  5. 新建文件夹:”Assets/_Scenes/Holograms 230/Scripts/”
  6. 新建脚本文件:”Assets/_Scenes/Holograms 230/Scripts/Controller230.cs“,并附加到Controller
  7. 编辑脚本如下:

    using System.Collections.Generic;
    using UnityEngine;
    using HoloToolkit.Unity;public class Controller230 : Singleton<Controller230> {[Tooltip("扫描过多少秒开始转换")]public float scanTime = 30.0f;[Tooltip("扫描时使用的材质")]public Material defaultMaterial;[Tooltip("停止扫描所使用的材质")]public Material secondaryMaterial;[Tooltip("最小Plane实体数量")]public uint minimumPlanes = 10;/// <summary>/// 判断是否正在处理Mesh/// </summary>private bool meshesProcessed = false;private void Start(){// 设置空间扫描器的材质为默认材质SpatialMappingManager.Instance.SetSurfaceMaterial(defaultMaterial);// 网格转Plane实体完成后的事件监听SurfaceMeshesToPlanes.Instance.MakePlanesComplete += SurfaceMeshesToPlanes_MakePlanesComplete;}private void Update(){if (!meshesProcessed){if ((Time.time - SpatialMappingManager.Instance.StartTime) < scanTime){// 还未到指定扫描耗时,则跳过}else{// 停止扫描器if (SpatialMappingManager.Instance.IsObserverRunning()){SpatialMappingManager.Instance.StopObserver();}// 开始将网格转换为PlaneCreatePlanes();meshesProcessed = true;}}}private void SurfaceMeshesToPlanes_MakePlanesComplete(object source, System.EventArgs args){// 获取转换后得到的Plane实体对象List<GameObject> planes = new List<GameObject>();planes = SurfaceMeshesToPlanes.Instance.GetActivePlanes(PlaneTypes.Wall | PlaneTypes.Floor | PlaneTypes.Table);// 如果大于我们设置的最小Plane识别值,则对Plane做进一步处理if (planes.Count >= minimumPlanes){// 将与Plane实体重叠的顶点删除RemoveVertices(SurfaceMeshesToPlanes.Instance.ActivePlanes);// 扫描结束后,切换第二个材质,本例中使用了“剔除材质(使用了一个剔除Shader)”,即除了Plane外,其他的三角面将被隐藏SpatialMappingManager.Instance.SetSurfaceMaterial(secondaryMaterial);}else{// 未达到最小Plane识别数,继续扫描SpatialMappingManager.Instance.StartObserver();meshesProcessed = false;}}/// <summary>/// 扫描网格转Plane实体/// </summary>private void CreatePlanes(){SurfaceMeshesToPlanes surfaceToPlanes = SurfaceMeshesToPlanes.Instance;if (surfaceToPlanes != null && surfaceToPlanes.enabled){surfaceToPlanes.MakePlanes();}}/// <summary>/// 移除与指定对象组重叠的顶点/// </summary>private void RemoveVertices(IEnumerable<GameObject> boundingObjects){RemoveSurfaceVertices removeVerts = RemoveSurfaceVertices.Instance;if (removeVerts != null && removeVerts.enabled){removeVerts.RemoveSurfaceVerticesWithinBounds(boundingObjects);}}protected override void OnDestroy(){if (SurfaceMeshesToPlanes.Instance != null){SurfaceMeshesToPlanes.Instance.MakePlanesComplete -= SurfaceMeshesToPlanes_MakePlanesComplete;}base.OnDestroy();}
    }

    注意:5.5.1f1版本中,名称空间有所变化,大家可自行引入

  8. 如下图设置各个组件:

本节完成!

设备远程连接Unity进行调试,等待片刻,空间扫描的网格会转换为地板

说明

  • Surface Meshes To Planes脚本
    将扫描的网格转换为实体,在其Inspector面板中,找到Draw Planes属性,可以设置需要转换的类型,本例中设置了只转换Floor(地板),见上图标注青色的部分。
  • Remove Surface Vertices脚本
    把与实体重合的网格删除

Chapter 3 - 放置物体

目标

将物体放置到地板上

实践

  1. 根级创建一个Cube,设置如下:

  2. Cube添加Tap To Place脚本

  3. Controller添加World Anchor Manager脚本

本节完成!

点击Cube后,Cube会随视线移动,但只能贴合到已经创建的地板上。
再次点击Cube进行放置操作。同时,系统会记录下Cube的空间位置。下次启动时,Cube回还原到该位置。

说明

  • World Anchor Manager
    用来管理全息空间的物体锚点
    使用WorldAnchorManager.Instance.AttachAnchor(GameObject gameObjectToAnchor, string anchorName),即可为物体添加全息空间锚点信息,从而“固化”物体的空间位置(混合现实的显著特征之一)。
  • Tap To Place
    放置物体(包含空间模型的检测)。核心功能就两个:

    • 放置过程中,使用Raycast方法,实时设置物体的位置
    • 放置完成后,使用上面提到的AttachAnchor(...)来”固化”物体位置

Chapter 4 - 空间遮挡

本节主要通过射线判断摄像机和目标物体间有没有被其他物体遮挡,进而对物体进行进行类似隐藏的处理(当然,官方使用了自己的Shader来实现)。不作为精简版的内容。有兴趣的朋友可以自行研究。

小结

  • SpatialMapping.prefab
    空间扫描最核心的组件,内部使用Unity提供的SurfaceObserver工具进行空间扫描,从而获取到扫描数据。
  • Surface Meshes To Planes
    识别扫描数据的类型(墙、地、桌等),进而转换为对应的模型。内部使用PlaneFinding类对扫描数据进行分析。
  • PlaneFinding
    空间扫描物体的类型识别算法核心组件。涉及到大量的运算,生产环境中,禁止参与Unity的主线程运算。可参考Surface Meshes To Planes源码自行使用。
  • Remove Surface Vertices
    移除与指定物体列表相重叠的空间三角形。
  • World Anchor Manager
    空间锚点管理器,“固化”物体到空间的核心组件。

参考文档
官方教程Holograms 230:https://developer.microsoft.com/en-us/windows/mixed-reality/holograms_230


VR/AR/MR技术交流QQ群:594299228

Hololens官方教程精简版 - 07. Spatial mapping(空间映射)相关推荐

  1. Hololens官方教程精简版 - 08. Sharing holograms(共享全息影像)

    前言 注意:本文已更新到5.5.1f1版本 本篇集中学习全息影像"共享"的功能,以实现在同一房间的人,看到"同一个物体".之所以打引号,是因为,每个人看到的并非 ...

  2. Hololens 开发笔记(2)——Spatial Mapping

    原文链接:Hololens 开发笔记(11)--Spatial Mapping_Jitwxs的博客-CSDN博客 Hololens 作为一款混合现实设备,其与传统 VR/AR 设备最大的区别是,能够和 ...

  3. 微软官方XP精简版 FLP入门版SP3截图

    导读:         Windows Fundamentals for Legacy PCs作为官方发布的精简版Windows XP,与XP SP2基于相同的内核.         所以它同样适用于 ...

  4. 微软官方的精简版Windows 7——Windows Thin PC

    Windows Thin PC是微软的Window 7的精简版本,它的一个非常明显的特点是系统资源占用小.如下是官方的系统配置需求: CPU:    主频1 GHz 内存:    1GB(实际占用约5 ...

  5. Uniapp教程精简版

    uniapp中似乎默认是严格模式 必须声明变量 https://ask.dcloud.net.cn/article/35657 这个写得好 promise化 还有vue2和3不一样 https://u ...

  6. [洪流学堂]Hololens开发高级篇5:空间映射(Spatial mapping)

    本教程基于Unity2017.2及Visual Studio 2017 本教程编写时间:2017年12月16日 本文内容提要 空间映射让holograms了解周围环境,将真实世界和虚拟世界更好地结合在 ...

  7. Hololens Spatial Mapping功能实现

    HoloToolkit项目是一组开发包,是微软基于unity内置的底层API封装的一套工具集合,帮助我们快速使用Unity集成开发hololens应用. 本文主要通过源码研究其中Spatial Map ...

  8. Unity中实现Hololens的三维空间映射Spatial mapping

    hololens最出色的功能就是他对环境的空间扫描和重建功能,在unity的Hololens示例中,有完整的三维重建代码,本文主要讨论如何在Unity项目中集成空间映射功能.Unity内置了对空间映射 ...

  9. qnap虚拟linux,QNAP进阶教程:威联通NAS 虚拟机教程 安装精简版win10、软路由、群晖NAS系统!...

    威联通最具体的虚拟机利用方式之一,接待点赞.收藏! 6 t* L# m7 X+ E前言 - A- ^8 |# l0 E' E$ k大师好,俺又来了!5 G, c% {7 ]- Z6 Q$ ] 4 }% ...

最新文章

  1. pyinstaller 工具起步
  2. JVM与Dalvik
  3. Hashtable的测试
  4. php制作后台驻留执行 ,同时提前返回逻辑信息进行判断的实例
  5. MyEclipse断点调试不可用解决办法
  6. CSS Sprite的应用【转】
  7. linux三种连接方式
  8. 如何将PDF设置为只读?
  9. BMS一体机 锂电池管理系统
  10. Linux Centos 78 计划任务 开机自动启动 查杀木马过程-使用 rootkit 隐藏踪迹
  11. 浪潮nf5280m5默认ipmi_NF5180M5- IPMI设置
  12. 字节跳动员工晒出税后工资,网友:怀疑你是日薪
  13. 46zTree - Metro 风格的左侧菜单
  14. 【那些年,我们一起追的女孩】第十一章
  15. 阿里云服务器发送邮箱失败问题
  16. Google登录接入
  17. RT-Thread studio配置can hal库 驱动GM6020
  18. 〖ChatGPT实践指南 - 零基础扫盲篇⑥〗- OpenAI API 报错An error occurred during your request
  19. Deepin系统应用商店 不可用 解决办法
  20. [推荐]php编码规范

热门文章

  1. iOS开发-fishhook交换NSLog函数实现
  2. python权限为啥被拒绝_来自Python的“权限被拒绝”
  3. QT绘图常用功能 Trick: QT带背景图和文字的QPushButton制作
  4. 样条函数 matlab,三次样条函数及MATLAB
  5. 项目管理之感想与反思
  6. python [0]*n
  7. 做个小本生意怎么赚钱
  8. Journal of Air Transport Management 航空运输管理论文
  9. 阿里巴巴的天池中间件大赛总结
  10. 极光推送关于证书的一些问题