磨刀不误砍柴功,我们总有一些小工程师,不了解全貌,不好好思考,上手就开始写代码,这种做法是非常不可取的。对于Hololens的开发也是一样。今天我们来重点看看Hololens里面的一些概念,比如Holograms, 坐标系,还有Gaze。好吧,今天没有demo的原因是因为Hololens被借走了,没法部署,仔细看看概念对开发也是非常非常非常重要的。
Hologram
Hololens可以让你创建一个叫做Hologram的东西,它其实就是虚拟空间中的对象,由光和声组成,就好像是真的东西一样。这里吐槽一下,其实真正看到的还是有区别的,光影效果明显不同。如果我们真的可以把虚拟的东西做得和真实的东西一样,那不知道有多少人会变得神经错乱。Hologram能够对注视(Gaze),手势(Gestures)和语音命令做出反应,当然要通过写代码的方式。还可以和真实世界的表面进行交互。我们可以放一个假的小狗在桌子上。带上Hololens以后,它会把Holograms渲染在眼前,同时和你以及周围环境交互。比如说,昨天我把这只小狗放在桌子的左上角,那下次我在运行这个程序的时候,他可以记住我的房间和小狗位置,从而出现在同一个地方。这个功能叫Spatial Anchor。另外Holograms支持发出声音,而且是声音是带方向和距离的,叫做Spatial Sound,晚点我们再具体看。
坐标系
以下内容涉及到高中数学,如果不熟悉可以回去复习一下高中数学。所有的三维应用程序都是使用笛卡尔坐标系来描述物体的位置和方向,就是X, Y, Z轴。Hololens里有虚拟和实际的坐标系统,叫做空间坐标系(Spatial Coordinate System)。其中定义的单位是米,也就是说(0,0,0)到(1,1,1)的距离是1.732米,看不懂为什么的同学们以后就没法辅导小孩的高中数学了,哈哈哈。hololens里使用的是右手坐标系,也就是x朝右,y朝上,z超内。
hololens支持2种参照系。一个是静止参照系(stationary frame of reference),目的是为了保证holograms的位置相对不变,另外一个叫做附加参照系(Attached Frame of reference), 就是说有些场景下需要让holograms跟着人的移动而移动,这些内容叫body-locked content。简单而言,静止参照系要解决的问题是,在程序启动的时候,你所在的位置是原点,那么你可以把一个Hologram放在某个位置上,然后你站起来,看着这个位置,不管你怎么移动,在眼镜里看到的holograms的位置都不能移动,这需要hololens传感器收集空间中的大量信息才能实现,也是AR或者叫混合现实中最难做的部分之一。万一之前扫描的空间信息有误差,那么会导致对象漂移(drift),这样人看起来就会非常不真实。附加参照系比较简单,只要总是以眼镜作为原点渲染holograms和原点对象的相对距离就可以了。
静止参照系在编程模型中的解决方法叫做Spatial Anchor,翻译成空间锚。Hololens会不断扫描Spatial Anchor的位置以保证所有在Spatial Anchor坐标系里的Holograms的位置都固定。我们举个简单的例子,假设我们使用静止参照系,把房间左侧角落C1设为原点(0,0,0),右侧角落C2(10,0,0),那么我分别分别放了2个Holograms在X1(2,0,0)和X2(8,0,0)的位置。这时候hololens的渲染会也很好,看上去也非常的完美。这时候使用者站起来在房间里到处走动,突然hololens传感器发现,从房间左侧到房间右侧的距离不是10米,而是9.9米,这时候c1和c2的距离变化会导致中间x1和x2的位置也变化了。那么在渲染x1和x2的时候,这个相对坐标就可能变成了(1.9,0,0)和(7.9,0,0),这时holograms就会突然跳动一下,位置变掉了,这会导致非常严重的问题。所以hololens的做法是在x1上放一个anchor, x2上也放一个anchor。无论hololens如何移动,这两个anchor的位置是不会移动的,那么相对于anchor 1坐标系里的对象1和anchor2坐标系里的对象2,他们的相对坐标都不会变动,也就不会出现holograms位置突然变化的情况了。好吧,简而言之就是在环境中多设置几个原点,让相对位置不变化,这都要依赖于hololens的硬件足够强大,万一spatial mapping有bug的话,还是解决不了这个问题的。
Spatial anchor的位置可以保存或者共享,这样下次程序在相同房间里面运行起来,那么holograms还可以在老地方出现,还可以把位置共享给其他人,他们也可以在相同位置看到一样的东西。当然还是那句话,要保证hololens能断定是相同的房间,如果传感器被挡住了,环境中人来人往或者家具被移动了位置,或者在另外一个一模一样的房间里面,都可以让hololens失去方向。
附加参照系比较简单,距离和方向也相对固定,当用户移动或转动头部的时候,内容也会跟着走。当hololens不知道自己在哪里的时候,就只会渲染基于附加参照系的holograms,比如告诉用户你丢了,不知道在哪的通知框(Fallback UI)可以基于这种附加参照系来构造,所有的应用程序都需要提供这种功能。另外还有一种叫”Head-Locked content",就是无论hololens怎么改变,这个东西都不会变。比如Gaze里面的中间那个点。这个东西极度不推荐,因为会让人很不舒服。
关于坐标系的内容,具体可以参考https://developer.microsoft.com/en-us/windows/holographic/coordinate_systems
Gaze
Gaze就是看,让hololens知道当前正在看的是哪个hologram或者是实际的对象,就好比鼠标移动到哪个位置。可以想象成有个激光扫到某个对象,这个对象就被选中了。这个一带而过,大家可以再复习一下坐标系的概念。