zoukankan      html  css  js  c++  java
  • OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换等概念

    如果你想把图形渲染在正确的位置上,那么坐标的设置就很重要了。在OpenGL中,与坐标相关的主要有笛卡尔坐标、坐标裁剪、纹理坐标、MVP(Model View Projection)转换。

    1.笛卡尔坐标

         在二维绘图中,笛卡尔坐标有一个X轴和一个Y轴组成,X轴为水平方向,Y轴为垂直方向,X和Y相互垂直。如图1。关于正负方向问题,默认如图1上标示,但是我们可以根据实际需求自己定义。(左下角为(0, 0)原点

         图1:

         

      在三维绘图中,笛卡尔坐标多了一个Z轴,Z轴同时垂直于X和Y轴。Z轴的实际意义代表着三维物体的深度。如图2。关于正负方向问题,默认如图2上标示,但是我们可以根据实际需求自己定义。

         图2:

         

    2.坐标裁剪

      窗口是以像素为单位进行度量的。开始在窗口中绘制点、线和形状之前,要把指定的笛卡尔坐标对翻译成屏幕坐标,我们可以通过指定占据窗口的笛卡尔区域来转换,这个区域叫做裁剪区域。在二维空间中,有两种常见的裁剪区域。第一种,裁剪区域就是窗口内部最小和最大的x、y值,如图3。第二种就是根据窗口指定原点位置,如图4。

      图3:

                

      图4:

           

      在OpengL绘图中采用的裁剪坐标是第二种,并且x、y的取值为-1~+1,这称为单位坐标。当然我们平常直接使用setPosition(x=500,y=600),x和y值到最后还是会通过矩阵相乘转换成单位坐标,这是涉及到模型视图、投影的变换,即MVP变换(Model  View Projection)。

    3.纹理坐标左上角为(0, 0)原点

      在指定了图形的笛卡尔坐标后,如果想要在图形上进行贴图,则要设置好纹理坐标。纹理坐标要么是指定为着色器的一个属性,要么通过算法计算出来。典型情况下,纹理坐标是作为0.0到1.0范围内的浮点值指定,当然你也可以设置自己预定的范围,然后再着色器中进行单位化计算。纹理坐标的命名为s、t和q(与顶点坐标x、y、z、w相似),支持从一维到三维的纹理坐标,并且可以选择一种对坐标进行缩放的方法。如图5。

      图5:

                

      注意:如果纹理经过DXT压缩(通常为jpg格式),纹理的坐标的t坐标会反转。即原点变成左上角了,y轴向下为正,x依旧向右为正。因为DXT压缩源自DirectX,纹理坐标和OpenGL相比,所以使用压缩纹理时,得用“t变=1.0-t前”来获取正确的纹素。即在OpenGL中(0,0)变为(0,1),(0,1)变为(0,0),(1,1)变为(1,0),(1,0)变为(1,1)。

    4.模型视图、投影

      首先,我们来看看OpengGL变换的术语。

      视图(View)--指定观察者或照相机的位置。

      模型(Model)--在场景中移动物体。

      模型视图--描述视图和模型变换的二元性。

      投影(Projection)--改变视景体的大小或重新设置它的形状。

      视口--这是伪改变,只是对窗口上的最终输出进行缩放。

      视图坐标与视图变换

        视觉坐标是相对观察者的视角而言的,它是一个虚拟的固定坐标系,通常用作参考坐标系。 视图变换允许我们把观察点放在任何位置,并允许在任何方向上观察场景。确定视图变换就像在场景中放置照相机并让它指向某个方向。

      模型变换

        模型变换用于操纵模型和其中的特定对象,这里的模型指的是点的笛卡尔坐标,这些变换将对象移动到需要的位置,然后再对它们进行旋转和缩放。通常代码如,Sprite::moveTo(x,y),Sprite::scale(x)。这里需要注意的是模型变换的顺序,因为矩阵的相乘不遵守结合律,因此变换顺序不同,通常得到的结果会不同。

      模型视图变换

        模型视图变换是模型变换和视图变换在变换管线中的组合。因为有时两种变换的效果一样的,如将对象向后移动和将参考坐标系向前移动在视觉上的效果一样,但是后者的变换对所有的元素都有效,前者只作用于自己。所以,要看自己需要那种效果来进行那种变换。

      需要注意的是,在OpengL中的矩阵是以列优先排序的

      投影变换

        投影变换将在模型视图变换之后应用到顶点上,这种投影定义了视景体并创建了裁剪平面。投影变换有两种:正投影和透视投影

        正投影,所有多边形都是按同样相对大小来在屏幕上绘制的。线和多边形使用平行线来直接映射到2D屏幕上。适合蓝图、文本等二维图形。如图6。

        图6:

                      

        透视投影,通过非平行线来把图形映射到2D屏幕上,有透视缩短的特点,更加贴近现实。如图7。

        图7:

                

    5.总结

      最后,我们梳理一下渲染过程中坐标变换的流程,如图8。

      图8:

            

    如需转载,请标明出处,http://blog.csdn.net/cbbbc/article/details/39738641

  • 相关阅读:
    jquery插件开发
    五种常见的 PHP 设计模式
    linux常用命令
    解决MySQL不允许从远程访问的方法
    模块化的JavaScript开发的优势在哪里
    巧用C#做中间语言 实现Java调用.net DLL
    PHP Predefined Interfaces 预定义接口
    想追赶.Net的脚步?Java面前障碍重重
    修改一行SQL代码 性能提升了N倍
    如何使用LoadRunner监控Windows
  • 原文地址:https://www.cnblogs.com/yyxt/p/4497234.html
Copyright © 2011-2022 走看看