一、观察:正交投影
1.特性:保持平行线在投影后仍然是平行的
2.一个长方体,对处在只有深度不同的位置上的同一物体来说,它的大小不会改变。
3.透视投影:平行线在远处会相交(例如铁轨)
4.glOrtho()函数:这个函数描述了一个平行修剪空间。这种投影意味着离观察者较远的对象看上去不会变小(与透视投影相反)。在3D笛卡尔坐标中想象这个修剪空间,左边和右边是最小和最大的X值,上边和下边是最小和最大的Y值,近处和远处是最小和最大的Z值。 正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。
5.用途:这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确
6.glOrtho函数只是负责使用什么样的视景体来截取图像,glOrtho(left, right, bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。
假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是3的框框把这个球体整个都装了进来。 如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是1.5, 高是3的框框把整个球体的右面装进来;如果设定glOrtho(0.0, 1.5, 0.0, 1.5, -10, 10);就表示用一个宽和高都是1.5的框框把球体的右上角装了进来。
例题:
在何种情况下,我们需要用M来代替glOrtho?
矩阵中唯一改变的项是 (2,2)这一项。
我们把它从 −2f−n (glOrtho中) 变成了 2f−n。在glOrtho中,这一项是负的,因为我们把近裁剪面和远裁剪面定义为了正整数,但它们应该是负的,实际上它们代表了平面 z=−n 和 z=−f。
如果我们看向一条正的坐标轴时,则不需要把它变为负数。
二、透视投影
1.投影的中心是相机或是眼睛的位置
2.,中间竖线是屏幕,把后边的物体投影到屏幕上,求取x`的坐标?
利用小三角形和大三角形相似,d/x`=z/x,的x`=d*x/z,所以物体距离屏幕越远,所看到的越小
4.都除以-z/d,为什么是负号,同样道理,相机朝着−z⃗方向观察。
三、透视变换gluPerspective
1.gluLookAt函数详解:
在openGL中,视图变换是指保持模型坐标不变的情况下,从不同的方位观察模型,常用的设置观察者属性的函数为glLookAt 。
函数原型
void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
你把相机想象成为你自己的脑袋:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。
后面的三个参数(0.0,1.0,0.0),y轴为1,其余为0,表示脑袋朝上
如果没有调用glLookAt设置视图矩阵,默认情况下,相机会被设置为位置在世界坐标系原点,指向z轴负方向,朝上向量为(0,1,0)。
2.gluPersective函数详解:
如果说gluLookAt定义的是相机外在参数如相机所处位置、旋转角度等,那么gluPerspective定义的就是相机的内在镜头参数了。
四个参数:
gluPerspective ( fovy,aspect,zNear,zFar)
1>第一个参数flvy,定义可视角的大小,flvy值小,表示从相机(人眼)出发的光线的角度小,此时同等距离下,可观察到的视野范围较小,反之则大。
2>第二个参数aspect,定义物体显示在画板上的x和y方向上的比例。aspect小于1,则物体显示出来比实际更高,大于1,显示出来比实际看起来更宽,设为1,会按实际反应长宽比。
3>第三个参数zNear,定义距离相机(人眼)最近处物体截面相距的距离。这个值越大,表示观测点距离物体距离越远,看起来物体就比较小,反之则比较大。如果物体运动到距离观测点的距离小于了设定的zNear,则物体不会被绘制在画板上。
4>第四个参数zFar,定义可观测到的物体的最远处截面相距相机的距离。如果物体运动到距离观测点的距离大于了设定的zFar,则物体不会被绘制的画板上。
(在near和far中间的才会被观察到)
上图为屏幕的俯视图,可以得出两个值
3.近平面不可设置为0,远平面影响不大。
4.Z坐标靠近近裁剪面的位置拥有最高的深度分辨率(能够分辨的深度差最小),由于透视矩阵并需把 n 和 f 映射成 −1 和 1,于是应用了透视矩阵后,靠近 n 的物体比靠近 f 的物体分布在更宽广的空间里。