zoukankan      html  css  js  c++  java
  • OpenGL 之 坐标变换

    http://www.cnblogs.com/irvinow/archive/2009/11/20/1606496.html

    创建OpenGL模型过程:

    OPENGL坐标变换很有特点,为了简单描述先定义2个坐标系:
    (1)世界坐标系:
    无论如何变换,世界坐标系都不动,以屏幕中心为原点(0, 0, 0),你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。
    (2)当前绘图坐标系(即局部坐标系):
    当前绘图坐标系是绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的,当用glTranslatef()等变换函数做移动和旋转时,都是改变的当前绘图坐标系,改变的位置都是当前绘图坐标系相对自己的x,y,z轴所做的改变,改变以后,再绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相对当前绘图坐标系来讲的。

    glLoadIdentity():另当前绘图坐标系从新回到世界坐标系的位置,另他们重合。
    glTranslatef(x,y,z):使绘图坐标系相对世界坐标系沿x,y,z轴移动x,y,z个单位

    其他关键概念:

    (1)裁剪区域

    占据窗口的的笛卡尔空间区域,只有在裁剪区域内的物体才可见。
    void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)
    注:在使用glOrtho之前,要先调用一下两个函数
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();

    (2)视口
    裁剪区域的宽度和高度很少能够正好与窗口的宽度和高度(以像素为单位)相匹配,因此,坐标系必须从逻辑笛卡尔坐标映射到物理屏幕坐标,这个映射是通过视口的设置来指定的。视口就是窗口内部用于绘制裁剪区域的客户区域。

    void glViewport(GLint x,GLint y,GLsizei width,GLsizei height)
    x,y参数指定了窗口内部视口的左下角。通常,x,y都是0。视口以实际屏幕坐标定义了窗口中的区域。

     (3)屏幕坐标
    Windows屏幕坐标以左上角为原点, X轴正方向朝右, Y轴正方向朝下. 
    Windows屏幕坐标和虚拟3D世界坐标不是简单映射的, 这个过程很复杂.我们只有将鼠标的热点的坐标通过Windows坐标到3D pipeline的屏幕坐标及3D pipeline的逆转换后, 才能得到在3D世界的对应点, 最后确定这个点是否有物体, 这就是Picking.

    当窗口大小发生改变时,需要对裁剪区域进行同步的修改,一确保图像不会发生变形。
    Example:
    //建立裁剪区域(通常写在ChangeSize函数当中)
    aspectRatio=(GLfloat)w/(GLfloat)h;
    if(w<=h)
      glOrtho(-100.0,100.0,-100.0/aspectRatio,100.0/aspectRatio,1.0,-1.0);

    else
      glOrtho(-100.0*aspectRatio,100.0*aspectRatio,-100.0,100.0,1.0,-1.0);

    有的时候,我们在绘画图形是,当点坐标超过1.0时变无法出图,愿意就是没有设置好裁剪区域

  • 相关阅读:
    备考C++有感
    使用GridView来获取xml文件数据
    SQL 事务及实例演示
    MySQL数据分析-(12)表操作补充:字段属性
    以字符串为例,谈谈Python到底要学到什么程度
    MySQL数据分析-(9)库操作补充:用户管理和权限管理
    Python流程控制和缩进
    MySQL数据分析-(11)表补充:数据类型
    MySQL数据分析-(8)SQL基础操作之库操作
    外键
  • 原文地址:https://www.cnblogs.com/xuejinhui/p/4381004.html
Copyright © 2011-2022 走看看