zoukankan      html  css  js  c++  java
  • Microsoft HoloLens 技术解谜(下)

    读者提问之“HoloLens 的深度传感器有没有可能是基于 TOF?”

    先介绍下背景知识,市面上常见的有三种类型的深度传感器:

    • 结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 PrimeSense 家的。说句题外话,PrimeSense 现在是苹果旗下的公司,这个领域未来一定会很精彩。
    • TOF,time-of-flight,代表产品是 Kinect 二代,由于微软对于 One 这个单词的热爱,它的官方名字是 Kinect One,有点混乱是吧?
    • 双目摄像头,代表产品是 Google Tango 以及 Leap Motion,前者配有四台摄像头,后者有两个。

    我认为 HoloLens 没有使用 TOF 技术的原因是因为如果这四个摄像头的位置放的是 TOF 传感器,那么还缺少一个朝前的 RGB 摄像头用于视频聊天类 App。读者提到的中间部分我认为是微型的投影仪,HoloLens 使用微投在“挡风玻璃”上显示全息的画面。参见 Wired 的这篇报道 

    至于这个问题的标准答案,还得等微软发布新的信息。

    读者提问之“HoloLens 能不能当 VR 用?

    这个问题很好,的确可以这么玩,NASA 与微软的的火星合作计划基本上是一个虚拟现实的应用,它无视了真实的环境。如果 HoloLens 可以提供调节“挡风玻璃”透光度的 API,那么调成完全不透光时就好比戴着 Oculus Rift 的头盔,是另一种体验 VR 的途径。可是朋友们,这是在浪费 HoloLens 的机能啊!

    那么,作为未来的应用开发者,应该怎样充分榨干它的机能呢?这是本篇文章的重点。

    正文部分

    首先让我脑洞开一会,为大家“介绍”下 Holo SDK。按照微软的偏好,SDK 标配的语言肯定有 C++ 和 C#,因此要进行开发,这两门语言你至少得会一门。

    然后,这个 SDK 里有哪些功能呢?根据官方 demo 中的场景,我觉得基本功能至少有:

    • (a) 摄像头看到的图像,即当前场景的 color buffer。
    • (b) 当前场景的深度图,depth map 或 z buffer。
    • (c) SLAM 合成后的三维场景,这个场景所在的空间下文我们暂且称为 Holo Space,它可能是以乐高方块的形式表示,也可能是用三角形来表示。
    • (d) HoloLens 设备在 Holo Space 中的坐标 (x, y, z)、朝向 (tx, ty, tz)。
    • (e) 手势识别的结果,类似 HRESULT OnGestureDetected(DWORD dwHandId, DWORD dwEventId, LPVOID lpUserInfo) 的样子。
    • (f) 语音识别的结果,类似 HRESULT OnVoiceRecognized(std::string& strSentence, FLOAT confidence) 的样子。

    同样的,根据官方 demo,我将 HoloLens 应用分为三种:

    • 伪全息的传统应用

    • 针对 HoloLens 特别优化过的应用

    • 沉浸式的真-全息游戏

    这一篇只讲“伪全息的传统应用”

    这种类型的应用对于传统开发者而言最容易上手,几乎不需要修改代码,自然也不需要拥有 3D 图形学的知识。大部分人会从这种应用入手开始 Holo 开发。

    如果不需要 3D 知识就能实现 3D 的界面,那么 3D 的效果是哪来的呢?那就是 Windows 10 引入的全息窗口管理器 —— explorer3d.exe。我们平时启动 Windows 看到的“桌面”是窗口管理器(explorer.exe)的一部分,把“桌面”想像成三维的就行了,很简单是吧?

    一点都不简单!

    以视频播放器为例,播放器并不会直接将视频画面显示到桌面上,而是画到一个缓存区域,经过一系列我不知道的步骤后,explorer.exe 再将画面以“2D 的方式拷贝”到能被我们看到的地方。而 explorer3d.exe 用的是“3D的方式”。

    所谓“3D的方式”就是使用 Direct3D 做一些“会的人嫌我讲得啰嗦,不会的人看了还是不会”的事……

    也就是在初始化应用的时候:

    • 创建一个 3D 的矩形来表示 3D 的窗口,保存在顶点缓存 vertex bufer(可以认为是放在显卡上的数组)
    • 创建一个贴图 texture(可以认为是放在显卡上的图片)
    • 创建表示窗口平移、旋转、拉伸值的 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 的贴图。

    结束语

    这篇先写到这里,看看大家的反馈意见。虽然文章叫做《HoloLens 技术解谜(下)》,但是放心这个系列并没有完结,随着脑洞的逐渐展开,我发现要介绍的内容越来越多。

  • 相关阅读:
    Http Get与Post的区别
    华为USG6000V防火墙简单配置案例
    华为USG6000V防火墙简单配置案例
    基于三层交换机的VRRP技术--MSTP、VRRP的综合运用
    ci test
    CI框架 default_controller 如何设置为:'目录/Controller' 转
    查看django版本的方法
    Django如何安装指定版本
    django学习--2 模板
    django学习--1
  • 原文地址:https://www.cnblogs.com/zoucaitou/p/4472057.html
Copyright © 2011-2022 走看看