大话HoloLens与Unity(中)
你可能已经用Unity开发过许多应用了,也许也已经试过发布到iOS、Android,甚至UWP。但是,作为开发HoloLens应用的Unity工程,到底有什么神秘的独特之处呢?
Camera
第一个要关注的是摄像头。
对VR/AR有概念的开发者肯定知道,为了要给使用者的双眼展示不同的画面,我们可能需要两个独立的摄像头。那么,在Unity工程,我们要怎么配置才能实现呢?
答案是:什么都不用做。
你只需要像其他任何应用一样,建立一个主摄像机(实际上,创建场景的时候,它一般都会默认被创建出来),其他的都不需要关心。在发布成HoloLens工程之后,HoloLens会寻找标记为主摄像机的摄像机,并接管它的控制权,再依照HoloLens的实际位置自动设置摄像机的位置,且在两眼的屏幕上各自渲染适合的画面,使用者立刻就能看到非常真实的全息景象。(当然,必要的设置还是要做的,比如工程设置里需要勾选VR Support,详细的设置方法我们后面再讨论)
另一方面,因为主摄像机会被HoloLens接管,这也意味着尝试自己去设置主摄像机的位置、旋转等——都不会有用。但摄像机的其他参数还是有效的,例如视野(Field of View)、layer mask等。
另外,由于HoloLens的特殊性,我们需要对主摄像机做一些必要的设置——一点点而已。包括:
设置ClearType为Solid Color
设置颜色为纯黑(RGB: 0,0,0)
为什么要设置为纯黑呢?这涉及到HoloLens的成像原理。
按画面表现来看,HoloLens是一台“光线增强型”的全息设备,它只能增加光线到使用者的眼中,而不能减少他们。这也就意味着,使用者能看到的画面只会比现实更亮,而不会更暗。
看到这里,聪明的你一定已经明白了,HoloLens是无法显示黑色的!因为黑色就是没有光,必须降低光线才能显示黑色。实际上,在HoloLens中,所有的黑色都会被当成透明来处理,这也就是为什么要把主摄影机的背景色设置为黑色的原因——为了让主摄影机不要有背景。设想一下,如果把主摄影机的ClearType设置为天空盒,并贴上一个漂亮的天空,在HoloLens里看到的是什么效果呢?(有HoloLens的朋友,倒真的建议可以试一试~)
正因为HoloLens无法显示黑色,我们实际上连阴影都做不了,所有的阴影都会变成透明——透明就意味着直接显示为真实世界的亮度。不过,也许你在HoloLens上有看到过带阴影的应用,确实如此,这里会需要一些技巧。
首先,HoloLens的眼镜带有一个有色的外壳,会在一定程度上降低世界的亮度,正如一只浅色的墨镜一般。亮度降低之后,就营造了一些黑色的感觉,即使真实背景再亮,也能有一点显示黑色的余地。之后,应用中想再创造阴影的地方,将阴影投射在一些更亮的虚拟物体上,在全息镜片上显示时,就会通过亮度对比制造出一些阴影的效果——实际上是把阴影部分的图像抠除了,露出了被黑化过的真实世界。因为周围的虚拟物体更亮,所以就产生了阴影的感觉。
同样的,被黑色遮住的物体也会显示为透明——这一点值得利用!例如你要显示一扇窗户,在电脑上,你可能需要用Shader或者RenderTexture将物体限制在一个区域之内,而在HoloLens上,只需要做一些黑色的盒子,把不想被看到的东西统统挡住,自然就消失不见了!当然了,不要因为太高兴而过度使用这个技巧,别忘了这个技巧在HoloLens之外的设备上全都是行不通的,如果你碰巧需要同时发布应用到iOS……你会发现之前的努力全都付之东流了。
交互
HoloLens是一台MR设备,它的一大宗旨就是:解放双手。因此,它不需要使用键盘、鼠标,以及移动设备上标配的触摸屏进行操作。
那么,如何使用HoloLens进行交互呢?主要有三种手段:
1 凝视
凝视操作实际上是VR/AR的通用操作,也是目前使用最多的VR交互方式,就不再赘述了。不过这里需要提醒一下的是,人们的视线并不是很稳定的东西,所以凝视很容易偏离,在设计UI和交互物体时一定要考虑这一点,如果凝视物体经常跑偏,那交互体验将非常不舒服。
可以考虑的方式包括但不限于:
将凝视目标体积做大,并且以方形、圆形为主,避免使用扁长按钮
不要让凝视目标过分跟随视线
距离目标物体较近时,自动将视线吸附过去
2 手势
手势是徒手操作的重要途径,也是众多VR/AR产品都在竞相开发的内容,HoloLens也不例外。但是,HoloLens只支持两个手势,其中Bloom手势为系统使用,我们开发应用无法使用,因此实际我们能使用的手势只有两个:Air Tap/Tap and Hold。
Air Tap/Tap and Hold是两个很简单的手势,容易学会,而且正因为HoloLens只支持这两个手势,所以调节优化得十分到位,对这个手势的识别度很高,错误率相当低,这一点也是大大领先于其他设备的。
Air Tap/Tap and Hold的具体使用就不再详述了,请参阅HoloLens正确手势Get!内容。
值得一提的是,Unity自带的UGUI已经很好的支持了凝视和手势,UI交互不需要做任何额外的开发工作,就可以简单的放入你的HoloLens应用之中。只是需要注意,如果想要在HoloLens中使用UGUI,一定把UGUI的Canvas中的坐标系设置调整为世界坐标系,屏幕坐标系的UGUI时无法被HoloLens显示的。
3 语音指令
基于微软在语音识别上的多年积累,化身为Cortana的语音识别软件几乎可以说是目前最好的语音识别工具,对英语的识别度很高。目前,HoloLens上的Cortana还不支持英语之外的语言识别,但相信这些在未来都是会被改进的。
到这里,我们说到了HoloLens的Unity工程在摄像机和交互方面的特殊性,下一次我们将更深入的讨论HoloLens的核心——SLAM在Unity中是如何体现的。