HoloLens是什么?
HoloLens是微软发布的可穿戴式增强现实计算设备,它拥有这么几个关键要素:
HoloLens 不是什么?
看完微软栩栩如生的宣传视频后,如果你的反应是:
卧槽,Matrix 要来了。
那么你要好好看这一段,因为Matrix是Virtual Reality/VR/虚拟现实,VR的特点是让参与者置身于计算机生成的三维图像世界中,淡化真实的世界。VR近期的代表产品是Oculus Rift,戴上Rift后你是看不到真实世界的。在我看来 VR最大的问题是:这个虚拟世界很真实很精彩,但是有什么用呢?也就是说 VR 只能做到更逼真的三维世界,它无法帮助人们更好地理解真实的世界。
HoloLens也不是Google Glass(以下简称GG),它比GG多了:
HoloLens也不是市场上常见的的AR,常见的基于摄像头的AR应用基于摄像头有:
基于丑陋的黑白标记图片的AR
以及基于任意图片的AR。
很炫是吗?但是它们只能检测到图片所在的那个平面。HoloLens比它们都牛,它能检测到各个角度的三维场景!
HoloLens的AR是如何得到三维场景深度信息的?
我们回到AR的定义,想要实现增强现实,必须先理解现实,那么对于HoloLens而言现实是什么呢?是传感器的数据。传感器是啥?是摄像头。同样是摄像头,为什么HoloLens就可以感知深度呢?微软的Kinect在这方面很成功,那么是不是HoloLens上放了一台嵌入式的Kinect呢?
答案在下面的原型图片中:
HoloLens拥有有四台摄像头,左右两边各两台。通过对这四台摄像头的实时画面进行分析,HoloLens可覆盖的水平视角和垂直视角都达到120度。也就是说它采用的是立体视觉/Stereo Vision技术来获取类似下图的深度图 (depth map)。
立体视觉是计算机视觉学科的一个子学科,专注于从两个摄像头的图像数据中得到真实场景中的物体离摄像头的距离。示意图如下:
下面是基本的步骤,查阅OpenCV文档可以了解具体到函数用法 :
只有一张深度图是不够的,它只是某一时刻真实的场景在摄像头中的映射。要想得到完整的三维场景,我们需要分析一系列的深度图。
HoloLens 如何从多张深度图重建三维场景?
答案是SLAM,Simultaneous Localization And Mapping,即同步定位与建图系统。这个技术被用于机器人、无人汽车、无人飞行器的定位与寻路系统。解决的是非常哲学的问题:
SLAM有很多实现的方式,有一个开源的方式,实现了很多深度图的处理和匹配算法,可以认为是三维版本的OpenCV。
而微软围绕着Kinect的深度图数据发明了Kinect Fushion 算法,并发表了两篇论文:
为什么我认为HoloLens与Kinect Fushion有关?答案在这个页面中 。 Shahram Izadi是微软剑桥研究院的principal researcher及research manager。他所领导的互动 3D 技术组/interactive 3D technologies为微软的多项产品提供了研究力量,包括Kinect for Windows、 Kinect Fusion以及HoloLens。顺便说一句,他们组在招人。
Kinect Fushion,通过在室内移动Kinect设备,获取不同角度的深度图,实时迭代,对不同对深度图进行累积,计算出精确的房间以及房间内物体的三维模型。
它分四个阶段:
在 HoloLens 的应用中我们运行到第三步,即获取三维乐高模型就可以了,第四步并不是必需的。因为 HoloLens 的屏幕是透明的,不需要再把房屋的模型渲染一遍,我们自带的眼睛已经渲染了一遍了。
读者提问“HoloLens的深度传感器有没有可能是基于TOF?”
先介绍下背景知识,市面上常见的有三种类型的深度传感器:
我认为HoloLens没有使用TOF技术的原因是因为如果这四个摄像头的位置放的是TOF传感器,那么还缺少一个朝前的RGB摄像头用于视频聊天类App。读者提到的中间部分我认为是微型的投影仪,HoloLens使用微投在“挡风玻璃”上显示全息的画面。参见 Wired 的这篇报道点此进入。
至于这个问题的标准答案,还得等微软发布新的信息。
读者提问之“HoloLens能不能当VR用?
这个问题很好,的确可以这么玩,NASA与微软的的火星合作计划基本上是一个虚拟现实的应用,它无视了真实的环境。如果HoloLens可以提供调节“挡风玻璃”透光度的API,那么调成完全不透光时就好比戴着Oculus Rift的头盔,是另一种体验VR的途径。可是朋友们,这是在浪费 HoloLens 的机能啊!
那么,作为未来的应用开发者,应该怎样充分榨干它的机能呢?这是本篇文章的重点。
正文部分
首先让我脑洞开一会,为大家“介绍”下Holo SDK。按照微软的偏好,SDK标配的语言肯定有 C++ 和 C#,因此要进行开发,这两门语言你至少得会一门。
然后,这个SDK里有哪些功能呢?根据官方demo中的场景,我觉得基本功能至少有:
同样的,根据官方demo,我将HoloLens应用分为三种:
这一篇只讲“伪全息的传统应用”
这种类型的应用对于传统开发者而言最容易上手,几乎不需要修改代码,自然也不需要拥有3D图形学的知识。大部分人会从这种应用入手开始Holo开发。
如果不需要3D知识就能实现3D的界面,那么3D的效果是哪来的呢?那就是Windows 10引入的全息窗口管理器——explorer3d.exe。我们平时启动Windows看到的“桌面”是窗口管理器(explorer.exe)的一部分,把“桌面”想像成三维的就行了,很简单是吧?
一点都不简单!
以视频播放器为例,播放器并不会直接将视频画面显示到桌面上,而是画到一个缓存区域,经过一系列我不知道的步骤后,explorer.exe再将画面以“2D 的方式拷贝”到能被我们看到的地方。而explorer3d.exe用的是“3D 的方式”。
所谓“3D 的方式”就是使用Direct3D做一些“会的人嫌我讲得啰嗦,不会的人看了还是不会”的事……
也就是在初始化应用的时候:
在应用运行时:
在应用退出时:
不用担心,这些都是explorer3d.exe会负责的。
细心的读者会发现我们没有用到一个很重要的功能:HoloLens设备在Holo Space中的坐标 (x, y, z)、朝向 (tx, ty, tz)。
要解释它我必须讲解world、view、projection三个矩阵,还要讲解矩阵的乘法以及dot product的公式等等,这些完全是图形学的知识了,一时半会讲不完,我会再专门为它们写一个系列。我打算用一句话解释下,explorer3d.exe 会维护一个全局的global_matrix,它等于world * view * projection,view的值由功能 (d) 中的信息可以得到。global_matrix的作用就好比第一人称射击游戏中的鼠标,写到这里我发现把explorer3d.exe视作一个 3D 游戏会简单很多,3D游戏场景里的电视机也能播放视频,其实是一样的道理。
总结一下,这个类型的应用程序员几乎不需要修改代码,由explorer3d.exe负责调用Direct3D将传统应用的内容转换成3D的贴图。
结束语
这篇先写到这里,看看大家的反馈意见。虽然文章叫做《HoloLens 技术解谜(下)》,但是放心这个系列并没有完结,随着脑洞的逐渐展开,我发现要介绍的内容越来越多。
本文作者:张静,前微软上海Xbox ATG软件工程师。微信公众号“黑客与画家”(HackerAndPainter),欢迎各位童鞋与他交流探讨。