微软HoloLens技术解谜(下)?
作者张静是前微软上海Xbox ATG软件工程师。
在之前的文章《微软HoloLens技术解谜(上):如何还原三维场景》中,我介绍了我对HoloLens背后的建模技术的看法。虽然我以前在微软的Xbox部门工作过,但和其他人一样,我只是在上周才了解到全息镜头是一种有趣的设备。目前,微软关于HoloLens的官方信息非常有限,深度传感器和全息屏原理这两个核心部件依然充满了令人着迷的疑问。文章发表后,读者在微软HoloLens技术的留言中提出了一些问题(上):如何还原3D场景。
读者问:“全息透镜的深度传感器有没有可能是基于TOF的?”首先介绍一下背景知识,市场上常见的深度传感器有三种类型: 开发者_Python百科
结构光,这项技术的代表产品是Kinect一代,其传感器芯片由PrimeSense制造。对了,PrimeSense现在是苹果旗下的公司,这个领域未来会非常精彩。飞行时间TOF,代表产品是Kinect II。因为微软很喜欢One这个词,它的官方名称是Kinect One,有点让人摸不着头脑,对吧?双目相机的代表产品是谷歌探戈和Leap Motion。前者配有四个摄像头,后者配有两个摄像头。我认为HoloLens不使用TOF技术的原因是,如果将TOF传感器放置在四个摄像头中,仍然缺少一个用于视频聊天应用的前向RGB摄像头。我认为读者提到的中间部分是微型投影仪,HoloLens利用微投影在“挡风玻璃”上显示全息图像。参见http://www.wired.com/2015/01/microsoft-nadella/.《连线》杂志的这篇报道
至于这个问题的标准答案,还要等微软发布新的信息。
读者问:“HoloLens可以作为VR吗?这个问题很好,真的可以这样玩。NASA和微软的火星合作计划基本上是虚拟现实的应用,忽略了真实环境。如果HoloLens可以提供API来调整“挡风玻璃”的透明度,就像是在完全不透明的情况下戴上Oculus Rift头盔,这是体验VR的另一种方式。但是,朋友们,这是在浪费HoloLens的功能!
那么,作为一个未来的应用开发者,我们应该如何充分引流它的功能呢?这是本文的重点。
主体部分,我先敞开心扉,为大家“介绍”一下赫萝SDK。根据微软的偏好,SDK的标准语言必须是C和C#,所以你必须至少了解这两种语言中的一种才能进行开发。
那么,这个SDK中有哪些功能呢?根据官方演示中的场景,我认为基本功能至少有:
(a)摄像机看到的图像是当前场景的颜色缓冲区。
(b)当前场景的深度图、深度图或z缓冲区。
(SLAM合成后的3D场景。这一场景所在的空间暂时将被称为赫萝空间,可以用乐高方块或三角形的形式来表达。
(d)赫萝空间全息透镜设备的坐标(x,y,z)和方向(tx,ty,tz)。
(e)手势识别的结果类似于检测到手势时的hresult(dword dwhandid、dword dwevent id、lpvoid lpuserinfo)。
(f)语音识别的结果类似于voicerecognized上的hresult(STD :字符串str语句,float confidence)。同样,根据官方演示,我将HoloLens应用程序分为三种类型:
伪全息术的传统应用。
专门针对全息镜头优化的沉浸式真全息游戏,只谈“伪全息的传统应用”。对于传统开发人员来说,这种类型的应用程序最容易上手。它几乎不需要修改代码,自然也不需要具备3D图形的知识。大多数人会从这个应用程序开始开发赫萝。
如果没有3D知识也能实现3D界面,那3D效果从何而来?那就是Windows 10推出的全息窗口管理器—— explorer3d.exe。平时启动Windows时,我们看到的“桌面”是窗口管理器(explorer.exe)的一部分。把“桌面”想象成三维的。简单吗?
一点都不容易!
以视频播放器为例,播放器并不直接在桌面上显示视频图片,而是在缓存区中绘制。经过一系列我不知道的步骤后,explorer.exe以“2D方式”将照片复制到我们能看到的地方。explorer3d.exe使用“3D方式”。
所谓“3D方式”,就是用Direct3D做一些“会觉得我太啰嗦的人,但是不会看的人还是不会看”的事情.
也就是说,当应用程序初始化时:
创建一个3D矩形来表示3D窗口,并将其保存在顶点缓冲区顶点缓冲区(可视为放置在显卡上的数组)。
创建一个地图纹理(可以认为是放置在显卡上。
上的图片)创建表示窗口平移、旋转、拉伸值的 local_matrix(这里的 matrix 是数学中的矩阵概念,不是电影名称)
在应用运行时:
如果需要在 Holo Space 中移动窗口,那么修改 local_matrix 中的平移值,功能与 explorer.exe 中的移动窗口类似,只是除了上下(y 轴方向)左右(x 轴方向)移动外还可以前后(z 轴方向)移动。
如果需要在 Holo Space 中旋转窗口,那么修改 local_matrix 中的旋转值。explorer.exe 中没有类似的功能。
如果需要在 Holo Space 中放缩,那么修改 local_matrix 中的放缩值,功能与 explorer.exe 中按住窗口边缘拖拉改变大小一致。
如果视频内容需要更新,那么更新 texture 为最新的内容,只有这么做我们才能看到会动的视频。
在应用退出时:
释放 Direct3D 的资源不用担心,这些都是 explorer3d.exe 会负责的。
细心的读者会发现我们没有用到一个很重要的功能:
(d) 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 的贴图。
精彩评论