OPENGL坐标系介绍 世界坐标系和当前绘图坐标系区别.doc

上传人:白大夫 文档编号:3269089 上传时间:2019-08-07 格式:DOC 页数:7 大小:27.50KB
返回 下载 相关 举报
OPENGL坐标系介绍 世界坐标系和当前绘图坐标系区别.doc_第1页
第1页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《OPENGL坐标系介绍 世界坐标系和当前绘图坐标系区别.doc》由会员分享,可在线阅读,更多相关《OPENGL坐标系介绍 世界坐标系和当前绘图坐标系区别.doc(7页珍藏版)》请在三一文库上搜索。

1、OPENGL坐标系介绍 世界坐标系和当前绘图坐标系区别OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角坐标为(1,1)。当前绘图坐标系:是绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()等对当前绘图坐标系进行平移、伸缩、旋

2、转变换之后,世界坐标系和当前绘图坐标系不再重合。注意,这里的平移旋转是将当前绘图坐标系看做一个整体在世界坐标系中进行旋转平移。然后,改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相对当前绘图坐标系来讲的。齐次坐标只讲三维的情况啊向量空间中,只有标量和向量向量 + 向量 = 向量标量 * 向量 = 向量三维向量空间中,可以视任意一组线性无关的向量为基基 V = v1 , v2 , v3 其他向量可以用一个三维的元组来表示向量 a = A1 , A2 , A3 于是 向量 a = A1 * v2 + A2 * v2 + A3 * v3仅有

3、向量是无法表示几何的,至少要有点吧一般认为点的表示也是一个三维的元组点 b = B1 , B2 , B3 这样就无法区分点和向量了,咋办?仿射空间仿射空间中,基称为标架,由三个向量和一个点组成标架 V = v1 , v2 , v3 , p 仿射空间的运算向量+ 向量 = 向量标量 * 向量 = 向量点 + 向量 = 点PS:可以看到,点与向量的和为另一个点,其实也可以认为向量记录的是点的运动,记录着一个点转换到另一个点的信息于是向量 a = a1 , a2 , a3 , 0 点 b = b1 , b2 , b3 , 1 即a = a1 * v1 + a2 * v2 + a3 * v3 , 确实

4、是向量b = b1 * v1 + b2 * v2 + b3 * v3 + pb = 向量 + p = 点勉强区分开了哈还有问题点p和向量v1v2v3怎么确定?它们的值又是在那种标架或基下的?所以讨论了再多,这个标架其实还是对应我们普通的三维坐标系才显得平易近人,即点p为原点v1 v2 v3 分别对应三个坐标轴 1,0,0、0,1,0、0,0,1只不过我还告诉你,对于任意一个点和任意三个线性无关的向量v1 v2 v3,其都可以当作一个标架。因为三个线性无关的向量就可以表示出任意一个向量,再有一个点为基础,就可以表示任意一个点所以想OpenGL中就默认,其世界坐标系对应的仿射空间,p为原点,v1v

5、2v3为坐标轴但是相机坐标系就不是了,因为啥?因为相机可以移动啊,可以改变朝向和正向,这些都影响着相机坐标系。单就移动来说:相机的默认位置是在世界坐标系的原点,移动了之后就不是了啊那么你在相机的位置看世界坐标系上的点,那些点的坐标表示就应该转换到相机坐标系上来,才对应着我们真正应该看到的点的位置还是写写坐标系比较实在坐标系世界坐标系世界坐标系的标架相机坐标系相机默认的位置为世界坐标系原点,朝向是Z轴的负方向,正向是Y轴的正方向考虑相机位置就是相机的位置,也就是从哪里去观察这个世界朝向就是相机对准的方向正向就是相机该放在这个位置、对准了方向后,该怎么摆。比如一般我们拍照,竖着摆拍出来的就是竖着的

6、照片,横着摆就是横着的照片。而这些参数其实也是在世界坐标系下表示的默认的相机坐标系移动相机之后,相机的位置、朝向、正向就改变了但顶点的数据还是对应着的世界坐标系,而我们要生成图片是依赖于相机的,所以我们要把顶点转换到相机坐标系下才行,这就是视图的转换。视图转换后顶点的表示就是相对于相机坐标系,但其标架在逻辑上依然是 原点+三个坐标轴裁剪坐标系这还只是相机的外部参数,我们还需要确定那一块的三维区域内的点,我才会拍下来,才会用来生成图像,即我需要规定一块视景体来确定拍照的范围是否需要透视效果等等其他还是讲坐标变换比较实在坐标变换OpenGL主要有两个矩阵,模型视图矩阵和投影矩阵模型视图矩阵对世界坐

