微软HoloLens技术解谜:SDK会是这样?

2020-07-09

在前一篇文章《微软 HoloLens 技术解谜:如何还原三维场景》 中我介绍了自己对于 HoloLens 背后的建模技术的看法,虽然之前在微软的 Xbox 部门工作过,但是和大家一样也是上週才知道 HoloLens 这个好玩的设备。当前微软官方对于 HoloLens 透露出来的讯息非常有限,最核心的两个组件深度传感器以及全息萤幕的原理依然充满着谜题。文章发表后,在微软 HoloLens 技术解谜:如何还原三维场景的留言中读者提出了一些问题。
微软HoloLens技术解谜:SDK会是这样?

读者提问之「HoloLens 的深度感应器有没有可能是基于 TOF?」
先介绍一下背景知识,市面上常见的有三种类型的深度感应器:
结构光,这个技术的代表产品是 Kinect 一代,它的感应器晶片用的是 PrimeSense 家的。说句题外话,PrimeSense 现在是苹果旗下的公司,这个领域未来一定会很精彩。
TOF,time-of-flight,代表产品是 Kinect 二代,由于微软对于 One 这个单字的热爱,它的官方名字是 Kinect One,有点混乱是吧?
双眼摄影镜头,代表产品是 Google Tango 以及 Leap Motion,前者配有四个摄影镜头,后者有两个。
我认为 HoloLens 没有使用 TOF 技术的原因是因为如果这四个镜头的位置放的是 TOF 感应器,那幺还缺少一个朝前的 RGB 镜头用于视讯聊天类 App。读者提到的中间部分我认为是微型的投影机,HoloLens 使用微投在「挡风玻璃」上显示全像的画面。
至于这个问题的标準答案,还得等微软发布新的讯息。

读者提问之HoloLens 能不能当 VR 用?
这个问题很好,的确可以这幺玩,NASA 与微软的的火星合作计画基本上是一个虚拟实境的应用,它无视了真实的环境。如果 HoloLens 可以提供调节「挡风玻璃」透光度的 API,那幺调成完全不透光时就好比戴着 Oculus Rift 的头盔,是另一种体验 VR 的途径。可是朋友们,这是在浪费 HoloLens 的机能啊!
那幺,作为未来的应用开发者,应该怎样充分搾乾它的机能呢?这是本篇文章的重点。

正文部分
首先让我脑洞开一会,为大家「介绍」下 Holo SDK。按照微软的偏好,SDK 标配的语言肯定有 C++ 和 C#,因此要进行开发,这两种语言你至少得会一个。
然后,这个 SDK 里有哪些功能呢?根据官方 demo 中的场景,我觉得基本功能至少有:
相机镜头看到的图像,即当前场景的 color buffer。
当前场景的深度图,depth map 或 z buffer。
SLAM 合成后的三维场景,这个场景所在的空间下文我们暂且称为 Holo Space,它可能是以乐高方块的形式表示,也可能是用三角形来表示。
HoloLens 设备在 Holo Space 中的坐标 、朝向。
手势识别的结果,类似 HRESULT OnGestureDetected的样子。
语音识别的结果,类似 HRESULT OnVoiceRecognized的样子。同样的,根据官方 demo,我将 HoloLens 应用分为三种:
1.伪全像的传统应用
微软HoloLens技术解谜:SDK会是这样?
2.针对 HoloLens 特别最佳化过的应用
微软HoloLens技术解谜:SDK会是这样?
3.沉浸式的真全像游戏
微软HoloLens技术解谜:SDK会是这样?
这一篇只讲「伪全像的传统应用」
这种类型的应用对于传统开发者而言最容易上手,几乎不需要修改程式码,自然也不需要拥有 3D 图形学的知识。大部分人会从这种应用入手开始 Holo 开发。
如果不需要 3D 知识就能实现 3D 的界面,那幺 3D 的效果是哪来的呢?那就是 Windows 10 引入的全像窗口管理器 —— explorer3d.exe。我们平时启动 Windows 看到的「桌面」是窗口管理器的一部分,把「桌面」想像成三维的就行了,很简单是吧?
一点都不简单!!!!
以影片播放器为例,播放器并不会直接将影片画面显示到桌面上,而是画到一个暂存区域,经过一系列我不知道的步骤后,explorer.exe 再将画面以「2D 的方式拷贝」到能被我们看到的地方。而 explorer3d.exe 用的是「3D 的方式」。
所谓「3D 的方式」就是使用 Direct3D 做一些「会的人嫌我讲得啰嗦,不会的人看了还是不会」的事……
微软HoloLens技术解谜:SDK会是这样?
也就是在初始化应用的时候:
创建一个 3D 的矩形来表示 3D 的窗口,保存在顶点暂存 vertex bufer
创建一个贴图 texture
创建表示窗口平移、旋转、拉伸值的 local_matrix
在应用软体执行时:
如果需要在 Holo Space 中移动窗口,那幺修改 local_matrix 中的平移值,功能与 explorer.exe 中的移动窗口类似,只是除了上下左右移动外还可以前后移动。
如果需要在 Holo Space 中旋转窗口,那幺修改 local_matrix 中的旋转值。explorer.exe 中没有类似的功能。
如果需要在 Holo Space 中放缩,那幺修改 local_matrix 中的放缩值,功能与 explorer.exe 中按住窗口边缘拖拉改变大小一致。
如果影片内容需要更新,那幺更新 texture 为最新的内容,只有这幺做我们才能看到会动的影片。
在应用软体退出时:
释放 Direct3D 的资源
不用担心,这些都是 explorer3d.exe 会负责的。
细心的读者会发现我们没有用到一个很重要的功能:
HoloLens 设备在 Holo Space 中的坐标 、朝向 。
要解释它我必须讲解 world、view、projection 三个矩阵,还要讲解矩阵的乘法以及 dot product 的公式等等,这些完全是图形学的知识了,一时半刻讲不完,我会再专门为它们写一个系列。我打算用一句话解释一下,explorer3d.exe 会维护一个全局的 global_matrix,它等于 world * view * projection,view 的值由功能中的讯息可以得到。
global_matrix 的作用就好比第一人称射击游戏中的滑鼠,写到这里我发现把 explorer3d.exe 视为一个 3D 游戏会简单很多,3D 游戏场景里的电视机也能播放影像,其实是一样的道理。
微软HoloLens技术解谜:SDK会是这样?
总结一下,这个类型的应用软体工程师几乎不需要修改程式码,由 explorer3d.exe 负责调用 Direct3D 将传统应用的内容转换成 3D 的贴图。
引用来源:technews

上一篇: 下一篇:

相关新闻

推荐阅读