Unity3D引擎渲染技术系列(二):坐标空间与变换矩阵

发表于2017-04-09
评论2 4.8k浏览

模型进入世界空间后,接下来开始继续空间矩阵变换,观察空间也就是摄像机空间变换,摄像机决定了我们渲染游戏所使用的视角,在观察空间中,摄像机位于原点,同样,其坐标轴的选择可以是任意的,我们说说Unity3D引擎中的观察空间的坐标轴是:+x轴指向右方,+y轴指向上方,+z轴指向的是摄像机的后方。读者在这里可能觉得很奇怪,这与之前讨论的模型空间和世界空间中+z轴指的都是物体的前方。为什么不一样?Unity的世界空间是左手坐标系,而观察空间是右手坐标系。在观察坐标系中正前方是-z轴方向。

这种左右手坐标系之间的改变很少会对我们在Unity中的编程产生影响,因为Unity为我们做了很多渲染的底层工作,包括很多坐标空间的转换。但是如果我们自己使用矩阵计算比如使用接口Camera.cameraToWorldMatrix、Camera.worldToCamaraMatrix等接口计算时就要注意问题小心之间的差异。

顶点变换的第二步,就是将顶点坐标从世界空间变换到观察空间中,这个变换称为观察变换。

再回到我们前面介绍的世界空间中的模型,我们需要将模型的孩子从世界空间变换到观察空间,为了得到顶点在观察空间中的位置,我们有两种方法:一种方法是计算观察空间的3D坐标轴载世界空间下的表示,构建出葱观察空间变换到世界空间变换矩阵,再对该矩阵求逆来得到从世界空间变换到观察空间的变换矩阵。我们还可以使用另一种方法,即平移整个观察空间,让摄像机原点位于世界坐标的原点,坐标轴与世界空间的坐标轴重合即可。这两种方法得到的变换矩阵都是一样的,不同的只是思考的方式。

在这里我们使用第二种方法,通过Transform组件,如下图所示:


        摄像机在世界空间中的变换是先按(30,0,0)进行旋转,然后按(0,10,-10)进行了平移。为了把摄像机重新移回道初试状态(也就是摄像机原点位于世界坐标的原点、坐标轴与世界空间中的坐标轴重合),我们需要进行逆向变换,即先按(0,-10,10)平移,以便将摄像机移回道原点,再按(-30,0,0)进行旋转,以便让坐标轴重合,变换矩阵如下所示:


        由于观察空间使用的是右手坐标系,因此需要对Z分量进行取反操作。我们可以通过乘以另一个特殊的矩阵来得到最终的观察变换矩阵:


         现在可以对模型的孩子节点进行变换了:


        这样我们就得到了观察空间中的孩子的位置为(9,8。84,-27.31)。

        给读者介绍矩阵转化的实现也是为了揭示引擎内部是如何实现的,我们使用Unity也可以做一些矩阵变换,这也有助于读者对世界空间矩阵和观察空间矩阵的理解以及应用。后面继续介绍裁剪空间中的运算。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引