ARKit_arkit 实时显示关键点-程序员宅基地

技术标签: 苹果  iOS  软件开发  ARKit  

为什么ARKit是AR的最好选择?

苹果在最近举办的WWDC上发布的ARKit已经对增强现实技术(AR)产生了巨大的影响. 开发者首次发现, 一个强大而大范围可用的AR软件开发包“恰好”适用于他们的app. 它不需要对标记、初始化、深度照相机和专用的创建工具进行修改. 不出所料, 大量的演示随之而来(可以关注推特@madewitharkit获取更新信息). 但是大部分开发者都不知道ARKit的工作原理, 也不知道它优于其他软件开发包的原因. 在ARKit的“under the hood”中可以查找到现在ARKit的局限之处, 未来需要增加的内容和原因, 以及帮助我们预测安卓和头戴显示何时会有类似的功能(VR和AR)出现.

我已经从事AR9年了, 曾经搭建过与ARKit完全一样的技术(但不幸的是当时并没有响应的硬件支持). 关于AR系统是如何搭建的以及为何是这样搭建的, 我有一些作为内行人士的看法.

这篇博客是为那些掌握一些科学技术但不是计算机视觉工程师的人而写的. 从科学的角度看, 我知道我所做的一些简化不是百分百的准确, 但我希望这能帮助人们在已有的基础上有更深一层地理解.

ARKit是基于什么样的技术进行构建的?

技术上来说, ARKit是一个具有简单的二维平面检测功能的视觉惯性测距系统(VIO). 软件实时追踪你的空间位置(你在空间上的六自由度), 即在每帧刷新之间重新计算你的位置, 速度为每秒大约30次以上. 这些计算2次平行完成. 视觉(摄像)系统将现实世界中的一个点与摄像机传感器上的一帧像素相匹配, 从而追踪你的姿势. 惯性导航系统也追踪你的姿势(你的加速度计和陀螺仪跟踪统称为惯性测量单元, 或者叫IMU). 卡尔曼滤波器结合两个系统的输出结果, 决定哪一个系统提供的估测更接近你的“真实”位置(地面实况)并通过ARKit SDK更新位置. VIO系统追踪你的iPhone在六维空间里的移动, 就像你汽车里的里程表测量车的行驶距离一样. 6维是指xyz方向上的三维运动(移动)加上俯仰/偏转/滚动(旋转).

VIO带来的最大好处是IMU的读数大约为一千次每秒并且给予加速度(用户的移动). 航位推算法用于测量IMU读数之间的设备运动. 航为推算几乎就是一种猜测. 就像如果我让你向前走一步, 然后猜测走了多远一样, 你会用航位推算法来估计距离. 稍后我会介绍如何准确地进行猜测. 惯导系统中的误差会随时间累积, 所以IMU帧率越长, 惯导系统从视觉系统中复位后的时间越长, 追踪位置距离真实位置偏差就越多.

视觉/光学测量使用摄像机的帧率, 通常为30fps并且依赖距离(不同的场景帧率也有所不同). 光学系统通常随着距离的增大误差也不断的增大(时间也会有轻度影响), 所以你运动得越远, 误差就越大.

好消息是每个系统的优点都抵消了另一个系统的缺点.

所以视觉和惯性跟踪系统是基于完全不同的测量系统, 没有相互依赖. 这意味着可以盖住摄像机或者只看到一个具有很少光学特征的场景(比如白墙), 而惯性系统可以为一些帧中“携带载荷”. 或者设备在完全静止的条件下, 视觉系统可以呈现出一个比惯性系统更加稳定的姿态. Kalman 波器不断地选择最佳姿态, 从而实现稳定跟踪.

到目前为止一切顺利, 但有趣的是VIO系统已经存在很多年并在业界广泛认可, 并且在应用市场已经有相当一部分应用. 所以苹果使用VIO并不代表VIO本身怎样. 我们要关注的是苹果系统为何如此健壮.

