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

posted on 2016-07-21 15:55  寒灬风  阅读(615)  评论(0编辑  收藏  举报

导航