openGL中的全局固定坐标系统和局部移动坐标系统

最近在看《openGL编程指南》(红宝石书),里面有一个全局固定坐标系统和局部移动坐标系统的概念,下面是对这两个概念的理解。以书中3.2.1节中的例子来说明,先上代码。

//code_1
glTranslatef(3, 0, 0);
glRotatef(45, 0, 0, 1);
glutWireCube(2);

这段代码将一个方块先绕z轴旋转45度,然后移到(3, 0, 0)的位置。首先,openGL中矩阵乘法的运算是以与变换函数的顺序相反的顺序进行的,也就是说当N,M,L三个变化矩阵以下面code_2的顺序出现时,其变换是这样的(N(M(Lv))),v是某个要绘制的顶点。

//code_2
glMultMatrixf(N);
glMultMatrixf(M);
glMultMatrixf(L);
glBegin(GL_POINTS);
glVertex3f(V);
glEnd();

那么,对于code_1,很显然,方块先进行Rotate变换,再进行translate变换。这时候,引入全局固定坐标系统和局部移动坐标系统的概念只是对这一过程的两种不同的理解方式。

对于全局固定坐标系统,由于方块与所有其他对象使用同一的坐标系统,那么此时为了使得旋转后的方块位于x轴上3个单位的位置上,就必须先将其绕其坐标系的z轴旋转,然后再进行平移,否则如果平移后再绕z轴旋转,方块就不会在x轴上了。

而对于局部移动坐标系统,假设方块自己有一个虚拟的坐标系,开始的时候这个坐标系与世界坐标一致,那么当进行translate变换时,这个虚拟坐标系平移了,方块保持在该坐标系的位置不变,所以也平移了,之后进行rotate变换也是相对于这个虚拟坐标系的,所以方块还是在x轴上。

所以说,这两个概念只是为了方便我们理解而提出的。

作为例子,考虑下面代码code_3

//code_3
glRotatef(45, 0, 0, 1);
glTranslatef(3, 0, 0);
glutWireCube(2);

这段代码,从全局固定坐标系统来看,它是先将方块平移到了(3, 0, 0)的位置,然后将其绕z轴旋转45度,显然这时方块应该位于(3/sqrt(2),  3/sqrt(2), 0)处,而从局部移动坐标系来看,它先将方块绕虚拟坐标系的z轴旋转了45度,然后在沿该虚拟坐标系的x轴平移了3个单位,位置还是在(3/sqrt(2),  3/sqrt(2), 0)处。

现在明白了,所谓的全局固定坐标系统和局部移动坐标系统,其实只是我们理解同一个问题的两个不同的方式而已。

你可能感兴趣的:(计算机图形学)