相机、透视图、视口、投影

    渲染好的场景都需要一个可以供用户查看的视图,我们通常在3D场景中用相机来提供这种需求。相机相对场景有位置和方向,就像我们生活中的相机一样,它也提供透视图查看方式,这种方式可以有近大远小的效果。相机最终会将三维的场景渲染成一幅幅二维的图片,我们就可以通过它的视口进行观察。

    相机处理计算时主要涉及到两个矩阵,第一个是线性变换矩阵(之前章节我们称为转换矩阵),它负责定义场景物体的位置和朝向,第二个是投影矩阵,它负责将三维场景物体投影到二维视口中。当然具体的细节需要太多数学理论,所以Unity3D都将这些已经封装好了,我们开发人员只需要简单的“瞄准、发射”。

    图3-5中描述的是相机核心概念视口和投影,在图中左下角那只大眼睛就代表我们的相机所处的位置,红色的x轴代表相机的朝向,两个蓝色的方块就是被观察的物体,绿色和红色的矩形分别代表近切面和远切面(两个切面之间的物体才可以被看见,而这之间的区域我们称为可视平截椎),近切面就是我们的视口,投影在视口上的图像就是我们真正看见的图像。
《VR入门系列教程》之13---相机与立体渲染-LMLPHP 
图3-5

    相机非常强大,它可以让观察者非常真实地观察一个三维场景,此外,它还为动画场景提供了强大的支持,通过移动相机就可以像拍电影一样创建一个动态的叙事的场景,当然,对于VR来说需要我们不能随意移动相机,如果要移动相机我们需要多方面考量,最好做到让用户完全控制相机,这样用户会有一种身临其境的感觉。

立体渲染

    在虚拟现实中,三维图像渲染是一个大问题,然而现在又碰到了如何处理相机这个难题,相机本身就需要处理变换矩阵和投影矩阵,可恶的是,VR中我们还需要处理两次(每只眼睛处理一次)。不过境况并没有那么糟糕,我们有几种处理相机的方法,下面来介绍一个最简单的方法:

    创建一个主相机:应用程序控制唯一一个主相机,所有的逻辑动画等等都只针对主相机,这样,我们在处理相机与其他物体交互的时候就变得简单统一,此外需要注意主相机不参与真正的渲染。主相机还有一个好处,就是可以在双立体视图和传统单一视图之间切换。

    用两个相机渲染:除了主相机,VR程序需要外加两个相机,用来真正处理渲染。这两个相机需要与主相机的位置和朝向保持一致,只是有一点不同,就是它们分别要向左向右偏移一点点,用来模拟我们的瞳距。

    渲染至两个视口:VR应用分别创建的左右眼的渲染相机,它们的视口宽度都是屏幕宽度的一半,高度都为屏幕高度。每个相机处理图形的时候都用了特殊的投影矩阵,这个投影矩阵可以处理反畸变问题(Oculus SDK中提供了这个算法)。

    至此,我们已经简单的了解了VR的图像处理过程,这里讲的非常简单,如果要深入那么每一个点都可以用一整本书来介绍。随着你的程序变得越来越庞大,你需要处理大量的底层问题,对于这些问题最好交个游戏引擎来做,当然,你要是非常NB,你可以自己写一个引擎,但是如果你跟我一样希望集中精力做应用层的事情,那么最好还是使用一个现成的引擎。目前市面上有许多很好的引擎,其中包括下节要介绍的Unity3D游戏引擎。
05-28 13:02