ARKit的第二个关键点是简单的平面检测. 有了“地面”你才能在上面建立内容, 否则就会像在太空中一样乱浮动. “地面”是从光学系统检测到的特征(就是你在演示中看到的小点), 而任意三点构成一个平面, 通过算法将这些平面平均化, 通过足够多的平面就可以估计出真实的平面位置. 另外, 这些点通常被称为“点云”, 这是一个很容易混淆的术语. 这些点都是用于光学跟踪的稀疏点云. 稀疏的点云花费更少的内存和CPU时间来追踪, 并且在惯导系统的支持下, 光学系统追踪所需的点数量很少. 这是一种不同于密集点云的点云, 它看起来也接近真实. (注意一些追踪器使用密集点云来进行追踪, 所以这就更加混乱)

关于一些误解的说明

顺便说一下, 我见过有人将ARKit比做SLAM, 或用SLAM来指代追踪. 需要澄清的是, SLAM是一个像“多媒体”一样非常宽泛的术语. 追踪本身则是一个更加通用的术语而里程计则是更加具体的. 但在AR相关的实际使用过程中可以通用. 这很难分清. 有很多方法来实现SLAM, 追踪只是综合SLAM系统中的一个组成部分. 我认为ARKit是一个轻量或简版SLAM系统. Tango或Hololens的SLAM系统拥有除了里程计之外更多的特性.

ARKit的两个奥秘之处是:“如何从单镜头中得到3D效果?”和“如何获得度量标度(比如演示中的卷尺)”奥秘就在于完善MIU误差消除系统(使得航位推算猜测更加精确). 当做到这一点时:

为了获得3d效果, 需要从两个不同的地方获得场景视图, 然后对你的位置进行立体计算. 我们眼睛就是这样看到的3D效果, 一些跟踪器也因此而依赖立体相机. 如果你有两台相机就很容易计算, 知道它们之间的距离, 而且同时捕获帧. 用一个相机你可以捕捉一次画面, 然后移动到下一个位置进行第二次捕捉. 使用IMU航位推算你可以计算两次捕获位置之间的距离然后正常进行立体计算(事实上你可以多捕获几次使计算更加准确. )

为了获得度量尺度, 系统同时依赖IMU的精确航迹推算. 从IMU提供的加速度和时间测量中, 你可以向后合并以计算速度并且再次向后合并以获取画面之间的实际距离. 难点并非数学, 而是从IMU中除去误差以获得近乎完美的加速度测量. 在你移动手机的几秒钟之内, 一个微小的错误每秒运行一千次, 就会造成30%或更大程度的错误. 事实上苹果已将这个误差降低到一位数, 这一点很难得.

Tango, Hololens以及Vuforia效果怎么样呢?

Tango是一个品牌而非真正的产品. 它由硬件参考设计(RGB、鱼眼、深度相机和CPU/GPU)和提供VIO的软件堆栈(运动追踪)、细数映射(区域学习)和致密3D重建组成(深度知觉).

Hololens的软件堆栈完全相同, 除了一些用于处理CPU/GPU进程和节省能源的ASIC码(被称为全息处理单元).

Vuforia也是基本相同, 但它是独立于硬件的.

以上所有都是用相同的VIO系统(Tango和ARKit甚至用了由FlyBy开发的相同的代码库). Hololens和Tango都没有用深度相机追踪(尽管我相信他们即将将深度相机融入一些案例中). 所以ARKi为什么t这么好?实际上, ARKit真的没有比Hololens好在哪里(我甚至认为Hololens的追踪器在市场上是最好的), 但Hololens的硬件没有被广泛使用. 微软原本可以在Windows智能手机上使用Hololens追踪, 但我认为最后微软出于某种商业原因而没有这样做. (因为他们会增加很多成本和时间来校准用于低容量手机的传感器, 并且Microsoft版本的ARKit并不能说服开发商从iOS和安卓转向微软).

