在osg中观察矩阵接口设置如下:?其中eye是相机的世界坐标位置,center是相机观察的位置,up是相机向上向量。?在计算机的三维世界中,相机如同我们的眼睛,捕捉眼前的每一副画面,反过来物体要能够被相机在指定的距离和角度下观看到,并通过屏幕像素绘制出来。
在这个过程中,物体的三维空间坐标需要经过好几层矩阵变换,最终转换到二维平面坐标,并通过像素呈现在屏幕中。我们将这几层矩阵变换过程简称为MVPW矩阵变换。
MVPW中的M是模型顶点在三维场景中的位置。
一般情况下,模型在绘制过程中都是使用模型自身坐标(通常称为模型坐标或者小坐标),模型的顶点位置称为pos,通过变换矩阵?matrix改变模型位置、姿态、大小,将模型放置在指定的三维场景中。这时候模型顶点在三维场景中的坐标位置worldPos?=?pos?*?matrix。
MVPW中的V是观察矩阵,作用是将世界坐标转为为相机坐标。在相机坐标系下,以相机作为参考,其位置为原点,world*?viewMatrix可获得模型顶点在相机坐标下的位置。
其中eye是相机的世界坐标位置,center是相机观察的位置,up是相机向上向量。
????我们可以通过建立坐标轴来说明,在相机坐标系下,eye与center的方向构建出的向量为前向量F,即Y轴;F向量与up进行叉乘后得到右向量R,即X轴;R向量与F向量叉乘后的得到up向量U,即Z轴。此时相机坐标系的XYZ轴就建立完成了。
图1:相机坐标轴
图2:视口逆矩阵结构
????在FreeXEarth中第一人称操作器、第三人称操作器、地球操作器都是通过对视口矩阵平移、旋转等操作实现的。
MVPW中的P是投影矩阵(projectMatrix),?在计算机三维图像中,投影的作用是将三维坐标信息转化到二维坐标中。投影有两种:透视投影和正交投影。
图3:正交投影视景体(长方体)
????例如,两条平行线投影变换后仍然保持平行,不会出现远处的物体变小近处的较大。
????left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。
????透视投影是在相机坐标下裁剪一块四棱锥区域,通过视口变换到一个(-1,1)的正方体中,最终将正方体信息投影到四棱锥的前面上。通过透视投影变换后的实体呈现出近处大远处小效果。透视投影跟人的眼睛或相机镜头观察到的效果是一致的。
图4:透视投影视景体(四棱锥)
????fovy——相机的角度大小,视角小就是焦距大(长焦),视角大就是焦距小(广角);
?aspect——实际窗口的纵横比,即width(窗口宽度)/?height(窗口高度);
zNear——近处裁面,如果物体的位置到相机距离小于近裁剪面,该物体会被相机裁剪掉;
zFar——远处的裁面,如果物体的位置到相机距离大于远裁剪面,该物体会被相机裁剪掉。
图5:fovy,?aspectRatio,?zNear关系图
其中当三维坐标经过了MVP转换后,还需要经过窗口变换,才能显示在屏幕中。
窗口矩阵变换主要作用是将视口裁剪后的结果映射到屏幕中,通过viewport获取屏幕显示区域的大小,将帧缓冲区域内的数据转变为能显示在屏幕上的像素。
图6:矩阵变换工作流程
????当数据进行MVP矩阵转换后,得到裁剪坐标,在经过坐标除以w之后(称为透视除法),会得到标准化设备坐标(NDC),标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。
????任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上,最终将x、y分别于viewport中显示的宽度、高度相乘,得到最终的屏幕坐标。整个过程也是世界坐标转换为屏幕坐标的过程!
图7:标准化设备坐标
最后,让我们一起回顾MVPW的整个过程:
M用来模型位置变换,调整模型位置,变换后的物体坐标是全局坐标,也成为世界坐标;
V是相机的视口变换,用来构建相机视口坐标系,将物体全局坐标转换为相机坐标中;一般我们将模型变换与视口变换统称为模型视口变换,即modelView;?
P是投影变换,构建一个裁剪的视景体,或长方体或四棱锥,对场景进行裁剪;
W是窗口变换,作用是将帧缓冲区域内的数据转变为能显示在屏幕上的像素。