今天学的还是变换。L4主要讲述了计算机图形学中以下几个部分:
三维仿射变换:三维坐标的仿射变换矩阵与二维原理相同。
MVP(模型、视图、投影):包括视图变换和投影变换。视图变换中,如果相机和物体同时保持相对移动,则相机观测到的画面不变。投影变换包括正交投影和透视投影,正交投影没有近大远小的效果,透视投影有近大远小的效果。
正交投影和透视投影的具体操作:正交投影的标准操作是把立方体转换成标准立方体,标准立方体的中心在原点,各轴覆盖范围是[-1,1]。透视投影的思想是近大远小,先把一个截锥体投影成一个长方体,然后再做一次正交投影。
一、3D Transformation 三维变换
三维坐标的仿射变换矩阵与二维原理相同,不再赘述。
值得注意,三维坐标下的仿射变换矩阵,最后一行是(0,0,0,1)。
图示是三维坐标下分别绕x、y、z轴旋转的旋转矩阵。
观察到,为什么绕y轴的旋转矩阵,角度的正负和其他俩方向不一样呢?
其实是根据右手螺旋定则,当绕y轴旋转的时候,x轴与z轴的叉乘方向与y轴正半轴正好相反。
(三维坐标中坐标轴的方向向量可以由另外两个坐标轴的方向向量叉乘得到)
二、MVP (Model View Projection 模型、视图、投影)
1.View/Camera Transform 视图变换
如果相机和物体同时保持相对移动,则相机观测到的画面不变。
规范:摄像机在原点,绕-z轴移动(仍然是右手系),向上方向t指的是相机的正上方,用于表示相机的旋转,类似方向盘的正中朝向,如果旋转相机,向上方向也会跟着旋转。
我们把look at 观测方向旋转到-z方向,把向上的方向t旋转到Y方向,(g x t)g和t的向量积旋转到X轴。
想先平移再旋转,那么先作其逆矩阵。如图Rview的逆,第一列是g x t 的向量对应的分量。
R view的逆,如果乘(1,0,0,0),得到的就是第一列,g x t;如果乘(0,1,0,0)得到第二列t;如果乘(0,0,1,0)同理。
对R view的逆求逆,因为旋转矩阵是正交矩阵,所以旋转矩阵的逆矩阵就是它的转置,得到R view.
2.Progection 投影变换
Orthographic Projection 正交投影:没有近大远小,常用在工程作图
Perspective Projection 透视投影:有近大远小,“道理我都懂,但这个鸽子为什么这么大”
(1)Orthographic Projection 正交投影
相机摆在原点,朝-z方向看
正交投影的标准操作:把立方体转换成canonical cube 标准立方体。标准立方体:中心在原点,各轴覆盖范围[-1,1]。
我们在x轴上定义left,right;在y轴上定义top,bottom;在z轴上定义far,near(因为我们看着-z方向,所以在z轴方向是远<近)。
s1:把中心移到原点。把中心(r+l/2,t+b/2,n+f/2)平移至原点。平移-(r+l/2,t+b/2,n+f/2).
s2:缩放。把立方体在x,y,z的宽度(r-l,t-b,n-f)变成2。缩放因子分别是2/r-l,2/t-b,2/n-f
PS:以上全部建立在右手系上,如果看到正好相反的运算矩阵,则是左手系。
(2)Perspective Projection 透视投影
思想:近大远小,比如先把一个frustum(截锥体)投影成一个cuboid(长方体),然后再做一次正交投影
规定:1.近平面永远不变
2.远平面的z值不会变(仍是f)
3.远平面的中心点不变((0,0,f))
(使挤压结果唯一)
透视投影的步骤:
s1:求从透视到正交的矩阵M_{persp->ortho}
s2:正交投影
s1:求“挤压”矩阵
如图侧视图,原本的x,y,z经过squish会变成x',y',z',形成一个相似三角形。根据相似三角形,对于任意一个点,用y轴坐标举例,会得到:
对于x,z同理。
PS:近平面的点z=n,远平面z=f。
But注意:挤压后,近平面和远平面之间,位于棱台内部的点的z值也会发生变化。点(x,y,z,1)在挤压后会被映射成(nx/z,ny/z,unknown,1)
回忆齐次坐标的性质,在齐次坐标中,表示一个点,我们把x,y,z坐标同时乘一个数,表示的是同一个点。
于是同时乘以z,坐标变成(nx,ny,unknown,z)。
接下来推导M_{persp->ortho}
观察z轴,得到规律:
1.near plain上的点不变
2.far plane上的点的z值不变(仍是f)
先看近平面:在三维空间中表示相同的点(x,y,z),其坐标表示不一定一样,所以近平面上的(x,y,n,1)可以表示成(nx,ny,n^2,n)。
推导出M_{persp->ortho}的第三行形如(0,0,A,B)。
再看远平面:远平面的中心点(0,0,f)经过变换齐次坐标不变,仍是(0,0,f,1),再映射成(0,0,f^2,f)
综上,根据近平面,我们得到一个和A,B有关的展开式;根据远平面的中心点,我们得到一个和A,B有关的展开式。
解得到:
故(0,0,A,B)解得为(0,0,n+f,-nf)。
则M_{persp->ortho}是:
该矩阵满足:
齐次坐标下远平面的点(x,y,z,1)呗映射成(nx,ny,(n+f)z - nf,z),表示的点即为三维空间中的(nx/z,ny/z,n+f-nf/z)即为挤压后的(x',y',z')。
s2:做正交
最后求透视矩阵:s1把截锥体挤压成立方体,s2再做一次正交投影,
即透视矩阵=正交矩阵·(透视->正交)矩阵。
终了。