OpenGL中的坐标系和变换
坐标系
模型坐标
模型坐标是以物体某一点为原点而建立的坐标系,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。
世界坐标
世界坐标系以屏幕中心为原点(0,0,0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1)。
相机坐标
相机坐标以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。
投影坐标
OpenGL的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区或视口(viewport)。投影得到的是视区内的坐标就是投影坐标,从投影坐标到设备坐标的计算过程就是设备变换了。
屏幕坐标
显示设备屏幕的坐标,坐标角为远点。
变换
从模型坐标到屏幕大致要经过如下流程:
world=>operation: 世界坐标
visual=>condition: 观察变换
model=>condition: [模型变换]
camera=>operation: 相机坐标
ray=>condition: 投影变换
shadow=>operation: 投影坐标
view=>condition: 视口变换
screen=>operation: 屏幕坐标
world->visual(yes)->model(yes)->camera->ray(yes)->shadow->view(yes)->screen
观察变换
用来定位和瞄准相机的位置和方向。默认情况下相机的位置为(0, 0, 0),指向z-。
可以平移和旋转,必须在模型变换之前。
模型变换
模型自身的变换,支持如下三种:
移动: 使模型沿一个指定的向量进行移动;
旋转: 使模型沿一个指定的向量进行旋转;
缩放: 通过指定的向量来放大或者缩小模型尺寸。
模型变换的顺序会影响变换的结果。
投影变换
确定需要显示的区域,在观察变换和模型变换之后执行,有两类:
透视投影:近大远小,于真实世界中看到的一样;
正交投影:显示物体的真实尺寸。
视口变换
根据视口和屏幕大小来确定最终图像的缩放。
相关函数:
平移:glTranslate
旋转:glRotate
缩放:glScale