快捷导航
查看: 1347|回复: 0

邓力:《See into VR》

[复制链接]

大家好,今天我想给大家讲的东西,可能跟很多地方你们听到的主题不一样,它更多的关系到我们在VR开发当中一些最底层的概念和知识。为什么呢?就是我在加入VR圈这么久以来,发现包括很多非常有经验的VR开发人员,他们在处理VR开发上的时候犯了很多基础性的错误。这些错误其实都是因为他们对这些基础的东西掌握得不牢固,或者说理解有偏差。所以呢,我希望能够通过一次talk把很多这些confusion的地方clear掉。
这个话题呢,其实是非常非常深入、非常复杂的一个系统,所以说呢,今天我会尽量使用简单的语言,应该不会走得特别深入吧,(只是)把大部分的信息给过一遍。
我们这个主题呢,叫做“Seeinto VR”。Seeinto VR主要要说的,就是我们怎么处理在VR开发当中所有的视觉元素。对于这个话题呢,我取了个还挺时髦的名字,叫做“从入门到出家”。因为据我所知,无论国内外,有很多人在真正接触到这个东西之后,都没有把它完全吃透。有很多人把这部分的负担直接抛给了比如说引擎开发商或者说SDK开发商,然后最后得到的结果是错的。因为很多SDK开发商,他们这方面写的包括是代码、架构上面都是错的。
今天我们主要有三个主题。第一个主题就是说,在VR里面,我们跟平面里面看到的东西是不一样的,首先它多的这个维度是怎么处理的。第二我们会接触到对空间的感知。最后我们会简单地提一下你在引擎里面需要注意的一些小的东西。
首先,作为VR来说,第三个维度是怎么产生的呢?它最重要的那个概念就是双目的视觉,双目的视觉在大脑里面会被大脑进行处理,然后在你大脑内部生成深度信息,也就是我们说的第三个维度。但是呢,大脑在处理这些视觉信息的时候,它其实不是一能的处理,它有很多的限制,也会导致我们在VR里面产生的很多问题。
比如说,我们看到这个地方,image fusing就是说,大脑把两张图片混合成一张3D的图片,并且在你大脑里面生成深度的时候,会造成很多叫做illusion的问题。然后比如说我们的2.5D的深度感知,它会通过其他一些非常微妙的细节来体现出来。最后呢,是一个很多人都会做错的地方,叫做perception size,就是说我们的感知的大小。不知道各位有没有在以前3D的时代,在大屏幕上或电视上体验过3D的内容,包括游戏、影视之类,如果体验过这个东西的话,就知道我所谓的这个感知的大小是怎么回事。这个东西呢,我们下来会详细地来说。
刚才说了这么多,其实听起来很简单。因为之前我跟一些人在说这个事的时候,他们觉得这个好像就是把两个摄像机放在那个地方,它就会work。但其实并不是这么简单,下面我们详细来说一下这个问题。
首先,我们先来说一下双目视觉。下面这两幅图就是我们平常会遇到的两种特别特别常见的setup,但这两种setup都是错误的。第一种叫做toe out,就是有两个摄像机,它们的对角是向外的,不是朝内的。这种情况通常在什么时候遇到呢?有一些新入行的导演,他们在拍剧的时候,他想把两个摄像机的角度做成平行,但是呢因为微调的关系,让它稍微的向外,最后造成的结果是毁灭性的。第二个呢,叫做large separation,什么意思呢?就是说两个摄像机之间的错位角,也就是视差,太大了,这样的话会造成两个图像差别太大,大脑无法进行正确地融合。
说到这个,我们再看一个更常见的。这种setup,首先它的视差的距离是合适的,而且它们的角度是朝内的,这个可以说是现在大多数,包括游戏开发人员和电影拍摄人员所用的一个setup,但是它真的是对的吗?
大家可以看到我给它打的是一个半勾,为什么它是错的呢?待会儿我们可以看到,现在给大家看一下正确的做法是什么。大家可以看到,这两个地方看起来虽然说非常非常相似,但是有一个很重要的区别。第一个区别是,在左边这个地方,其实你看到的是两个正视锥,但是在右边这个地方你其实看到的是两个斜视锥,然后我们在VR的术语里面,这个叫做…。只有在产生了这种效果之后,你投影出来的VR的立体画面才是正确的。在电影拍摄或者摄影里面,我们使用的那个方式叫做“移轴镜头”,就是说如果你真的要造成两个合适的画面的话,其实你需要使用两个移轴镜头。
据我所知,现在包括好莱坞很多导演他们其实用的都是这种方式,因为镜头更便宜,更好找。但是呢,这种方式就像我刚才说的,它在中间这个部分会看起来非常不错,但是它在边缘的部分,立体感觉会迅速恶化。所以说现在,其实你如果真的到片场去看的话,会看到很多好莱坞的导演在拍摄动作戏的部分的时候,会把减小两个摄像机的距离,来弥补这个偏差,这样才让观众在看的时候不至于恶心。
刚才说到的这个是视图的融合。视图的融合需要注意很多问题,首先,比如说开发游戏,你的那个三维里面的纹理不要出现这种高度重复性的纹理。这种高度重复性的纹理会让大脑产生误差,让你融合出一些叫做illusion——我们说是视觉幻觉的一些东西。我们打个比方,在这幅图里面,如果你靠得比较近,两只眼睛像对眼一样看它一下,然后再把眼睛轻轻地放开,你会发现它出现了神奇的3D效果,这并不是因为什么其他不可解释的原因,正是由于你大脑在处理这种重复的图样的时候会产生误差,比如这个地方的图样跟那个地方的图样是一样的,然后大脑在处理的时候,会把这两个图样认为是一个物体投影出来的,然后这两个物体一重合,大脑里面会强迫计算出一个错误的深度,这样的话,你看这个图像,其实看到的就是一个伪的深度。不是以前有那种很流行的3D画画本嘛,里面就是这种非常重复的图样,然后里面有一些很简单的3D效果,让你眼睛在图像上面对视一下再放开,就会看到里面的3D信息,其实原理就是这样的。
我们现在来看一下,为什么说VR在制作这个东西的时候很容易产生问题呢?首先我们看一下它的setups。一个VR,这是一个最简单的setup,它是什么样的呢?
首先,这是用户的眼睛,眼睛之后要通过两个镜头看到(画面),我们在比如说HMD里面设置两个屏幕,然后这两个屏幕通过光线投影,再通过这个镜头反投到眼睛里面,同时我们在虚拟摄像机——这两个红色三角形代表我们两个虚拟摄像机,两个虚拟摄像机必须要跟我们的眼睛的这个宽度——叫做IPD,一定要是一致的。
我们来看一下这个地方的三个主要参数。第一个叫IPD。如果你真的深入开发的话,比如说接触到Oculus或HTCVive的话,你们就会非常熟悉这个问题。IPD是指两个眼睛之间的距离,就是我们通常说的瞳距ICD是指我们在虚拟世界当中两个虚拟摄像机的距离,如果这两个距离不一致的话,就会产生问题。什么问题?我们待会儿再来说。然后IAD是什么东西呢?IAD是这样的,这个镜片的光学中心,我们叫做它的中心轴。两个中心轴之间的距离,叫做IAD。IAD的距离也必须要跟我们的IPD和ICD完全一致,否则容易产生问题。但是IAD还稍微好一点,IAD产生的更多的问题只是会让你看着不舒服,不会产生其他的问题。如果是IPD和ICD不一样的话,会产生什么问题?我们看一下。
我们先说IPD。IPD刚才已经解释过,它其实是一个瞳距。瞳距为什么这么重要呢?主要原因是这个样子的。我们的大脑跟我们的眼睛的瞳距其实是一个相当于hardware的部分,就是说我们大脑已经习惯了人本身生长的IPD。一旦这个IPD不一样的话,我们大脑所计算出来的图像深度就是完全不一样的
那你可能会问,人类的眼睛怎么长,跟我开发VR有什么关系?这个关系其实非常大。我记得以前有一次碰到”Elite: Dangerous“的开发商,他们一直在抱怨一个问题,为什么我们的人坐在座舱里面,看到的整个座舱跟真实的大小不一样,明明我们的VR里面的模型是按照真实模型的大小建模的,但是为什么看到的东西不一样?其实就是因为他们的IPD不对,会造成一个什么问题呢?我们来看一下。
这是我们大脑。这是一个简化的模型,我们大脑里面怎么处理两张图像呢?我们一个一个来说。首先,如果把这个当作是一个普通的情形的话,如果你的IPD增大了,会发生什么情况呢?左右眼睛里两个图像之间的视差就会增大。增大会发生什么问题呢?它从图形投影到你眼睛里面的时候,这个角度就会发生变化。但是呢,因为你眼睛之间的IPD一定是个恒定的值,所以说如果我两个图像增大的话,你会发现一个问题,你看,距离减小了,大脑会认为深度减小了,深度减小的时候,物体的大小还一致的话,大脑就会认为这个物体的大小是缩小的。
这就是为什么,如果你在引擎里面设置,或者在相机里面去调整IPD的话,IPD越大,你会发现你拍出来的东西最终拿到3D屏幕或VR里面看会变得越来越小,这个我们在专业词汇里面叫dwarfism。然后反之叫做gigantism,就是说它会放大。如果我缩小IPD的话,物体它会放大。如果把两个IPD缩得无限小的话,你会发现你看到的所有世界是无限大的。这也是为什么,比如说现在很多视频,它其实不是3D的,只是一个360的视频,但是它强制地转成左右眼了之后,你会发现你看见的东西都变得无限大,就是因为这个原因,它们的IPD的距离是零。
好,我们说了IPD之后,现在提一个很小的问题。这是一个非常非常多开发者会出错的地方。这个呢,是HMD的设备上都会有的一个小小的调节器,它调节什么呢?IPD。但是如果你真正去调节它的时候,会发现一个什么问题?它在调节的时候会改变头显里面两个镜头之间的距离。但其实呢,很多人以为这个功能就仅限于此,然后就完了,只是一个眼睛舒适度的问题,其实完全不对。这个东西不仅仅是调节两个镜头之间的距离,它里面有个传感器,它会把这个传感器读到的数据反馈到驱动程序里面。它的驱动程序会在你的游戏,或者什么东西,在运行的时候会起作用。
上一次比如说”Elite: Dangerous“他们遇到的问题就是,他们说为什么我们手动设置的IPD不起作用,其实就是因为这个地方的驱动的数据覆盖了他们那边软件方面所提供的数据。当然了,这个东西虽然是个题外话。其实虽然我刚才一直用的IPD来说,主要还是为了和现在很多,包括Oculus SDK跟ViveSDK里面的一些术语一致。但其实真正我刚才说的这个东西,从严格意义上来说,不应该叫做IPD,它应该叫做ICD。因为其实你在软件层面调的是那两个虚拟摄像机的距离,它的外部的IPD只会影响到你整个眼睛的观察、舒适感,因为如果两个IPD不一样的话,两个IAD其实是硬绑定的,它也会随之产生偏差。两个眼睛如果没有从光学焦点看过去的话,就会造成眼部疲劳,还有就是深度感知能力下降。
刚才说了IPD的问题,现在说另外一个很重要的概念,叫做“汇聚”。汇聚是什么意思呢?比如说刚才我们在看第一幅图的时候,两个摄像机其实是轻微地朝内汇聚的,这个汇聚的角度叫做convergence。Convergence最主要的作用是什么呢?两只眼睛汇聚的那个焦点,我们叫做它的立体平面,stereo plane。然后这个stereo plane有一个很重要的作用,除去我们刚才IPD对物体大小的一个感知的影响以外,convergence对这个大小的影响也非常非常得可观,而且它的影响条件比IPD要复杂很多。
IPD有一个很重要的属性就是说,它跟你的感知的大小是线性相关的,比如你想把游戏里面的物体放大100倍,或者你想直接把玩家从地球表面拖到太空,或拖到什么地方,看到一个缩小的地球,你要让它缩小1万倍,其实只需要让IPD放大或者缩小1万倍就行了,这是个线性的关系。但是convergence不一样,它是一个非常非常复杂的脑部活动。你在convergence比较大的时候,它看到的东西会非常非常小,但是它这个小的速率是非线性的。从神经学上来说,其实是因为大脑会处理同一个物体在不同视差情况下看到的不同信息,然后把这两个信息相比较,如果发现这两个信息很相似但是又不同的话,大脑会自动认为它的深度信息离你比较近。
然后我们来看下一个比较麻烦的问题。这个就是我刚才说的,两个眼睛的汇聚线。我们会区分两个空间,第一个叫做negative space,就是说你在你的stereo plane,你的汇聚点之前的部分。然后我们还有positive space,这个就是我们刚才说的视平面。通常,我们观察起来比较舒服的一个焦点距离,一般来说是0.75到3.5。根据各方面的医学专家的研究,一般来说是2.5米是最佳的。这就是为什么你们看到很多,比如包括三星Gear VR或者什么地方,那些譬如说陨石朝你飘过来,永远永远让你感觉最舒服、最有震撼力的一颗陨石,它离你的距离一定是2米到3米左右,就是因为这个原因。
我们说到这个之后,再来说一下,在3D刚刚开始流行的时候,很多导演没有经验,他们觉得把物体放到越前面,给你产生的深度的冲击力会越强,比如说一只蝴蝶,或者说一颗子弹朝你飞过来,飞得非常近的话,会产生非常强的视觉冲击。但其实这种做法是错误的。1秒钟的(画面)大脑可能还可以勉强应付,但长时间的话就会造成恶心,就会造成呕吐,而且就会造成你对整个电影的深度感知出现错乱。实质到今天,在美国那边还稍微好一点,中国这边依然有很多导演喜欢哗众取宠,把物体给放到超近的negative space,负空间这个地方来突出我们的电影是3D的,这其实是一种极其错误的做法。
其实我们刚才已经提到了这个问题,就是我们对大小的感知,其实这也是VR体验的一个最重要的环节。很多时候,如果你们真正去进行比较的话,会发现看一个2D物体跟看一个3D的物体,它的沉浸感,还有它对整个画面的渲染能力是截然不同的。就算那个画面完全一样,但是对你自己的感知是截然不同的。把这个东西放在VR里面之后,你的视觉无限扩大,包括了旁边prefer your vision之后,你会发现自己已经完全沉浸在这个虚拟世界里面了。
然后讲一个说的比较多的问题了,IPD和你的玩家的高度。为什么要说这个问题呢?前面有一段其实我已经提到了,你大脑跟IPD的距离其实是hardware的,但是这个东西不是全部,因为你的IPD其实不是一个恒定的值。为什么这么说呢?你想想,在小时候,你的头部比较小的时候,IPD其实是比较小的,但是你的大脑它会缓慢地追踪你的真正的生理的IPD的变化,并且它会把这个变化跟你的身高给耦合在一起,然后会出现一个什么问题呢?
在虚拟现实里面进行试验的话,如果你设了一个超大的IPD,然而没有改变玩家的虚拟身高的话,你会发现整个世界缩小了,就像我们刚才说的一样。但是如果你把玩家的身高也给提上去的话,那个感觉又不一样了。你会发现整个世界虽然缩小了,但是我玩家变大了,然后你大脑里面会产生一个逆反的过程,认为世界没有变小,而是我玩家本人变成了巨人。所以这在设计里面是非常重要的一环。
随后说到这个问题,如果你们是在Unity里面的话,看到这两个选项:stereoseparation和convergence,就是指的我刚才说的这两个问题。这是非常非常重要的两个参数。如果你们想制造出非常精致的VR体验的话,这两个参数是必不可少的。当然,如果你不care玩家的视觉感知的话,其实你完全可以不用关心这两个参数。因为,像比如说Oculus而言,它的默认的参数可以让你变成一个成年人的IPD和一个高度,但不会有其他的任何非真实的模拟情况。
说到那个之后,我们说一下拍摄上面的一些问题。首先一个非常主要的概念就是360的视频不等于VR的视频,VR的视频,它其实是在360的视频的基础之上,加上3D的深度感知,这个其实说起来很简单,要做起来极其的麻烦,现在世界上都还没有一个厂商真正完美地解决这个问题,多多少少需要大量的手工修图,还有后期大量的软件处理。
为什么会这么复杂呢?它有两个关键的地方。第一就是正确的双目深度,也就是我刚才跟你说的360双目。第二个就是,它产生的一个问题叫做nonlinear resolution,特别是在顶视角和底视角的时候,你看到的画面的分辨率跟你拍摄的分辨率不是一个线性的map的过程,这个会造成你看到,明明正视的时候画面非常清晰,但是底视或顶视的时候它的分辨率会骤然下降。但第二个问题的处理方法要简单很多,现在大部分已经有解决方案了,只是复杂与不复杂的问题。但第一个是现在大部分人都还在努力解决的问题。
这个图显示的是一个Google jump的setup,它是Google提出来的一个算法。但现在其实,我们说到这个VR360拍摄的整个市场的话,真的可谓是乱象丛生、人才辈出。自从Google推出了这个东西之后,大量的山寨的仿冒厂商把它也仿制出来了。其实这个不难,就是用一大堆gopro相机,把它们组成一个环形的阵列,但其实真正麻烦的是什么呢?
Google内部的算法是——目前也就只有Google它的算法是正确的,它首先需要通过这个图形阵列,先重建整个360环境的一个深度信息,这是一个极其复杂的过程。得到这个3D的信息之后,然后在2.5D的情况下把它重新投射到你的两个眼睛里面,然后再进行输出。这是目前来说唯一正确的做法。
但是呢,咱们的这个市场里面人才真的是很多,会出现什么事呢?稍微有一点技术的,他会跳过2.5D reprojection的阶段,直接把生成的伪3D信息输出到你眼睛里面,这会造成一个什么问题?就是你看到的东西,可能在深度边缘会出现一些瑕疵。这个瑕疵出现的原因,是因为没有reprojection,它两边视差所带来的一些问题:所遮挡的信息被重新看到了,但是它原本的视频信息里面没有包含这一点。这个都还算好的。这个我们一般来说也认为它是一个正确的VR360。
还有一种。Hardware separation什么意思呢?我首先介绍一下概念,就是说在上世纪90年代末和2000年的时候,流行的360VR的设备是这个样子的。它是两两摄像机为一组,然后围一圈,这样你看到的一个摄像机阵列就不是环形的,而是一个比如说五边形或六边形,然后每一个边上有两个摄像机,每个摄像机只负责一只眼睛,这个叫做hardware separation。
它会造成一个什么问题呢?它会从两只眼睛里面取出图像然后输出到你的那个输出,按理来说,这个东西其实是没有问题的,一个摄像机拍摄一只眼睛,两个摄像机拍摄两只眼睛,最后一融合,那么不就是我们所说的一个完美的360视频吗?但其实这个是不对的,为什么这么说呢?因为在拍摄的时候,它的视差仅仅是在水平面,没有垂直。试想一下,如果你出现了一个场景需要把脑袋偏过来,两个眼睛的视差变成了垂直方向的话,它整个深度感知就完全消失了,你会看见两个重像,而不是3D的信息。
但是,通常在目前的硬件环境下来说,这是一个可接受的方案,因为大部分的电影还是基本上只需要平视就行了。然后在这个基础上呢,有些人提出了一些改善,在这个输出的图像上,在软件上进行一个叫做cross patching的过程,来修复里面的一些问题,为什么呢?在使用hardware separation这种setup的时候,因为你的相机数量没法做的太多,每个相机它会占用很大的空间,然后每一个边,你需要使用两个相机,就会造成很多信息的丢失。因为每一个相机——就是做过摄影的同学都知道,每个相机拍摄出来的东西会有镜头畸变,镜头畸变在镜头边缘的地方尤其严重,如果相机的阵列数量不够的话,畸变的严重后果就会导致两组摄像头之间的那个图像没法正确地缝合,所以就会加上这一步。然后我们说到这个地方之后,基本上涵盖了现在就是说市场上大部分的实践方式,最后我们来看一下国内很多山寨厂商牛逼的做法。
它会直接从源头跳到output,中间没有任何的处理,然后对所有的投资人,或对用户说,我们是3D的。为什么他们敢这么说呢?就是我刚才给你们说的,把2D图像强制转成3D,其实就是一个IPD等于零的过程,然后你会看到里面的人物图像非常大,确实有深度,但非常大,而且除此之外什么都没有。
OK,这个说完了之后,我们现在来说另外一个问题。其实这个东西不是因为VR才出现,这个是一个比较传统的问题。但是为什么要说这个问题呢,因为它其实跟VR息息相关。大脑的感知是这个样子的。一方面,它需要使用双目视觉来获得主要的深度信息还有大小信息,另外一方面,它需要很多单目视觉的画面上的信息来补偿它在双目视觉得到的信息。这两个结合在一起才会形成一个完美、真实、非常具有沉浸感的VR体验。
这个刚才已经说到了。现在看一下,我们所说的单目的信息有哪些?
首先是我们的motion parallax,就是说物体在运动的时候,你会看到一些视差的信息。为什么要这么说呢?其实一个物体,它如果是绝对静止不动的话,你闭着一只眼睛看它,是看不出它的大小信息、形状信息的。但是,如果它一旦在运动的话,你就能看出来,因为它会产生一种视差。它在这个地方看到的画面,跟在那个地方看到的画面会有一点微弱的不同,大脑会缝合这两个画面。
然后,这个内容比较多,我们跳过一部分。
这个叫做perspective scale cue。perspectivescale cue是什么意思呢?它就是一个大小的问题。大脑知道远的东西会小,近的东西会大,所以说这一点成为了很多,包括魔术师也好、艺术家也好利用的一个主要原理。比如说,大家看到这边这个图,如果就像这样,我们不给任何描述的话,大家会觉得这个黄色的正方体在最前面,这个次之,这个最远。但其实呢,并不是这样。如果我们把一个方块给放过来的话,大家就可以看到,其实这个小小的圆柱体是在最前面的。所以说,人类本身对于叫做透视感知的这个东西,就会break,因为没有光影其他方面的信息来补偿,仅仅通过大小的话,他就会判断错误。造成的这种illusion会产生很多有趣的东西,比如说,我们来看一下。
首先,我们说一下AO的重要性。刚才这幅图上面,因为没有阴影,没有光照,所以大家会很难判断这个小的圆柱体的位置。如果加入了阴影,加入了光照的话,物体与物体之间的空间相对位置就一目了然了,所以这个非常重要,叫做lighting cue。光照它的强度也会对这个深度的感知产生影响,但是这个影响比较弱。
然后是spatial occlusion,就是我刚才跟你们说的AO,这个是没有AO的,这个是有AO的。如果不加AO的话,我们会有一种错觉,觉得这几个小片是漂浮在空中的,一旦加上AO的话,你才发现它其实是放在一个平面上的。
比如我们现在看到一个常见的,叫做illusion,我相信绝大部分同学其实已经看到过这个东西,知道它是怎么做的。其实非常简单。(见视频)这个人他不是真正的直行的,他其实在不停地朝你这边运动,但是呢,整个房间和它的光照的布局,让这个房子看起来是一个长方体,其实它完全不是。然后我们再看另外一个(见视频)。这个被称为,到21世纪以来,对于大脑illusion的一个神作,大家可以看到这个霸王龙的脑袋不停地偏向你,但其实这个霸王龙的脑袋里面没有任何机械装置,但它就是会不停地跟随你的视线,这是怎么完成的呢?我们留一个悬念,后面来解释。
另外多说一点,就是我们说的艺术性光照。为什么说普通动画是2D的,如果你加上光照,就会产生一种3D的效果,就是因为这个原因。一般来说,如果大家想要做这种非真实性的渲染,这种画风的话,就一定要注意,美术跟技术这边要有良好的沟通,不然的话会产生非常低劣的深度感知。
刚才说了这么多,现在我们说到最重要的部分了,就是眼睛的舒适性和怎样避免头晕。眼睛的舒适性和头晕是现在困扰VR界最大的两个问题,最大最大的建议就是,无论怎么样,一定要保证你们的VR体验起来是不会晕的。其实网上有非常非常多的guidelines,告诉你应该怎么设计。但其实有些guidelines是错的,有些是对的,有些要么就是实践起来极其的复杂。
其实你们需要记住的只有一点,就是刚才所说的那些IPD也好,ICD也好,你们一定要把这几个数据精密地配合在一起,再加上一些小小的辅助设计,只有在这种情况下,才能真正达到不头晕的效果。比如刚才已经提到的好莱坞电影的拍摄过程,如果它不使用移轴摄像头的话,在动作戏的时候就很容易出晕。
首先,我们看两个重要的概念。第一个概念叫accommodation,其实就是通常说的一个聚焦的过程。眼睛在看到一个物体聚焦的时候,后面或者前面的其他物体会虚化,当然这是一个很普通的光学现象,但是我们眼睛里的肌肉和大脑对于物体跟图像的感知,它会非常非常灵巧地捕捉这个变化,这个就叫做accommodation。
然后另外一点叫vergence。Vergence是什么呢?accommodation主要是一个视焦的问题,但vergence主要是两个眼睛汇聚的一个问题,刚才不是说到两个眼睛会稍稍地向内有一个角度吗?这个角度汇聚到的那一点,叫做vergence point,其他的点会产生重影。这两个东西对于人类是司空见惯的,但是在VR里面,在当下的VR硬件下,它们是无法保证一致的。所以我们会出现叫做vergence-accommodation conflict的一个问题。因为什么呢?
我们看到下面这张图。比如说这个东西是我们现在的一个头显显示器的位置,这个显示器的位置是一个固定的值,但是它里面显示的物体,因为是分了左右眼的,所以大脑感知的深度其实是不一样的,刚才说是在这个范围内。如果这个范围跟真实的深度差别太大的话,大脑就会产生晕眩。这就是为什么有的时候,你在比如说虚拟家装的VR里面走动的时候容易晕眩,其中一个原因就是这个,因为它里面的深度变化比较大,并且没有使用比如说像景深一样的技术来弥补accommodation的偏差。这也是目前来说我们在VR产业里面一个最严重的问题。这个问题不能解决的话,你头晕的问题永远不能解决。
说到这个东西之后,我们现在再来看一个现在非常流行的东西。什么叫光长技术?光长技术,其实就是一个非常简单的东西,我们看到这个数学的公式不要怕,其实它说的问题非常简单,在我们视觉当中的任何一个表面上的任何一个点,照在它上面的所有的光线信息,都可以用这个五维的方程来描述。如果我们现在有一个设备,能够记录下这个五维方程里面的每一个变量,那么我们就可以说它记录下来了整个光长。
我们来看,这是现在时下最流行的一个公司,叫做lytro,它是怎么介绍它的光长技术的呢?在任意一个点,这个点所散发出来的所有光线,它会记录在这个相机里面。这样记录了之后,相机就会产生——这也是它最引以为傲的——后期对焦,我们先拍摄后对焦,就是因为它能得到光长信息,它能得到这一点的位置信息、法线信息、光线强度、本色信息,这些信息汇集在一起,就能通过软件后期处理的办法,进行重新定焦。
这是Adobe正在试验的一个光强相机的原型,这是它的镜头。一般来说,光强相机会通过叫做image array,一个阵列镜头的方式来实现。其实这也是我们向大自然学习的。
说完光长之后,我们现在简单提一下你的周围视角。你的周围视角呢,一般来说在VR里面会有两个参数来决定,一个叫dFOV,一个叫cFOV。一个是显式的FOV,一个是我们摄像机可以捕捉到的FOV,这两个FOV决定了你在VR里面的沉浸感。这个呢,大家可能不需要care特别多。怎么说呢?就是一个显式的FOV,一般来说是由硬件决定的,你没法左右。另外有一个小的叫做cFOV。cFOV就是相机捕捉的FOV,这个一般在特殊的情况下会遇到,如果你在游戏里面,比如想实现一个望远镜的效果,那么需要修改cFOV。但一定要注意,如果这两个FOV的值偏差很大的话,会造成恶心和呕吐。
我们顺带提一下,为什么VR里面容易造成恶心和呕吐的另外一个原因,就是没有参照物,因为它包裹了你整个视觉,通常的一个建议就是,不要出现这种狭窄的通道。在这种狭窄的通道里面的时候,因为两边的视差非常非常大,你移动的话,这边的运动速度非常快,这边的运动速度非常慢,你的大脑会出现accommodation-vergence conflicts的情况,这样就会产生强烈的晕眩感。一般来说,如果有这种场景的话,要么让玩家移动得很慢,要么就是扩大这个场景,或者说使用柱状的结构——柱状的结构就不是一个连续的平面——来避免这个问题。
顺带提一下,就是一个叫做CAVE system,为什么会出现这个呢?其实在很早很早以前,60年代也好、90年代也好,在那个时代的时候,大家意识到头显会带来种种的问题,于是发明了叫做CAVE的system。
CAVE的这个系统是干嘛的呢?它一般是四个面到六个面所组成的墙,一个正方体,你的用户会站在这个正方体里面,他看到的所有信息就会被投射在这个正方体里面,然后造成一个非常舒服的VR的感觉。为什么会出现CAVE呢?如果头显如此便宜的话。CAVE主要出现的问题就是,它很不容易头晕,因为玩家可以看到真实的自己,就是说,你已经有了一个参考物了。再加上它不是液晶屏对着眼睛直射,所以眼睛不容易产生疲劳,可以长时间的使用。
但是这个地方要清理一个误区。很多人认为CAVE还有一个更大的优点是,它原身支持多用,但其实这是错误的。一般来说,很多人认为,一个CAVE的话,那我就把我的图像投到四个或者说六个平面上,那么就完了,其实完全没有这么简单。就跟我们刚才第一个幻灯片里面说的一样,你需要使用移轴镜头。一旦你真正使用移轴镜头投影出来的画面的话,你就需要追踪他头部的位置,追踪他眼部盯着的方向,这样的话,如果两个用户站在里面,这个系统其实是无法追踪两个眼部移动、两个头部移动的,这样就会break整个sequence。
刚才这个东西说完了之后,我们最后简单地提一下,你在引擎里面可能会遇到的一些问题。首先是latency,就是什么的延迟,在VR里面,因为人类的大脑对于整个画面的延迟非常非常sensitive,稍微有一点延迟都会被大脑所捕捉。我们来看一下为什么延迟这么难以消灭。
一般来说,VR里面延迟包含这么多种。首先,因为是在设备里面的,所以本身就会产生很多误差。然后第二点呢,叫做sensor desync,因为每一个头显里面,每一个sensor,每一个传感器,它的采样速率会有微弱的不同,这些不同需要通过硬件或者软件的同步系统来完成。每一次同步的时候,会丢失掉一些时间,这叫sensor desync。然后另外就是display ghosting,这个东西呢,其实大部分已经解决了,在现在新式的OLED里面已经大部分解决了,现在还有一些在实验当中的技术,就比如在中间插黑帧来避免大脑产生一种脱影的效果。另外一点呢,就是一个最大的问题——刷新率,无论你的画面能够运算多快,它能够显示给你眼睛的速度始终是低于刷新率的,因为如果你的画面没有刷新出来的话,内部潜存里面的画面是无法显示到显示器上的。
另外一点呢,就是我的计算复杂度。这个话题要说的话比较多,我们只是简单说一下。在VR里面呢,一般来说最暴力的算法就是,你每只眼睛需要渲染一遍,叫做左渲染和右渲染,但其实呢,要真正优化这个东西的approach非常非常多,一般来说一个简单的办法就是使用硬件的instancing系统,如果你要做得更好一点,叫做cycle instancing系统,如果你在这方面是一个大师级的话,你会知道有一个叫做uber instancing的系统。
然后另外一个是我们引擎的问题,叫做pipeline model,传统的引擎的渲染路数跟VR这个时代的渲染是不兼容的,VR里面需要什么呢?把view warping后置,把之前所有跟视觉不相干的部分先渲染,渲染完之后,你需要保留到这个对投影矩阵的一个reference,然后在后面根据它的硬件得到最新的值,再赋予这个reference,然后重新在你视觉里面,根据这个新的view projection再渲染一次,这个问题直接就关系到一个叫做time warping的问题,time warping是干嘛的呢,就是如果你的渲染的速度比较慢的话,那么我们会有个系统,帮助你把当前这个画面按照一个真实的3D的感觉在视觉里面进行旋转,减少你头部对图像延迟的感知。但是这个东西不是万能的,比如一般来说,我们推荐的帧数是90帧,如果你的帧数是60-80帧的话,这个系统还勉强能够work,但如果是低于50帧的话,一样会看到明显的卡顿以及不适。
然后说一个有些常见的问题。这个问题,对于很多喜欢自己开发引擎,或者说想知道这些引擎里面怎么实现的同学来说特别有用,他们很多人会遇到这个问题。在VR里面看的时候,有些物体在左眼里面可见,有些物体在右眼里面可见,会造成一个问题。造成这个问题的主要原因是什么呢?
一般来说,我们在渲染的时候会有一个culling的过程,在视觉以外的物体我们都不会进行渲染,但在VR里面,有两只眼睛,如果两只眼睛都去进行一次culling,去进行剔除的话,运算太大了,所以以前有一些非常naive的办法,就是通过计算一个中间眼睛的视距,然后用这个来进行culling。
这样culling会有两个问题,第一,它会包含多一个物体,就是这一块,这一块是以前的视觉无法包含的地方,它会包含进去。第二个问题,它会少包含一部分,就是下面这一块。以前视觉里面有的,但是它无法包含。正确的做法是什么呢?一般来说是需要把中间这只眼睛的位置往下拉,沿着这两条线重新构建一个新的视锥,但是这个会造成新的问题,因为你的视点不是在以前那个视点位置,而是在一个很后面的地方,就会出现新的问题。好,这个问题我们就先提到这。
然后我们说一下projection。这个就是移轴镜头,移轴镜头其实它的原理就是这样子的。这是一个普通的正视,这是斜视,斜视最大的区别就是,你的视线跟这个视平面不是垂直的关系。如果我们在这几个画面上可以看到的话,就是说,一,它不是一个垂直的关系,第二,它不在正中间,不在正中间的话,会造成几个参数没法抵消,所以我们在最后的一个矩阵里面,这两项通常是被消掉的,因为l=r,t=b,但是在移轴的情况下,这两块不能消掉。说这个有什么意义呢?很多的时候,如果使用一些软件包裹的话,你会发现它在VR的情况下不work。或者说它经过小小的升级,说自己work,为什么它敢直接这么说呢?就是因为它补充的这块小小的投影矩阵。这块小小的投影矩阵,让它在左右眼睛里面看起来正确。
最后我们来稍微总结一下吧。VR里面,相机怎么摆设的问题,刚才已经提到了,其实是一个非常复杂的问题,最主要是需要注意到三个参数,IPD、IAD和ICD。然后呢,我们需要真正地理解人类的视觉还有就是通常的一些design guideline,把这些东西真正融会贯通之后,你设计出来的东西,才真正不会头晕,真正是用户体验极佳的。最后呢,还有很多技术的难题,我们现在都没有解决,包括硬件上和软件上。如果从硬件上真正解决的话,至少还需要5-20年的时间,达到真正的,像黑客帝国一样的体验。
然后我们说一下,VR未来是什么样的?为什么大家都在想做VR?不仅仅从游戏上面,比如说我们从电影上面,VR它会真正地推倒我们的第四面墙,让观众跟演员真正地站在一起。
美国有个剧场叫做The Lost,它是一个沉浸戏剧,演员在你周围演出,你跟着任何一个演员,去跟踪他的故事线,然后你就会得到一个非常一般的观影体验,但是还没完。因为每跟踪一个故事线,其实你只是得到了这个故事的一个小小的piece,你无法得到真正的整个故事的大观,如果你想真正知道的话,需要不停地进入这个影院,不停地观看,今天跟着演员A,明天跟着演员B,后天跟着演员C,但还不是这么简单,影院它为了增加这个剧场的复杂性。

它还有很多分支,比如说刚刚演员A和演员C进了一个房间,你想跟着进去看,但后面C他就会出来,他跟B又走到后面的森林里面,这些复杂的分支组合在一起,就变成了一个非常非常强烈的故事系统,观众需要反复地进入这个电影院,然后根据不同的策略来获取尽可能多的信息,一般来说这个电影需要看30多次,你才能知道这个电影最终讲了什么。这个东西就为我们提供了新的机遇、新的挑战。首先,这是一个非常好的观影体验,第二,这也是一个非常好的商业模式,不像传统的电影,你看一次就知道全部,就可以把它扔掉了,但这种观影模式并不是这样的。最后一条都没必要再说了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