HoloLens-Unity 学习笔记1 空间映射(译)
csdh11 2024-12-12 11:18 25 浏览
欢迎加入Hololens-AR开发者专属群 418092645 长按复制
空间映射通过将环境全息化结合了虚拟和现实世界。在本节重,我们将学会:
扫描环境并将数据通过HoloLens传输到开发设备上
通过shaders将空间进行可视化
通过mesh处理将房间转化简单平面
通过之前101节学习的知识,在一些可替代的地方提供一些反馈
通过阻塞效果,使我们在一面真实物体后也能看到物体的全息X光线
准备工作
开发环境配置正确的Windows 10 PC
基本的C#编程能力
完成了101节的学习
开发环境配置正确的HoloLens设备
项目文件
下载项目所需文件(https://github.com/Microsoft/HolographicAcademy/archive/Holograms-230-SpatialMapping.zip)
解压上面所下载文件
注意
为了定位到断点,需要在Visual Studio中关闭”只使用我的代码”功能, 工具->选项->Debugging
Unity项目配置
启动Unity
新建项目 Planetarium
确定已勾选3D
Unity项目启动后, 打开 Edit >Project Settings > Player
在Inspector面板中,找到并打开Windows Store
展开 Other Settings
勾选 Use 16-bit Depth Buffers
勾选 Virtual Reality Supported
在 Virtual Reality SDKs 列表中查看是否已经有Windows Holographic ,若无则通过+进行添加
展开 Publishing Settings
在 Capabilities 中勾选:InternetClientServer, PrivateNetworkClientServer, Microphone, SpatialPerception
打开 Edit > Project Settings > Quality
在Inspector面板的 Windows Store下,将Defuat行切换为 Fastes
打开 Assets > Import Package > Custom Package
进入 HolographicAcademy-Holograms-230-SpatialMapping\Starting 文件夹下
选择 Planetarium.unitypackage ,在弹出的新窗口中点击导入
在 Hierarchy 面板,删除 Main Camera
在 Project 面板, HoloToolkit\Utilities\Prefabs 路径下找到 Main Camera
将Main Camera 拖入Hierarchy 面板中
在 Hierarchy 面板,删除 Directional Light
在 Project 面板的 Holograms 中找到 Cursor
将 Cursor拖到 Hierarchy 中
选中 Hierarchy 中Cursor ,在 Inspector 面板顶部 Layer 的下拉菜单选择Edit Layers….
将 User Layer 31 命名为 SpatialMapping
保存当前Scene: File > Save Scene As…
创建一个新的文件夹 Scenes , 并将当前Scene命名为 Planetarium 保存
Chapter 1 – 扫描
目标:
学习 SurfaceObserver 以及修改其属性对效果的影响
对你的房间进行扫描和收集Meshes信息
步骤
在Unity编辑器的 Project 面板 HoloToolkit\SpatialMapping\Prefabs 文件夹中找到 SpatialMapping
将 SpatialMapping 拖入 Hierarchy 面板
编译与部署(Part 1)
在Unity中选择 File > Build Settings.
点击 Add Open Scenes 来将 Planetarium scene 进行编译.
选择Platform 中的 Windows Store 并点击 Switch Platform.
将 SDK 设置为 Universal 10 ,将 UWP Build Type 设置为 D3D.
勾选 Unity C# Projects.
点击 Build.
在弹出的窗口中创建新文件夹并命名为 “App”.
打开 App 文件夹,点击选择.
Press the Select Folder button.
编译完成后,在新弹出的窗口中打开App文件夹
打开 Planetarium.sln
在 Visual Studio 顶部的配置栏中将Debug切换为 Release.
将平台设置为 x86.
通过“本地计算机”边的下拉窗口选择 远程计算机.
在弹出的新窗口中输入HoloLens的本地IP,并将认证模式切换为 通用(通用端口)
点击 Debug -> Start Without debugging 或者按下 Ctrl + F5.
在 输出 面板中查看编译和部署信息.
当程序运行起来后,你会看到周围的景物表面被黑色白边的网格所覆盖.
扫描你周围的景物。 确认所扫面的是墙面、地板或者天花板
编译与部署(Part 2)
现在看看空间映射对展示效果的影响
在Unity中选择 Window > Profiler.
点击 Add Profiler > GPU.
在 Active Profiler > <Enter IP>中输入HoloLens的IP地址,并连接
观察设备渲染出一帧所需时间.
停止运行设备上的应用
返回Visual Studio,在 Assembly-CSharp (Universal Windows)项目的HoloToolkit\SpatialMapping文件夹下找到并打开 SpatialMappingObserver.cs.
在代码中找到 Awake() 并添加 TrianglesPerCubicMeter = 1200;
重新编译运行程序。 观察渲染一帧所需时间的变化.
停止运行设备上的应用
在Unity中保存和加载
最后,我们在Unity中保存和读取我们房间Mesh
返回 Visual Studio,在SpatialMappingObserver.cs中删除之前添加的 TrianglesPerCubicMeter = 1200;
重新部署项目到HoloLens,现在我们立平方将会使用回500个三角形
通过Edge浏览器,输入HoloLens的IP地址进入HoloLens
选择左侧面板中 3D View 选项
在Surface reconstruction下选择Update选项
在显示的窗口中查看我们通过HoloLens扫描的结果
通过Save按钮保存扫描结果
在Downloads目录下找到房间的扫描模型SRMesh.obj
复制SRMesh.obj 到Unity项目下Assets 文件夹内
在Unity编辑器的Hierarchy面板中选择 SpatialMapping
在Inspector中找到Object Surface Observer (Script) 组件
点击Room Model 右边的圆圈,并在弹出的窗口中选中SRMesh
点击 Unity 上方 Play 按钮进入预览模式
SpatialMapping组件将读取房间模型的网格,并让你能在Unity中使用它们
切换到 Scene 窗口,你将看到你房间模型
再次点击 Play 来离开预览模式
NOTE: 下次进入预览模式时,Unity将默认读取保存的房间网格
Chapter 2 – 可视化
目标:
学习Shader基本知识
将周围景物进行可视化
步骤
在Unity Hierarchy 面板中,选中SpatialMapping
在 Inspector 面板中, 找到 Spatial Mapping Manager (Script) 组件.
点击 Surface Material 右侧的圆圈,并在弹出窗口中找到并选择 BlueLinesOnWalls 素材.
在 Project 面板中找到 Shaders 文件夹, 通过双击打开 BlueLinesOnWalls ,并在Visual Studio中查看该Shader。
这是个简单的像素shader, 它将实现以下效果:
将顶点的坐标转换到世界坐标中
通过检验顶点的法向量确认像素是否是垂直的
改变渲染像素的颜色
编译与部署
在Unity中点击 Play 进入预览模式
房间mesh(默认从已保存的数据中读取)中的竖直表面将被渲染成蓝色的线条
通过上方的 Scene 查看整个房间在Unity中显示的效果
在 Project 面板, 找到并选择 Materials 文件夹下 BlueLinesOnWalls 材质
在 Inspector 修改 LineScale 和 LinesPerMeter 的值来改变墙面的显示效果
点击 Play 退出预览模式
编译和部署到HoloLens来查看真实效果
尽管Unity提供了很好的预览材质,但是通过设备来查看渲染效果也是不错的选择
Chapter 3 – 处理
目标:
学习处理空间映射的数据,使其可以在应用中被使用
分析空间映射数据找到平面并删去三角形
用屏幕替代图形
步骤
在Unity的Project 面板的Holograms 文件夹, 找到SpatialProcessing
拖拽SpatialProcessing 到 Hierarchy 面板
SpatialProcessing prefab 包含了处理空间映射数据的组件。SurfaceMeshesToPlanes.cs将找到并生成平面。我们将在应用中使用平面来替换墙面、地板和天花板。此prefab包含了可以从空间映射mesh删除顶点的脚本RemoveSurfaceVertices.cs 。这个脚本可以用来在mesh上创建空洞,也可以删除不需要的多余三角形(已经使用平面进行替换)。
在Unity的Project 面板中,打开Holograms文件夹,找到SpaceCollection
拖拽SpaceCollection到Hierarchy面板
在Hierarchy面板中,选中SpatialProcessing
在Inspector面板中找到Play Space Manager (Script)组件
双击PlaySpaceManager.cs并通过Visual Studio打开脚本
PlaySpaceManager.cs包含了一些特定代码,我们增加一些方法来开启以下功能:
当超出时间(10秒)限制时,停止收集空间映射数据
对空间映射数据进行处理:
使用SurfaceMeshesToPlanes创建一些平面墙面、地板以及天花板等
使用SurfaceMeshesToPlanes删除在平面范围内的表面三角
生成一些全息图并将他们放置到用户附近的墙面和地板上
完成PlaySpaceManager.cs标记的代码练习,或者使用下面的已完成的脚本替换该脚本:
PlaySpaceManager.cs
13.3 KB
部署和编译
在部署到HoloLens前,点击Unity的 Play按钮进入play模式
在读取完room mesh后,等待10秒候开始处理空间映射的mesh
当处理结束,地板、墙面和天花板将被屏幕替代
在所有平面都被检测完毕候,可以看到一个太阳系出现在相机附近的桌面或地板上
在相机附近的墙上能够看到两张壁画。如果在 Game mode找不到,切换到 Scene 再查看
点击 Play按钮退出play mode
编译和部署到HoloLens上
等待完成扫描和处理空间映射数据
当看到平面时,在视野中找找太阳系和油画
Chapter 4 – 放置
目标
检测一个图形是否合适放在表面上
当图形能/不能放到一个面上时,反馈信息给用户
步骤
在Unity的 Hierarchy面板,选中SpatialProcessing
在 Inspector面板,找到脚本组件 Surface Meshes To Planes (Script)
Change the Draw Planes property to Nothing to clear the selection.
切换 Draw Planes属性到 Nothing 情空所有选项
切换 Draw Planes 属性到 Wall ,这样只有墙会被渲染成平面
在 Project 面板下Scripts 文件夹中,双击点开 Placeable.cs
Placeable 已经绑定到了壁画和太阳系投影的盒子上。我们所要做的就是取消注释掉的代码,使其可以完成一下的效果:
通过全息物体的边缘方块中心和各角发射出射线来计算全息物体是否合适放置在该面上
通过检测表面的法线检查是否足够光滑,来判断是否可以将全息物体放置上
在检测替换时渲染一个包围全息物体的方块,表示它的尺寸
创造一个阴影在全息物体下方/后方,显示其将被放置到的地面/墙面
如果全景景物不能放置在表面上,将阴影渲染成红色,能则渲染成绿色
根据表面类型(水平/竖直)来调节全息物体,使其切合表面
平缓的将全息物体替换到选择的表面
取消注释练习中的全部代码,或直接使用下面的脚本:
Placeable.cs
77.6 KB
编译和部署:
编译和部署项目到HoloLens
等待扫描和处理空间映射数据完成
当看到太阳系,注视在投影盒并tap来选择它进行移动。
转移头部来注视房间的其他位置。投影盒会跟随你的视线移动。当投影盒下方的的阴影变成红色,则无法将投影盒放到该位置。当阴影变成绿色,则可以通过tap放置它
找到并选择一张墙上全息壁画来移动它到另一个位置。需要注意的是,油画不能放在地板或天花板上。
Chapter 5 – 遮挡
目标
判断全息物体是否被空间映射mesh遮挡
使用不同的遮挡技术来打到不同效果
步骤
首先我们需要让空间映射mesh遮挡其他的全息物体而不遮挡真实世界
在 Hierarchy 面板,选择 SpatialProcessing
在 Inspector 面板,找到脚本组件 Play Space Manager
点击 Secondary Material 属性右侧的圆圈
找到并选择 Occlusion 材质后关闭窗口
接下来增加一些特殊状态到Earth,当它背其他全息物体(太阳)或空间映射mesh遮挡时,会有个蓝色高亮的效果
在 Project 面板下的 Holograms 文件夹中,展开 SolarSystem .
选中 Earth.
在 Inspector 面板中, 找到 Earth’s 的素材 (底部组件).
在 Shader drop-down ,将shader换成 Custom > OcclusionRim 。这将在Earth背其他物体遮挡时进行渲染
最后开启太阳系中行星的x-ray视野效果。修改PlanetOcclusion.cs (位于Scripts\SolarSystem 文件夹下)来打到一下效果:
判断某个行星是否背空间映射layer遮挡(room mesh或者其他行星)
当行星背空间映射layer遮挡时,使用边框线来展示它
当行星未被遮挡时,隐藏它的边框线
跟着PlanetOcculustion.cs进行练习,或者直接使用以下文件:
PlanetOcclusion.cs
6.2 KB
编译与部署
编译和部署应用到HoloLens
等待扫描和处理空间映射数据完成(完成后将看到蓝色的线条出现在墙面上)
找到和选择太阳系投影盒,并将其放在一个墙或面后
在一些面候,对应壁画或者投影盒的位置,能看到一些基本的遮挡效果
观察Earth,当它被其他全息物体或平面遮挡在时,它表面上会出现一些蓝色的高亮效果
当行星被墙面或其他表面遮挡时,你可以通过x-ray视视角看到他们的边框
结束语
恭喜!你已经完成了 Holograms 230 – Spatial Mapping 空间映射的练习
你已经学会如何扫描周边环境并在Unity中读取它的全息图数据
你也学会了一些shader的基础,知道如何运用素材对world进行重绘
你也学会了一些处理技术,用于找到平面和移除mesh上的三角形
你已经可以移动和替换表面上的全息物体
你也实验了一些遮挡特效,并能够利用x-ray视角
相关推荐
- 全栈 AI 路由问世!Next.js 15 让代码自己写代码?
-
【AlarmLevel】重磅【AlarmTitle】全栈AI路由问世!Next.js15让代码自己写代码?【AlarmOverview】昨夜Vercel突然放出Next.js1...
- 盘点10个GitHub上的前端高仿项目
-
大家好,我是Echa。今天来分享Github上的10个高仿前端项目。...
- 全栈开发实战:React+React Native+Node.js+PostgreSQL的架构解析
-
在移动互联网与云服务深度融合的今天,全栈开发能力已成为衡量开发者竞争力的核心指标。本文将深入剖析如何以React/ReactNative为前端基石,Node.js构建服务端,PostgreSQL作为...
- 分分钟带你将REST转换为GraphQL
-
由于GraphQL目前在API世界中引起了极大的疯狂,您可能想知道如何在不破坏任何内容的情况下将现有的RESTAPI迁移到GraphQL。本指南将帮助您完成RESTtoGraphQL的任务,而...
- Prisma 5发布:性能再上一个新台阶!
-
大家好,很高兴又见面了,我是"...
- 《小鑫发现》之GraphQL框架Prisma
-
标题《小鑫发现》之GraphQL框架Prisma介绍这是一个新的前后端交互的方案,不是一定是最好的,但是却很有意思,一种可以让前端人员自由去控制数据库,脱离开后端人员开发SQL读取数据库一层。虽然不...
- 开发者必备路线图:从此告别技术迷茫
-
作为程序员,我经常遇到这样的困境:第一痛:技术方向迷茫...
- AI实用指南:Rules编写规则详解,从前端到后端的技术栈全覆盖
-
在AI驱动的开发时代,掌握如何与AI助手高效协作已成为工程师的必备技能。本文全面梳理了不同技术领域的AI编程规则,帮助你划定合理边界,提升开发效率。一、AI编程通用规则1.明确任务边界...
- 踩坑:6年后为何不用GraphQL了?
-
GraphQL是一项令人难以置信的技术,自从我在2018年首次开始将其投入生产以来,它就吸引了很多人的注意力。在一大堆无类型的JSONRESTAPI上构建了许多ReactSPA之后...
- 【推荐】一个开源强大的企业级低代码平台,快速构建、部署应用
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...
- 闲谈Groovy使用
-
groovyGroovy是一门基于JVM的动态语言,同时也是一门面向对象的语言,语法上和Java非常相似。它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy代码能够与...
- 干掉 activity 、flowable,阿里开源流程引擎
-
compileflow是什么compileflow是一个非常轻量、高性能、可集成、可扩展的流程引擎。...
- 借我生猛与莽撞,不问明天。
-
1.逆成长今天,我特地将微信个性签名从“玻璃心”改成了“逆生长”,我想自由生长一回。人闲下来,就有时间胡思乱想,有时间矫情。我也一样,我开始对过往的事做了个梳理,发现我终究只是芸芸众生的一粒浮尘,可...
- 网红小逗逗与梦心玥美女:浪漫婚纱下的美丽与气质
-
在这个充满浪漫气息的时刻,我们被一对新人——小逗逗和梦心玥的美貌与气质深深吸引。他们身着洁白无瑕的婚纱礼服,如童话中的王子和公主般,在镜头前散发出令人窒息的美丽。小逗逗,一个网络红人,以其独特的气质和...
- 疑似红霞落海滩,最浪漫的游憩海岸线
-
景区以红海滩为特色,以湿地资源为依托,以芦苇荡为背景,再加上碧波浩渺的苇海,数以万计的水鸟和一望无际的浅海滩涂。红海滩四月吐芽,初为艳粉,海水荡涤越荡越红,十月由红变紫,最佳观赏时间为每年的5到10月...
- 一周热门
- 最近发表
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)
- dos 删除目录下所有子目录及文件 (36)