本文主要是介绍计算机图形学(1) Viewing Transformation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.概述
Viewing(观测) Transformation由View transformation 和Projection transformation组成,也即视图变化和投影变化。观测变化是将三维空间中的点变换成二维空间中,就好像是人们用相机将三维空间的场景拍摄下来,最后形成照片一样。那么,不妨使用这个形象的比喻将空间中的变化表述出来。
2.View(视图) Transformation
View Transformation 是啥?在回答这个问题前,我们先想想现实生活中,我们是如何拍照的这个问题,首先,我们得将我们所需要拍摄的物体(粗略地包括人啦)放好位置,人也需要摆好pose,这样我们就完成了第一步,其次,我们得确定相机的角度,这是很重要的,一个好的拍摄角度才能拍出出色的效果嘛,最后一步,就是按下拍摄键,相机将场景上的一切映射成一张图片。
通过上图我们就可得知,View Transformation就是第二步确定相机的位置角度,那么问题又来了,该如何去确定这个相机的位置以及角度呢,这就需要我们在空间中确定一些向量来确定位置,如图
我们定义一个相机所处的置点e,然后定义它的看向方向,以及这个Up direction,这个向量主要是控制相机的左右旋转,有点像汽车的方向盘。确定好后又出现了一些问题,由于相机的位置可以出现在任意位置,物体也是,能不能通过一种变换将问题统一化管理呢。如图:
在生活中,我们知道当我们在车上,不知道外界情况的情况下,我们也不会觉得在运动,这是一个简单的物理知识,是由于物体的相对运动的结果。那么,我们将相机始终固定在一个点即e为原点,up对应Y轴,look at对应-Z轴,那么物体也会随之改变。那么为啥要这么做,这其实是一种约定俗成,把相机放在原点有很多的好处,能够简化很多计算,当然也会出现问题,即在Z轴上离相机越远它的Z值越小,离相机越近Z值越大。接下来,我们要将这些变化写成矩阵,该如何去用矩阵表示,下图将进行分析。
这个变换要将我们上述说的,将e放到原点,g X t 转换成X,t 转换成 Y ,g 转换成 -Z。但是这样转换好像有点困难,我们不妨反过来进行转换,因为将Y转换成t较为简单((0,1,0)-->t的坐标),这样我们得到其逆矩阵,由于正交矩阵的性质,逆矩阵等于其转置矩阵,这样我们就可以求出原变换矩阵。
总结,一些视图变化做了啥,将相机的位置和角度设置成了约定俗成的结果,因为物体都是和相机一起运动的,所以视图变换又称为模型视图变换 。
3.Projection Transformation
那么,我们将物体和相机的相关位置和角度都设置好了之后,接下来的工作就是投影啦,也就是形成照片,我们知道投影分为两种:Orthographic projection(正交投影)和Perspective projection(透视投影)。这两者的视觉效果如图。
可以很直观地看出透视投影是由一个点和空间中的一个平面相连形成一个四棱锥,具有近大远小的视觉效果,而正交相机则直接将一个面映射出来不会有其他的视觉效果。
3.1 Orthographic Projection
我们先来分析正交投影,我们先进行一个简单的处理方式,对于正交投影,我们将摄像机处于原点,让其看向-Z方向,然后我们拿掉Z轴,这样一个三维的空间就变成了二维,也就是物体映射在了XY平面上,然后再将其进行平移和缩放到一个的正方形内(约定俗成的做法)就完成了正交投影 。
通常的做法如下,也其实是差不多的,只不过上面的描述更容易理解。
我们要关注的是该变换矩阵是如怎样的,首先,我们得将长方体(使用通常定义)的中心平移到坐标轴的原点,然后再将各边进行缩放,缩放成的正方体,正交投影就完成了。同时注意:这和OpenGL有差异,OpenGL使用的是左手系,其结果可能相反。
3.2 Perspective projection
经过上面的介绍,透视投影会有近大远小的视觉效果,那么该投影的矩阵变换是怎么样的呢,看下图结合文字理解,我们知道透视投影会和投影平面形成一个椎体,而正交投影是一个长方体,同时两者在空间当中取一个近平面和远平面,那么会得到一个Frustum(描述得到的空间体)和Cubiod,不难发现将Frustum的远平面挤压成和近平面一样大,然后再进行正交投影不就可以得到透视投影了嘛。把未知的转换成已知的,是常用的解决难题的方法。
但是要定义一些规则,从而得到唯一解。如近平面的点是不会变化的,远平面的中点是不会变得,nf之间的距离是不变的即Z是不变的,我们只是将远平面进行缩放。我们如果从侧面观测便可以得到一些数学关系。
根据相似三角形的一些性质可得,如图的关系,从而进一步确定x和y前后变化的关系。
但是Z的变化始终不知道,但是根据前面定义的规则,近远平面的上的点不会发生改变,我们就可以得到计算。
这里,需要说明的是对于齐次坐标而言,所有坐标乘以一个相同的数,其仍然代表相同的点 。上面得到了第一个等式,是对于近平面上的点而言的。
由近远平面上的点得出两个等式,从而可以求出变换矩阵第三行的内容,从而得到挤压的变换矩阵,最后再将这个矩阵和正交矩阵相乘即可,得到透视投影的矩阵变换。
参考闫令琪老师的课程所做的笔记,供大家参考阅读。
这篇关于计算机图形学(1) Viewing Transformation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!