7、标系下顶点的变化操作,如平移、旋转、缩放(模型)都是对顶点的变化,而相机的位置、朝向、正向的改变(视图)也需要顶点从相对于世界坐标系下转换到相对于相机坐标系,这两种虽然是不同的改变但都是对顶点的操作,所以可以用一个矩阵来记录就是说只要在原先点的基础上左乘平移矩阵,就可以把点的坐标进行平移变换记平移矩阵 T 为 T(dx,dy,dz),旋转先考虑绕Z轴旋转的情况,正向的旋转为右手大拇指朝向Z轴正向时,其余手指的朝向(逆时针)绕轴旋转至改变和坐标缩放,就是在原坐标的基础上乘以某个倍数缩放矩阵视图矩阵,将以世界坐标系原点为(0,0,0)点的世界坐标系下的顶点转换到以相机位置为(0,0,0)的相机坐标

8、系下。顶点和相机之间真正相对位置是不变的,只不过我们原先顶点的坐标表示是在世界坐标系下,而我们需要的是相机坐标系下的坐标表示。所以这里只是做坐标变换,即同一个顶点在不同坐标系下其坐标表示是不同的。从默认的相机位置可以看到,默认的相机坐标系和世界坐标系是重合的,即不需要转换,其实也就是相当于视图矩阵是单位矩阵而已而改变了相机的位置、朝向和正向之后,视图矩阵才会真正的发挥作用,乘上的效果就是让世界坐标系下的顶点转换到相机坐标系下OnenGL通过gluLookAt函数来改变相机的外部参数gluLookAt( Tx , Ty , Tz , Ox , Oy , Oz , Vx , Vy , Vz )Tx

9、 Ty Tz 为相机的位置Ox Oy Oz 为相机朝向的点Vx Vy Vz 为相机的正向考虑相机的三个向量n为相机朝向的方向向量v为相机的正向向量u为二者叉乘的向量要求:n和v为互相垂直,nuv三者均为单位向量(只表方向)那么可以看出这三个向量和相机坐标系的关系并且我们还知道相机的位置 Tx Ty Tz对于顶点首先我们把相机移动到世界坐标系的原点,但因为我们要对顶点的数据进行修改,所以就要对顶点乘上 T( -Tx , -Ty , -Tz )这样一个平移矩阵。这样以来顶点移动到了就是以相机位置为原点的坐标系下再求这个顶点在相机坐标系下的三个坐标的值。借助我们得出的 u,v,n三个向量,这三个向量

10、分别对应了相机坐标系的三个坐标轴,所以要求坐标的值也就是看以这个顶点为终点、相机位置为起点的向量和nuv这三个单位向量的点积,相当于乘上这样一个矩阵然后我们得到了坐标的值吗?还没有。因为 向量n和坐标轴z的正向是相反的,向量u和坐标轴x的正向是相反的,所以我们还需要再乘上一个矩阵来调整于是我们最终用来把世界坐标系下的点转换到相机坐标系下的视图矩阵就是投影矩阵模型操作对顶点进行变换,其还是在世界坐标系下视图操作将顶点转换到相机坐标系下但这二者都是对顶点进行变换,所以只需要一个模型-视图矩阵来维护就可以了那么投影矩阵就需要另外一个内存空间来维护因为我们已经把顶点转换到了相机坐标系下,所以我们设置视

11、景体就以相机坐标系来设置只会glOrtho的矩阵,即正交投影。其视景体是一个方形的区域。glOrtho( left , right , bottom , top , near , far )left,right分别对应了x=left和x=right这两个平面bottom和top分别对应了y=bottom和y=top这两个平面near和far分别对应了z=-near和z=-far两个平面这里取负,主要是因为相机的朝向是z的负方向,这样才会使视景体落在相机的前面投影矩阵要做的事情,就是一个规范化即根据视景体的范围,对顶点进行平移、放缩,使原先在视景体内的点都落在以原点为中心、边长为2的规范化正方体内这样做的好处就是规范,之后的裁剪、光照等等操作都在一个统一的规范下进行注意到我们放缩的时候,对于Z坐标的放缩多了一个负号,这也就意味着所有的点在规范化正方体内是Z坐标的负号是相反的这也就意味着,我们要去看规范化正方体内的物体的时候,应该从Z轴的负无穷远看向原点,即方向应该是Z的正向这一步得到的点的坐标,我们称其位于裁剪坐标系

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1