【学习OpenGL】(六)——图形变换

1.理解变换

1.1 视觉坐标

视觉坐标是根据观察者的角度而言的,与可能发生的变换无关。我们可以把它看做是“绝对的”屏幕坐标。因此,视觉坐标表示一种虚拟的固定坐标系统,常常作为一种参考系使用,x和y的正方向分别是向右和向上,z的正方向从原点朝向用户。

1.2 视图变换

在默认情况下,在透视投影中,观察者是从原点向z轴的负方向看过去(垂直“穿入屏幕”)。这个观察点相对于视觉坐标系统进行移动。以提供一个特定的拍摄点。当观察点位于原点时,场景中所绘制的z值为正的物体就位于观察者的后面。
视图变换允许把观察点放在自己所希望的任何位置。试图变换相当于根据视觉坐标系统移动当前所使用的坐标系统。改变观察点的位置。

1.3 模型变换

模型变换用于对模型以及模型内部的特定物体进行操纵。可以移动物体,进行缩放或旋转。相当于改变物体的位置
注意:每次变换都是在上次变换执行的基础上进行的。

1.4 模型视图变换

移动对象和移动坐标系统之间没有本质区别。模型视图表示你可以把这类变换视为模型变换或视图变换,但实际上并无区别。

1.5 投影变换

OpenGL提供了两种投影方式,一种是正投影(平行投影),屏幕上所绘制的图形都按照指定的大小出现。常用于2D平面

另一种是透视投影,它的标志性特点是:透视缩短,它会使远处的物体看上去比相同大小的近处物体小一些,更贴近于真实生活中的场景(看近处物体大,看远处物体小)。因此,常用于3D空间。在绝大多数情况下,画3D图形都要使用透视投影。

2. OpenGL中的矩阵

在OpenGL中,从未加工的顶点数据到屏幕坐标的过程如下

2.1 变换过程

这里写图片描述

1.将顶点坐标转变为一个1 × 4的矩阵,前三个值分别是X,Y,Z坐标,第四个为缩放因子W(默认1.0)。

2.顶点与模型视图矩阵相乘,产生经过变换的视觉坐标。

3.视觉坐标与投影矩阵相乘,产生裁剪坐标。

4.裁剪坐标除以W坐标,产生规范化的设备坐标。(W值在之前变换中可能已经改变,可能不为1.0)

5.最后,这个坐标通过视口变换映射到2D平面。

2.2 模型视图矩阵

模型视图矩阵是一个4 × 4 的矩阵,代表经过变换的坐标系统,用于指定场景的视图变换和几何变换,将其与顶点坐标相乘,将产生经过变换的新坐标。

OpenGL提供了一些高层函数,帮助我们完成图形的变换。

// 函数的参数分别表示沿X,Y,Z方向移动的数量
void glTranslatef( GLfloat x, GLfloat y, GLfloat z);
// 函数表示绕着(x,y,z)这个向量逆时针旋转angle度
void glRotatef(angle, GLfloat x, GLfloat y, GLfloat z);
// 函数表示对物体进行扩张或收缩,x,y,z表示各个轴的缩放因子
glScalef(GLfloat x, GLfloat y, GLfloat z);

有了这些变换之后,还要注意一个问题,这些变换都具有累加效果

如先向x轴正方向平移10个单位,再向y轴正方向平移10个单位,这时物体在(10,10)这个位置,即第二次平移是在第一次平移的基础上完成的。(同样适用于旋转与缩放)

如果想避免这种累加效果。可以在每一次变换之后将图形复位,即模型矩阵复位

通过给模型视图矩阵加载单位矩阵来进行复位。具体函数如下:

// 参数mode用于确定对哪个矩阵进行操作,取值为:GL_MODELVIEW(模型视图矩阵),GL_PROJECTION(投影矩阵)和GL_TEXTURE(纹理矩阵) 
glMatrixMode(mode);

// 复位,加载单位矩阵,以抵消积累效果
glLodeIdentit();

猜你喜欢

转载自blog.csdn.net/qq_37308779/article/details/79366042