OpenGL -- 三维到二维,坐标系统

现实中的三维物体要画到纸上,二维平面画图,就是点和线,三维是点线面,需要把三维的每个位置的空间坐标(x,y,z)映射到二维平面坐标(x,y),这可以通过线性代数知识解决。

openGL变换

OpenGL通过各种变换实现,都是矩阵运算实现的
几种变换简介(参见OpenGL超级宝典第5章)

变换用途
视图指定观察点的位置
模型在场景中移动,缩放,选择对象
模型视图描述视图变换和模型变换的对偶性
投影对可见空间进行剪裁和改变大小
视见区对窗口的最终输出进行缩放

矩阵 矩阵堆栈

参考
http://blog.csdn.net/woaixiangrikui/article/details/12449127

void glPushMatrix(void);

该函数表示将所有矩阵依次压入堆栈中,顶部矩阵是第二个矩阵的备份;压入的矩阵数不能太多,否则出错。

另一种理解:复制当前桟顶,并把复制内容再次放到桟顶,以保护桟上之前的内容

void glPopMatrix(void);

该函数表示弹出堆栈顶部的矩阵,令原第二个矩阵成为顶部矩阵,接受当前操作,故原顶部矩阵被破坏;当堆栈中仅存一个矩阵时,不能进行弹出操作,否则出错。

变换过程中常用的函数

void glMatrixMode(GLenum mode):

mode 告诉计算机哪一个矩阵堆栈将是下面矩阵操作的目标,即将什么矩阵设置为当前矩阵,他的可选值有: GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.

  • GL_MODELVIEW
    应用这个参数后,表示接下来的矩阵操作都是针对模型视景矩阵堆栈 ,直到下一次调用这个函数并更改参数为止。

  • GL_PROJECTION
    应用这个参数后,表示接下来的矩阵操作都是针对投影矩阵堆栈 ,直到下一次调用这个函数并更改参数为止。
    通常使用gluPerspective 函数接着操作,此函数不能作用在GL_MODELVIEW上,例如

    gluPerspective(45.0f,(GLfloat)cx/(GLfloat)cy,0.1f,100.0f);//对图像进行透视投影,以将三维物体显示在二维平面上
  • GL_TEXTURE
    应用这个参数后,表示接下来的矩阵操作都是针对纹理矩阵堆栈 , 直到下一次调用这个函数并更改参数为止。

参考
http://blog.sina.com.cn/s/blog_957b9fdb0100zez9.html

void glLoadIdentity(void)

OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()命令。该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态。

当调用glLoadIdentity()之后,实际上将当前点移到了屏幕中心:类似于一个复位操作

  1. X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。
  2. OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。
  3. 中心左面的坐标值是负值,右面是正值。
    移向屏幕顶端是正值,移向屏幕底端是负值。
    移入屏幕深处是负值,移出屏幕则是正值。

gluLookAt

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 相机向上的方向在世界坐标中的方向
你把相机想象成为你自己的脑袋:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。

参考:
http://blog.csdn.net/wangqinghao/article/details/14002077

glViewport(GLint x,GLint y,GLsizei width,GLsizei height)

把视景体截取的图像按照怎样的高和宽显示到屏幕上

参考
http://anony3721.blog.163.com/blog/static/51197420114382654698/

#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值