OpenGL学习二——四种变换

   现实世界中可以通过以下方式观察感兴趣的对象:
   1、变化观察者的位置(观察点),从不同的角度去审视(视图变换)
   2、移动或者旋转被观察对象,全方位观察(模型变换)
   3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)(投影变换)
   4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部(视口变换)
   这些方式也是OpenGL显示三维场景和物体的主要过程。在OpenGL中三维场景和物体以特定的方式显示在屏幕上,需要经过视图变换、模型变换、投影变换和视口变换等过程,这个过程对应于数学上的概念即为矩阵乘法运算。这四种变换对于OpenGL来说十分重要,下面详细讲解。

一、概念
   视图变换用于确定场景的合适位置,即确定观察点的位置。它可以使观察者在任何位置从任何方向观察物体。模型变换用于旋转、移动、放缩以及反射观察对象,使得观察者在净止的情况下看到物体的全部。这两个变换具有相对关系,它们用到的函数也基本相同,所以在实际编程中往往以模型视图变换统称。
   投影变换描述了一个可视见空间,确定了被观察对象投影到屏幕上的方式(透视投影、正交投影)和范围(超出范围的对象或者对象的某一部分将被裁剪掉,无法显示在屏上)。
   视口变换定义了三维观察对象映射到屏幕上的变换,最终实现三维空间到二维空间的转换。

二、坐标
   在先后进行的四种变换中,涉及到以下几种坐标:
   原始顶点坐标:程序中定义的定点数据,未加任何处理
   规范化齐次坐标:由OpenGL处理得到
   裁剪坐标:规范化齐次坐标经过模型视图变换和投影变换得到裁剪坐标,可视见空间以为的坐标去除掉
   规格化设备坐标:OpenGL中坐标向量为四维,同时除以第四个分量w即可得到
   屏幕坐标:真实的物理坐标,观察对象的规格化坐标经过视口变换换成真实的屏幕坐标
   需要特别注意的是:屏幕坐标具有单位,代表了实际的长度度量,而其它几种坐标是一种逻辑坐标,无单位

三、变换过程分析
   1、视图变换和模型变换
      OpenGL中绘制三维场景和对象之前,应该首先确定观察点位置和方向,并把观察对象放到合适的位置,以便观察。涉及到的函数:
         gluLookAt:设置观察点的位置、方向和向上的量,视图变换专用
         glTranslate*:移动观察对象或者观察点,共用
         glScale*:放缩观察对象或者坐标系,共用
         glRotate*:旋转观察对象或者坐标系,共用
      默认情况下,观察点位于坐标系远点,朝向Z轴负方向,向上量为Y轴正方向。
   2、投影变换
      确定以何种方式投影到屏幕上,并设置投影的方式,即可视见空间。用到的函数:
         glFrustum:定义透视投影方式——越远的物体显得越小,参数含义如下图,定义了可视空间的大小和两个可视截面:
                    
         gluPerspective:以另外一种方式定义透视投影,如下图:
                   
         glOrtho:正交投影,更加精确的反映物体的形状,参数如下图:
                  
      一旦在X-Y平面内充满整个可视见空间,投影到屏幕上的对象会占满真个视口屏幕。
   3、视口变换
      视口变换确定了三维空间如何映射到屏幕的那个空间位置,它指定了图像所占屏幕的区域。主要涉及的函数:
         glViewport:指出OpenGL可以显示的屏幕区域大小,参数包括原点和高宽。
阅读更多
文章标签: 图形 编程
个人分类: Android OpenGL
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