12个月前, 谷歌可以很容易地将Tango的VIO系统应用到市场上大量的安卓机上, 但是他们也没有这么做. 如果当时他们这样做了, 那么ARKit将会是从后追赶, 而不是像现在一样拥有突破. 我认为(并不确定)这是因为谷歌不想为每一个OEM制造商都制作一个独特的传感器校准处理器. Tango不同OEM厂商版本各不相同, 谷歌并不想照顾到如此大量的OEM厂商, 它只想对三星和华为等这种拥有大量设备的厂商进行支持. 相反他们可以告诉OEM厂商:“这是硬件的设计参考, 可以选择接受或者放弃. ”(当然这并不是那么简单, 但这也确实是OEM厂商给我的反馈). 由于安卓已将智能手机硬件商品化了, 而相机和传感器是有所差别的最后一块领域了, 所以OEM厂商绝不会去迎合谷歌的想法. 谷歌还强制将深度相机整合进包中, 这也相应的给手机的物料成本增加了很多(并且十分耗电), 这也是厂商拒绝Tango的另一个原因. 自ARKit的发布之日起世界就发生了改变. 我们将很期待看到:1.OEM厂商是否会找到一个Tango的替代系统(他们正在寻找);2.谷歌在硬件设计参考上作出让步(以及相应的控制平台)

所以ARKit相比其他替代方案更好的最终原因是苹果可以将VIO算法紧密耦合到传感器上, 并且话费大量的时间来校准它们以消除在位置计算中的错误和不确定性.

值得一提的是大型的OEM系统有很多替代品. 这儿有很多学术性质的跟踪器(ORB Slam就是一个很好的例子, OpenCV 也有一些可选项)但他们几乎都仅限于光学(单RGB,或立体声, 和/或深度相机为基础, 有些使用稀疏地图, 有些使用密集的, 还有一些深度地图使用来自其他传感器的半直接数据. 达到目的的方法不止一种).

我是一名开发者, 我应该选择哪个呢, 为什么呢?

在ARKit上开始实施你的AR想法. ARKit已经可以使用并且你可能已经有了一个支持的手机. 要认识到设计和开发一个在真实世界中的应用的巨大差异, 在真实世界中你无法控制场景, 而在智能手机或VR程序中你可以控制每个像素.

接下来转到Tango或者Hololens. 现在想象一下, 当你的内容可以与不受控制场景的3D结构相互交互时会发生什么.

这是一个非常陡峭的学习曲线, 胜过从网页开发到移动开发或者从移动开发到VR开发. 你需要彻底重新思考应用程序是如何工作的, 还有用户体验或用例的意义. 我看过很多ARKit的Demo, 而这些四年前他们就在Vuforia上实现过, 八年前在Layar上实现过. 开发人员正在重新学习同样的内容, 只是范围更大一些. 多年来我见过几乎所有类型的AR应用程序的例子, 并且很乐意给予反馈和支持. 尽管来问.

我会鼓励开发者不要害怕搭建新颖的程序, 一些没用的应用都是首先出现在时能手机上. 但在手持设备上却很难发现适用的AR场景用例.

世界很小, 没有多少人能把这些系统做的非常好

一个很吸引人但未得到充分赏识的方面是世界上只有少数人可以构建如此良好跟踪器. 这些工程师在专业领域的相互交流使得单目VIO在移动领域成为最佳的解决方案. 没有其他的方式可以提供这样的用户体验(到目前为止).

