视图变换(View transformation)
视图变换定义
将三维的物体某个视角转换为二维的视图。这个过程可分为三个阶段:mode transformation、view transformation、projection transformation,简称mvp变换。可以将其类比为拍照的过程:
- 找好地方,聚集拍照对象。(模型变换)
- 寻找一个合适的角度放置相机。(视图变换)
- 点击拍照。(投影转换)
ModeView transformation
定义相机
相机的参数:
- 相机的位置e。
- 相机拍照的方向g。
- 相机镜头的上下方向。
相机初始默认位置定义
如果在一个车上拍照,相机和拍照对象一起移动,拍出的照片与车子静止时拍照的效果相同。为了方便,将相机放置在原点,同步移动被拍照的物体,这样拍出的照片效果相同。
视图变换的过程
此处默认为右手坐标系,将相机设置到原点,相机拍照方向朝向-z,相机的上下仰角方向朝向y。
模型视图变换
由于拍照对象需要和相机一起移动,实现相对运动。视图变换的同时也涉及到模型的同步移动,于是,这个过程也经常被称作模型视图转换( ModeView transformation)
投影变换(Projection Tranformation)
投影变换的定义
在计算机图形学中,投影变换目的就是把场景世界中的3D物体转换为2D平面图形的过程,转换后降了一维。最常见的视图变换有透视投影视图变换,正交投影视图变换。
正交投影变换
正交投影矩阵也叫平行投影,投影的方向和坐标轴要么平行要么垂直,无论离摄像头的距离有多远,投影出来的大小都是一样的。正交投影被常应用于如CAD的主视图、左视图、俯视图就采用正交投影。
正交投影可以有下面两个步骤组合来完成:
- 把中心移到原点,将前后、上下、左右裁切面组成的长方体盒型视域体的中心点平移到坐标原点,这一步为平移变换。
- 把x、y、z的值拉伸成[-1,1],通过缩放把长方体盒型视域体变换为规范化立方体,这一步为缩放变换,且为非均匀缩放。
注意:
- 这里需要特别说明的是,由长方体非均匀缩放后变换为立方体肯定会导致绘制图形的拉伸导致图形的比例失调,但是不会扭曲,因为进行的是线性变换,之所以变换到规范化立方体纯粹是为了计算的简化,最后输出到屏幕时还会通过反变换的方法重新恢复原有的比例。
- 注意上述是右手系,摄像头视线朝向z轴的反方向,z轴方向的坐标一般为负值,离摄像头越远值越小。openGL使用的左手系,结果与之相反。
透视投影
透视投影的结果跟真实观察的场景是一样的,就像两条平行的铁轨在远处会交会到一个点,也就是常说的近大远小。
透视投影拆解成两个步骤:
- 首先把远裁切面收缩到和近裁切面同样大小的面(由于采用线性变换,远近裁切面之间的区域也会相应地收缩,越远收缩程度越大,这样就形成了近大远小的效果),这样视域体就成了和正交投影一样的长方体区域(Mpersp -> ortho);
- 接下来,再进行一次正交投影就可以变换到规范化立方体区域了,见如下示意图。而正交投影矩阵已经推导出来了,现在只需要推导出第一步的收缩矩阵即可(Mpersp )。
透视投影推导
Mpersp -> ortho 的推导
首先要寻找(x ′,y ′,z ′ )和( x , y , z )的关系,先从侧面看,根据相似三角形得到以下关系。
可得到x,y和x如下所示:
将上述过程放在齐次坐标系下,我们可以发现向量( x , y , z ) T发生了以下变化(z仍然未知),然后稍微转化一下形式,让列向量乘以n。
转换为矩阵运算:
逆向推测出Mpersp -> ortho的不部分参数,但仍然有一行未知,需要根据已知条件求解:
条件一:任何在近(n)面上的点没有变化,z不变。把z=n带进去,然后列向量乘以n,列出方程:
可以看到结果列向量的第三行是n2,所以第三行必须是(0,0,A,B)的形式。然后可以得到:
条件二:任何远(f)平面上点的z没有变化,z不变。这次我们选取原平面上的中心点(0,0,f,1)做为特殊点,得到:
联立方程组,解出A,B:
求出Mpersp -> ortho:
透视投影的变换矩阵Mpersp 的推导
视锥
从相机出发,看到一个平面,并定义这个平面:
- 长宽比(Aspect ratio)=宽度/高度
- 垂直可视角度(forV)(Field of View),相机能看到的范围,红线虚线形成的夹角代表垂直垂直可视角度。
利用多个可视角度定义视锥
根据垂直可视角度和长宽比确定l,r,b,t(左,右,上,下)
Latex编写工具
https://webdemo.myscript.com/views/math/index.html#