关于OPENGL的各个变换的顺序

OPENGL中的各种坐标变换是很让人头疼的,而且坐标变换实质是矩阵相乘,所以不搞清楚其顺序就如同瞎子摸黑一般。一样要讲一下网络上的各个“高人”文章的高深,拷贝粘帖的就不说了,不少文章其实都没细到讲述整个这几个变换的实际顺序,比方说哪个函数先哪个函数后。

1,在OPENGL的红宝书里面,首先提出了全局固定坐标系统和局部移动坐标系统,这里这两个坐标系的代码实际上是差不多的。区别在于,全局用的是多个矩阵相乘即glMultMatrixf函数,而局部用的是模型变换函数,包括glTranslate,glRotate,glScale等。因此全局中的多个矩阵相乘,是让矩阵和顶点坐标做左乘操作,其矩阵相乘的前后顺序和代码的顺序相反;局部中的模型变换函数,是对模型坐标系的操作,例如glRotate旋转的不是模型上某个顶点的坐标,而是模型局部坐标系,这点是必须要搞清楚的。但是你去找高手的文章,这种低级入门概念是找不到的

2,另外一个低级入门概念,就是glMatrixMode函数所承载的参数GL_MODELVIEW和GL_PROJECTION。红宝书中明确指出,GL_PROJECTION对应的是投影变换,实际是裁剪空间区域,将指定区域外的物体去除,所以一般后面跟glPerspective或者glFrustum函数
(frustum n. (平) 截头体;截(头)锥体;);
相对的GL_MODELVIEW参数对应的是视图模型变换,注意是“视图变换”+“模型变换”,也就是说在指定了这个参数之后,才能执行1中说的全局矩阵相乘和局部模型变换函数,另外gluLookAt函数,也必须在这个参数之后

3,“在进行任何模型变换之前调用视图变换”-- 这是红宝书上的原话,就是说在执行glRotate函数前,必须先调用gluLookAt函数。这就让人非常费解了,因为红宝书的例子代码上,gluLookAt函数都是放在reshape函数中,而glRotate函数一般都放在display中,并且在主函数中,reshape函数调用是写在display函数之前的呀。这就要涉及到另外一个概念,就是无论是reshape函数还是display函数,都是用回调函数的方式。相当与WIN编程中的消息响应函数。reshape函数是响应窗口的变化,display函数是响应画图,而一个opengl函数的生命是从创建窗口-》窗口中绘图。因此实际上,reshape函数的调用是在display之前!这样子,glMatrixMode–>gluLookAt–>glRotate的顺序就和红宝书所述的一致了!
(注:gluLookAt用来定义观察者(相机)的状态,包括观察者在世界坐标系中所处的位置、看向世界坐标系中的方向(可以理解为眼睛所看向的方向)、观察者头部的朝向(可以在一个平面上360°旋转)。)
另外当理解了整个函数的前后顺序后,就可以灵活的放置相关函数,比方说gluLookAt函数完全也可以放在display函数中,但是关键你要知道这么做所带来的变化,而不是局限与红宝书或者网络上的所谓“自然而然”或者“应该”。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值