2000年中, 波士顿的军事/工业供应商Intersense 最先开始实施VIO. 其中一个联合发明者Leonid Naimark也是我在2011年开办的Dekko公司胜任首席科学家. 在Dekko证实VIO由于传感器的限制不能在iPad2上运行之后, Leonid回到了军队的承包商, 而Dekko的CTO Pierre Georgel现在是谷歌梦之队的高级工程师. Ogmento是由我在Super Venture的合伙人Ori Inbar创建的. 之后Ogmento更改为FlyBy, 他们团队在带有外置鱼眼的iOS系统上成功的开发出VIO系统. 之后这个代码库许可给谷歌, 并成为Tango的VIO系统. 随后苹果买下了FlyBy, 同样的代码库也成为了ARKit VIO的核心. FlyBy的CTO, Chris Broaddus依然继续为Daqri创建跟踪器, 但现在他和牛津的博士后、Zoox的前首席科学家在一家研发自治机器人的公司.(还包括我在6D的合伙创始人, 他目前正在领导Active Vision Lab.
2007年左右, Georg Klein在Oxford Active Computing实验室(PTAM)开发了第一个移动SLAM系统, 之后继续为Hololens设计了VIO系统. 合作者还有David Nister, 但他后来去了Tesla建立自主系统. George的博士学生, Gerhard Reitmayr带头进行Vuforia的VIO系统研发. Vuforia的工程领导者Eitan Pilipski现在在Snap带领AR项目. 在牛津、剑桥和帝国理工学院的研究团队的核心成员开发了Kinect追踪系统, 现在在Oculus和Magic Leap领导追踪系统的开发.

有趣的是, 我并不清楚现在哪些AR初创公司中在AR追踪方面是由那些小的天才团队人员领导的. 拥有在机器人或者其他计算机视觉的相关背景的创始人并不能证明他们的产品能够在如此广泛的环境中健壮的运行.
我稍后再谈一下目前这一代科学家在研究什么. 给个提示:不是VIO.

性能统计

AR系统从不会“运行”或者“不运行”. 问题永远在于, 能否在一个足够广泛的场景下良好的运行. “优化”的最终结果就是将统计数据向你所希望的方向推进.

因此, 永远不要相信一个AR应用程序的演示, 尤其是在YouTybe上面看起来惊艳的演示. 一个程序能在可控范围内和在有轻微变化的环境中精准工作, 但在日常使用中毫无作用, 这两者之间存在着很大的差距. 而这种情况在智能手机或者VR程序的演示中并不存在, (比如, 想象一下Slack是否工作取决于你的相机指向碰巧哪里或者碰巧你怎样移动了你的手腕), 因此观众就要被愚弄了.

举个典型例子来说明为何统计可以决定一个系统的工作性能. 上面的图片中, 我们用格子代表相机中的数字图片传感器. 每一个盒子都是一个像素. 为了使追踪稳定, 每个像素应该匹配一个真实世界中相对应的点(我们假设设备始终保持稳定). 然而第二张图片显示光子不能适应环境, 各种强度的光落在他们想落的地方, 每一个像素只是这一点上光子的总量. 场景中任何光线的变化(一片云通过太阳, 荧光灯的闪烁等等)都会改变光子击中传感器的位置, 现在传感器就得到了一个与真实世界不同的像素点. 就视觉跟踪系统而言, 你已经移动过了. 这就是为什么当你在ARKit演示中看到点时, 他们有亮有暗, 因为系统要决定哪些亮点是可靠的哪些不是. 接下来需要确定这些点来进行位置计算, 平均计算结果得出实际位置的最准确估测. 因此, 所有为了消除统计错误而做的工作共同得到一个更加健壮的系统. 这就需要在相机硬件堆栈(多镜头和涂层, 快门和乳香传感器规格等等)和IMU软硬件算法之间进行紧密的集成和校准.

整合软硬件

有趣的是, VIO并不是很难使用. 现在已经有很多公开的算法和非常多相应的实现. 但是却很难将它使用好. 我的意思是, 惯性光学系统几乎可以立即聚合到立体地图上, 并且可以用低单位数精度来决定度量标度. 例如, 我们在Dekko上所实现的要求用户在一开始就有一个明确的移动 然后将手机前后移动大约30s才能进行收敛聚合. 建立一个良好的惯性追踪系统需要一些有经验的工程师. 不幸的是, 世界上只有20个人拥有必要的技能和经验. 其中大多数都正在建造巡航导弹跟踪系统或者火星漫游者导航系统等. 而不是消费型的手机.

因此即使你能够接触这些人中的一个, 事情依然取决于现有的软件和硬件是否能够同步以便更大程度地降低错误. 系统的核心包括, 在软件上能够准确建模的IMU, 能够完全访问整个相机堆栈的权限以及栈中每个组件的详细规格, 最为重要的是, IMU和相机需要十分精确地进行时钟同步. 系统需要精确地知道IMU读取的数据对应的捕获帧开始和结束的位置. 这对于连接两个系统是非常必要的, 但是直到现在这也是不可能的, 因为OEM厂商没有理由投资于此. 这就是基于此系统的Dekko ipad2 花费很长时间才能实现聚合的原因. Tango Peanut是第一个能精确时钟同步所有内容的设备, 也是第一个提供良好跟踪功能的消费型手机. 今天, Qualcom等芯片系统都有一个用于所有组件的同步传感器中枢, 这意味着VIO在大多数当前设备上可行, 并配有合适的传感器校准功能.

由于硬件和软件的紧密依赖, 软件开发人员几乎不可能在没有OEM厂商的深度支持的情况下构建一个良好的系统. Google投入了大量资金让一些OEM厂商支持Tango硬件规格. MSFT, Magic Leap等正在设计他们自己的硬件, 这也就是为什么Apple的ARKit如此成功的原因, 因为他们已经能够设计出符合自己的软硬件.

光学校准

为了使软件能够精确地知道是否 摄像机传感器上的像素能够与现实世界中的点相匹配, 摄像机系统需要精确地校准. 这儿有两种类型的校准:

几何校准:使用相机的针孔模型来校正镜头的视野和镜筒效果等. 基本上由于镜头的形状所有的图像都会产生变形. 大多数软件开发人员可以在没有OEM输入的情况下使用棋盘格和基本公开的相机规格进行几何校正.

光度校准:这里涉及到很多东西, 通常要求OEM厂商参与. 因为光度校准涉及到图像传感器本身的细节特征以及内部透镜所有的涂层等. 光度校准一般用于处理色彩和强度的映射. 例如, 正在拍摄遥远星星的望远镜连接的摄像机需要知道是否传感器上一个像素光强度的轻微变化确实是星星还是仅仅来源于传感器或透镜中的像差. 光度校准对于AR跟踪器的好处是提高了传感器上的像素和真实世界中的点的匹配度. 因此光学跟踪具有更强的鲁棒性以及更少的错误.

在上面的幻灯片图像中, 图像传感器上落入像素桶中的各种各样RGB光子图片 解释了问题. 来自真实世界中一个点的光有时会落在几个像素的边界上, 并且每一个像素都将平均分配所有击中它的光子的强度. 用户运动, 场景阴影的微小变化或闪烁的荧光灯都将改变表示真实世界中点的像素. 这是所有光学校准都尽可能地消除的错误.

惯性校准

当我们在思考IMU时, 记住IMU是用来测量加速度而不是距离或速度是很重要的. IMU读取错误会随着时间的推移积累地非常快. 校准和建模的目标就是确保在X部分距离测量(加速度的双重整合)是足够精确的. 理想情况下, 摄像机是有足够长的时间来弥补由于用户覆盖镜头或者场景中发生其他事情所造成数帧跟踪的丢失.

使用IMU测量距离被称为航迹推算. 这基本上是一个猜测, 但是通过对IMU的行为进行建模, 找出产生错误的所有方式, 然后编写过滤器来减少这些错误, 可以使这个猜测更加精确. 想象一下如果你被要求向前走一步, 然后猜测你走了几英寸这么个场景. 单步猜测会有很大的误差. 但是如果你重复走上千步, 测量每一个步长, 允许知道你走的是哪只脚, 走在什么地板上, 你穿的什么鞋子, 你的移动速度以及你的疲惫程度等等, 那么你对距离的猜测最终会变得非常准确. 这基本上就是IMU校准和建模的原理.

在IMU中会有很多错误来源. 一个机器臂通常用于以完全相同的方式重复地移动设备, 而来自IMU的输出会一直被捕获和过滤, 直到IMU的输出能够和机器臂的地面实况移动十分精确地匹配. Google和微软甚至将它们的设备发送到ISS和”零重力飞行”的微重力中以便消除额外的错误.

这只是一些必须从跟踪中识别的错误而已, 如图标中的RGB线.
要想获得真正的精确度会比它听起来要更难. 对于OEM而言, PITA必须在它所有组合的全部设备中克服这些问题. 即使不同的设备可能会有不同的IMU(例如, Galaxy 7可能拥有来自Invensense或Bosch的IMU. 并且为Bosch的建模并不适用于Invensense). 这是Apple相对于Android OEM的另一个优势.

追踪技术的未来

那么对于目前已经存在VIO, 接下来会发生什么, 它会使ARKit变得多余么? 令人惊讶的是, VIO仍然是在追踪数百米范围内最好的方式(对于更长的距离, 系统将需要使用融合到系统中的GPS加上某种地标识别来进行重新定位). 这样做的原因是, 即使其他光学系统也能够像VIO一样精确, 但是它们将仍然需要更多的(GPU或摄像头)功耗, 这在HMD中非常重要. 单目VIO是目前精确度最高,功耗消耗最低, 同时成本也是最低的解决方案.

深度学习在追踪研究界有一定的影响. 到目前为止, 基于深度学习的系统大约是10%的错误, 其中顶级的VIO系统错误率却在个位数. 但它们正在追赶, 并将真正有助于户外重新定位.

深度相机可以通过以下几种方式帮助VIO系统. 在低特征场景中, 深度相机在提高地面实况, 度量标度以及边界追踪的精度方面有很大的帮助. 但是它们非常耗能, 因此只有在非常低的帧率以及帧间使用深度相机和VIO才是有意义的.
它们在户外也不会正常运行, 因为来自太阳光的红外散射会过滤掉深度相机中的红外线. 深度相机的拍摄范围也取决于它们的功耗, 这意味它们只适合在手机上的短距离范围内使用(几米的范围). 另外深度相机在BOM成本方面也是非常昂贵的, 因此OEM厂商避免在大容量手机上使用它们.

立体RGB或鱼眼镜头都有助于看到更大范围的场景(因为立体RGB和鱼眼镜头具有潜在的光学特性. 例如普通镜头可能只会看到白色的墙壁, 但是一个鱼眼设备可以在画面中看到有图案的天花板和地毯 - Tango和 Hololens使用这种方法). 并且相对VIO而言, 它们可以以更低的计算成本来获取更加有深度的信息. 尽管VIO使用较低的BOM和功率也可以达到同样的精度. 由于手机立体摄像头(即使是HMD)之间的距离非常近, 因此手机上深度计算的精度范围也被受到限制(相隔数厘米距离的手机相机在深度计算的精度上可以达到数米).

跟踪管道最有趣的事情是支持在更大的范围进行跟踪, 尤其是在户外数千米的范围. 在这一点上, AR的跟踪相比自动驾驶的跟踪除了使用更少的传感器和更低的能耗外, 几乎没有任何区别. 因为任何设备最终都将在尝试映射更大的区域时时消耗尽空间, 所以要解决这个问题就需要云服务的支持. 这也是最近Google宣布Tango视觉定位服务的原因. 我们将在未来几个月内看到更多相关的东西. 这也是现在每个人都如此关心3D地图的原因.

AR计算机视觉的前景

这里写图片描述

6dof位置跟踪将在12-18个月在所有的设备上实现完全的商品化. 但是这儿还有待解决的事情:

3D重建(在Hololens术语中叫空间映射或在Tango术语中叫深度感知). 3D重建系统能够找出场景中真实物体的形状和结构. 并且允许虚拟事物之间相互碰撞以及隐藏在真实世界的后面. 这也是使人们混淆的一个特征, 因为人们认为这意味着AR仅仅是混合现实. 但是AR就是AR, 仅仅是人们大部分看到的AR Demos都没有支持3D重建, 因此AR中的虚拟内容看起来仅仅是在镜头中现实物体的前面移动而已. 3D重建通过从场景中捕获密集的点云(今天使用深度相机), 然后将其转换为网格, 并将隐形网格传递给Unity(连同真实世界的坐标). 之后将真实世界网格精准地放置在相机所捕获的场景上. 这意味着虚拟事物似乎能够与现实世界互动. 注意目前ARKit是通过检测2D平面来完成2D版本的重建. 这是它所需的最低的要求. Unity的内容需要一个地平面来进行放置, 否则它们将会没有地方可放并且四处飘浮.

上述提到有关深度摄像机的所有问题在3D重建中仍然存在, 这也就是它不可广泛使用的原因. 目前正在进行积极的研究, 以便支持使用单个RGB相机来完成真实且实时的3D重建. 大约还需12-18个月才能看到相关的产品. 这就是为什么我认为真正的消费级AR头戴式显示器仍然很遥远的一个主要原因.

在3D重建之后, 从语义上对3D场景的理解有许多有趣的研究. 你所看到的几乎所有惊人的计算机视觉深入学习都使用的2D图像(常规图片), 但对于AR(自动驾驶, 无人机等), 我们需要对3D世界有一个语义性的理解. 像ScanNet这样的新举措将在这方面帮助很多, 类似于ImageNet帮助2D语义一样.

那么我们需要弄清楚如何将所有这些惊人的技术扩展到实时支持多个并发用户.

AR其他部分的前景

深入研究这些内容已经超出本篇博客的范围, 但是还有很多工作要做来提升技术栈:

  • 光学: 视场, 眼框尺寸, 分辨率, 亮度, 深度, 聚光度重定向都有待解决. 我认为在最终消费级解决方案出现之前, 我们将会看到数个过渡性的头戴式显示器设计. 它们只有有限的功能集, 只期待解决其中的某一个问题(如社交信号, 跟踪或企业使用情况, 或别的东西).
  • 渲染:使虚拟内容与现实世界相一致. 确定真实的光源并将虚拟事物和现实事物进行虚拟匹配, 以便使阴影和纹理看起来更逼真. 这也就是多年来好莱坞特技效果一直在做的内容(所以复仇者联盟看起来十分逼真). 但是对于AR来说, 它是在手机上实时完成的, 无法控制现实世界的灯光和背景等.
  • 输入:解决输入问题还有很长的路要走. 研究表明多模式输入系统在使用时可以提供最好的效果. 有谣言说Apple将采用这种方式. 多模式只是意味着A将I同时考虑各种输入模式(手势, 语音, 计算机视觉, 触摸, 眼睛跟踪等)以便更好地理解用户的意图.
  • GUI和应用程序:对于AR来说, 并没有我们认为的App这么一个东西. 我们想要的仅仅是看一眼Sonos, 虚拟的控制面板就会出现在设备上. 我们并不想要一个小方块状的Sonos按钮. 难道我们想要这么个按钮么? 我们只是想要将需要的控制面板出现在视野中(像战斗机飞行员抬头显示器) 并且和现实中的物体连接起来. 目前还没人知道如何来实现, 但绝对不会是4*6的网格图标.
  • 还有社会问题需要解决. 在我看来, 只有Apple和Snap懂得如何推销时尚, 并且AR头盔显示器的购买也是时尚进行的驱动. 这可能比以上所有的技术问题要更难解决.
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ireland2011/article/details/77987900

智能推荐

VUE子组件更改父组件数据_vue3子组件修改父组件值-程序员宅基地

文章浏览阅读9.7k次,点赞14次,收藏28次。在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以变更父组件,且在父组件和子组件都没有明显的变更来源。这也是为什么我们推荐以 update:myPropName 的模式触发事件取而代之举个例子,在一个包含 title prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图:this.$emit(‘update:title’, newTitle) 然后父组件可以监听那个事件并根据需要更新一个本地的数据 property。_vue3子组件修改父组件值

【Linux精讲系列】——vim详解_linux vim-程序员宅基地

文章浏览阅读3.3k次,点赞44次,收藏50次。首先我们要知道vim是什么?vi是由美国程序员比尔·乌尔曼(Bill Joy)于1976年开发的,最初是为了在Unix系统上进行文本编辑而创建的。它是一款基于模式编辑的文本编辑器,以其高效的键盘快捷键而闻名,可在终端环境下使用。vi 成为Unix系统中的标准文本编辑器,并且在大多数Unix和Linux系统上内置。_linux vim

STM32入门开发: LWIP网络协议栈移植(网卡采用DM9000)_网卡芯片和stm32-程序员宅基地

文章浏览阅读9.6k次,点赞40次,收藏215次。一、环境介绍MCU: STM32F103ZET6代码开发工具: Keil5TCP/IP协议栈: LWIP网卡: DM9000本篇文章主要讲解如何在STM32F103工程里添加移植LWIP协议,最终完成TCP服务器、TCP客户端的通信测试。 网卡采用的是DM9000,工程代码中,采用STM32的FSMC接口来驱动DM900网卡,DM9000是并口网卡,引脚多,但是速度快,也可以采用其他网卡,SPI协议的、UART协议的等。 比如:W5500。 因为主要是讲LWIP协议栈的移植,所以网卡相关_网卡芯片和stm32

非常给力的GitHub仓库(深度学习、计算机视觉、OpenCV、自动驾驶、SLAM、C++/Python学习分享)_opencv github-程序员宅基地

文章浏览阅读975次,点赞5次,收藏11次。仓库地址:仓库拉取:不想拉取可以直接下载压缩包。_opencv github

8种免费商用中文字体_类似阿里汉仪智能黑体-程序员宅基地

文章浏览阅读2.3k次。8种免费商用中文字体 转自https://www.uisdc.com/200-models-free-commercial-fonts 提取连接:https://pan.baidu.com/s/1nLxPRDDS1BTzBtISUfzaAA 提取码: tnxd 一、思源字体系列 大名鼎鼎的思源字体由 Adobe 在线字体库 Typekityu 与谷歌一起合作开发,字库对中(简体/繁体)、日、韩三国汉字进行了全面优化支持,可以说是非常全面了,其实思源不仅是个免费字体,还是一个开源字体,任何用户都可以_类似阿里汉仪智能黑体

AndroidStudio Error:Failed to open zip file. Gradle's dependency cache may be > corrupt_androidstudio error: failed to open zip file. grad-程序员宅基地

文章浏览阅读1.9k次。有时候新导入一个项目,发现有这样一个问题 Error:Failed to open zip file. Gradle’s dependency cache may be > corrupt (this sometimes occurs after a network connection timeout.) href=”syncProject”>Re-download dependencies_androidstudio error: failed to open zip file. gradle's dependency cache may

随便推点

Android开发中图片的放大缩小功能的实现(总结)_android开发分辨率低的图片放大-程序员宅基地

文章浏览阅读1.2w次,点赞9次,收藏32次。先上代码吧,之后再进行补充和代码优化。activity_main.xml的代码如下:<?xml version="1.0" encoding="utf-8"?><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:ori..._android开发分辨率低的图片放大

linux下编译GCC_什么命令可以查询gcc这个软件包下所含的文件-程序员宅基地

文章浏览阅读485次。分两种情况: 先看这篇转过来的文章,俺老孙懒得写了。 Linux软件安装通用思路 在Linux系统中,软件安装程序比较纷繁复杂,不过最常见的有两种:   1)一种是软件的源代码,您需要自己动手编译它。这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz)。   2)另一种是软件的可执行程序,你只要安装它就可以了。这种软件安装包通常被是一个RPM包(Redhat_什么命令可以查询gcc这个软件包下所含的文件

vue脚手架学习总结,vue参数、基础指令、生命周期函数、组件、插槽(持续更新)_在vue脚手架中新增数据的弹窗怎么写-程序员宅基地

文章浏览阅读7.1k次,点赞138次,收藏272次。vue知识点在html中vue如何使用在script的src属性中引入vue.js文件点击下载vue.js创建一个id为app的div容器在script标签里,添加以下内容new Vue({ el:"#app", //指定模板目标 data:{ //数据内容(以对象形式) msg:"又见面了Vue", newMsg:"我和我的<b>祖国</b>", flag:true, titl_在vue脚手架中新增数据的弹窗怎么写

升级openssh服务_ssh 升级-程序员宅基地

文章浏览阅读427次,点赞9次,收藏8次。更新yum源、安装zlib库、OpenSSL 库。二、安装openssl。查看openssl路径。查看openssl版本。三、openssh安装。查看openssh版本。重启并检查sshd服务。配置 OpenSSL。_ssh 升级

stata陈强:第十五章 短面板_stata研究啤酒税与交通死亡率-程序员宅基地

文章浏览阅读3.1k次,点赞6次,收藏74次。高级计量经济学及stata应用 陈强第十五章 短面板15.13短面板的stata命令及实例第十五章 短面板15.13短面板的stata命令及实例clear all cd "F:\stata经济数据分析"diruse traffic.dta, clear* 1 面板数据的设定* xtset panelvar timevar* encode country, gen(cntry) //假如panelvar是字符串,转换为数字型xtset state year* 显示数据结构* x_stata研究啤酒税与交通死亡率

SpringCloud09—消息总线:Spring Cloud Bus,淘宝特价版java面试-程序员宅基地

文章浏览阅读806次,点赞15次,收藏15次。我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

推荐文章

热门文章

相关标签