局部坐标系和全局坐标系
概述
全局坐标系是三维空间物体所在的坐标系,模型的顶点坐标就是基于这个坐标系来表达的。而局部坐标系是一个假想的坐标系,该坐标系与物体的相对位置至始至终是不变的,假想出这个坐标系的目的主要是为了正向理解对三维场景中物体执行的“平移和旋转”操作。使用局部坐标系理解模型变换时,所有的变换操作直接作用与局部坐标系,由于局部坐标系与物体的相对位置不对,因此,当对局部坐标系进行“平移”、“旋转”和“缩放”时,物体在场景中位置和形状也会发生相应的变化。
几点注意
(1)“全局坐标系”和“局部坐标系”是两种理解模型变换的手段。
(2)当存在“缩放”变换时,应采用“全局坐标系”“反向”阅读代码来理解。如果存在缩放变换,尤其当缩放不均匀时,采用“局部坐标系”来理解可能产生问题。经过不均匀的缩放后,坐标系被拉伸,因此平移顶点时,沿各个轴移动的距离将增大(缩小)相应的缩放倍数。如果进行不均匀缩放的同时进行了旋转变换,局部坐标系各个轴可能将不再相互垂直。
(3)对于多次交换使用“平移”和“缩放”操作的情况,宜用“局部坐标系”“正向”阅读代码来理解。
(4)对于像树形结构的物体,如机械人,太阳系,红宝书的建议是从“局部坐标系”来看。
使用全局坐标系为什么要用“反向”阅读代码的方式来理解?
先看看下面这段代码:
2 {
3 glMatrixMode(GL_MODELVIEW);
4 glLoadIdentity(); // 当前矩阵设置为单位矩阵
5 glRotatef(45.0f,0.0,0.0,1.0); // 绕z轴旋转45度
6 glTranslatef(2.0,2.0,2.0); // 平移至 [2.0,2.0,2.0]
7 glBegin(...); // 开始绘制三维物体
8 ...
9 ...
10 ...
11 glEnd();
12 }
R为 glRotatef(45.0f,0.0,0.0,1.0) 产生的矩阵。
T为 glTranslatef(2.0,2.0,2.0) 产生的矩阵。
E为单位阵, M为经过旋转平移之后的视点模型变换矩阵。
M=E*R*T 【这是一个矩阵右乘操作】
理论上来讲 这就是一个坐标系的变换过程,R*T 这个矩阵其实就是将原先的坐标系变换到现在的坐标系,这个时候原先坐标系的点p将变换成q。
q=(R*T)*p 【T和p先进行乘法得到一个中间向量,R再和这个向量做乘法,最后算的q向量】
而按照全局坐标系的理解,它的变换过程则是相反的,这也是相当的好理解的.在当前世界坐标系中画好该物体之后,要想将它移动到正确的位置,必须得先平移物体到[2.0,2.0,2.0],然后将物体绕z轴旋转45度。这是一个相反的变换过程。