现实世界中可以通过以下方式观察感兴趣的对象:
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可以显示的屏幕区域大小,参数包括原点和高宽。
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可以显示的屏幕区域大小,参数包括原点和高宽。