计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)
目录
一、简介
我们可以这样来描述观测变换(Viewing transformation)的任务:将虚拟世界中以(x,y,z)为坐标的物体(三维)变换到 以一个个像素位置(x,y) 来表示的屏幕坐标系之中(二维),这确实是一个较为复杂的过程,但是整个过程可以被细分为如下几个步骤:
1.模型变换(Model transformation)
将模型空间转换到世界空间,这一步的目的是将游戏场景中的物体调整至他们应该在的位置。
2.视图/摄像机变换(View/Camera transformation)
将世界空间转换到观察空间,在游戏中我们真正在乎的是摄像机(或者说眼睛)所看到的东西,也就是需要得到物体与摄像机的相对位置。
3.投影变换(Projection transformation)
将观察空间转换到裁剪空间,根据视图变换得到了所有可视范围内的物体对于摄像机的相对位置坐标(x,y,z)之后,便是根据是正交投影(Orthographic)还是透视投影(Perspective),裁剪空间的目标是能够方便地对渲染图元进行裁剪:完全位于这块空间内部的图元将会被保留,完全位于这块空间外部的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。
4.视口变换(Viewport transformation)
将裁剪空间转换到屏幕空间, 接下来,需要把裁剪空间投影 (真正的投影其实发生在这里) 到屏幕空间 (screen space) 中。经过这一步变换,我们会得到真正的像素位置,而不是虚拟的三维坐标。即 [ − 1 , 1 ] 2 → [ 0 , w i d t h ] ∗ [ 0 , h e i g h t ] [-1,1]^2 \rightarrow [0,width]*[0,height] [−1,1]2→[0,width]∗[0,height],其中width和height指屏幕分辨率大小。
二、模型变换
就像简介说的一样,就是利用基础的变换矩阵将世界当中的物体调整至我们想要的地方(旋转,平移,缩放)。
三、视图变换(或摄像机变换 camera transformation)
上文说,视图变换是为了得到了摄像机和物体的相对位置,那么怎么获得这个相对位置呢?
首先,我们需要先定义一个摄像机,通过下面三个信息我们可以定义一个摄像机:
摄像机的位置 e ⃗ \vec{e} e
摄像机观测方向 g ^ \hat{g} g^
摄像机的向上方向 t ^ \hat{t} t^
OK,现在我们在空间中定义了一个摄像机,我们知道,只要物体和相机的相对位置不发生变化,那它们在空间中如何移动,相机观测获得的结果是相同的,所以我们不妨把相机规定到原点、向上的方向就是y轴正方向、并且向z轴负方向观测(右手系),其他的物体也随着相机移动到对应的相对位置上、我们得到的结果肯定是一样的。
所以我们需要一个视图变换矩阵 M v i e w M_{view} Mview这个矩阵将实现以下功能:
所以 M v i e w = R v i e w T v i e w M_{view}=R_{view}T_{view} Mview=RviewTview
T v i e w = ( 1 0 0 − x e 0 1 0 − y e 0 0 1 − z e 0 0 0 1 ) T_{view}=\left(\begin{matrix}1&0&0&-x_e\\0&1&0&-y_e\\0&0&1&-z_e\\0&0&0&1\end{matrix}\right) Tview=⎝⎜⎜⎛100001000010−xe−ye−z