在《Duanxx的图像处理学习:透视变换(一)》中简要的说明了透视变化的算法,这里再进一步的对透视变换做说明。
基于前面的说明,可以很容易发现, 一个变换矩阵有如下你的分区特性:
一般来说,我有一个三维变换矩阵如下:
矩阵中的元素(p , q , r)取非全0时,能产生透视效果
一、一点透视
来看下面一张图:
现在是以z轴上的一点(0,0,d,1)为投影中心,计算P(x,y,z,1)点在XOY平面上的透视投影。
那么,现在很容易知道:
即:
这里取:
那么变换矩阵T,就为:
结果的其次坐标表示为:
现在对z的取值进行分析:
1、 如果z=0,那么, [x’ y’ z’1]=[x y 0 1]
2、 如果z是无穷大,那么[x’ y’z’ 1]=[0 0 1/r 1]
由上面的分析很容易看到,z值取无限大的时候,所有的点经过变换后均集中在Z轴的1/r 处,这个点就被称为灭点。
在x轴和y轴上同样存在这种点。
二、两点透视
如果在 p , q , r 中有两个非0元素,这时将会产生两个灭点,得到的透视图称为两点透视,或称成角透视。
例如:设p不等于0, r不等于0, q= 0, 看透视变换的效果。
取极限后,很容易知道,这里,一个灭点在X轴上的 1/p 处;另一个灭点在Z轴上的 1/r 处。
三、三点透视
由上面的一点透视和连点透视,以此类推,当p、q、r三个元素全为非 0 时,变换的结果将形成三点透视。产生的三个灭点将分别位于X轴上的 1/p 处、Y轴上的 1/q 处和Z轴上的 1/r 处。
此时,投影面和三坐标轴均不平行
其公式依照以前的公式很容易推导出来。
这里我就可以简单的推断:
1、与一个坐标轴垂直的平面作为投影平面的话,该平面上的投影一定是一点投影。
2、与两个坐标轴相交且与第三个坐标轴不相交的平面作为投影平面的话,即,投影面平行于一个轴,该平面上的投影一定是两点投影。
3、与三个坐标轴都相交且不含有任何坐标轴的平面作为投影平面的话,该平面上的投影一定是三点投影。
四、一点透视投影的变换矩阵
这里仍然以Y轴为例子,要生成一个透视投影,需要两个步骤
Step1:利用上面的透视变换矩阵,对视界中的立体图进行透视变换
Step2:对XOZ坐标做正投影
由于在生成一点透视图时,为了避免特殊位置透视,使产生的透视图立体感较好,通常要在进行透视变换前先将立体平移到一个合适的位置(例如离开坐标系中心),然后再进行透视变换
所以其最终的透视变换矩阵为:
五、两点透视变换矩阵
要形成两点透视变化,也需要两个步骤:
Step1:先使立体绕Z轴旋转一个角度q,以使得立体上原平行于坐标平面XOZ和YOZ的表
面与投影面XOZ产生一定的倾斜角(成角透视),这里的计算可以参考《Duanxx
的图像处理学习:图像变换 三维变换及其齐次坐标表示》
Step2:向XOZ投影面作透视投影(这里的操作就是上面的第四条了)
这里有点像是在降维的操作。
由于在上面的变换矩阵中,有两个非0参数:(qsinq , qcosq),故生成的透视图为两点透视。
在两点透视图中,只有原来与Z轴平行的立体上的棱线仍旧保持与Z轴平行,其余的棱线(例如原来与X轴及Y轴平行的棱线)将倾斜(成角)。
六、三点透视投影的变换矩阵
由两点透视变换方法,我们可以很容易的知道,三点透视变换的方法为:
Step1:先使立体绕Z轴旋转一个角度q
Step2:再绕X轴旋转一个角度f(类似于轴测变换),这样使得立体上原平行于三
个坐标平面的表面均与投影面XOZ产生一定的倾斜角
Step3:向XOZ投影面作透视投影。