前言
前面我们总结了OpenGL的基本概念,下面我们着重理解一下OpenGL中的各种坐标系
一、笛卡尔坐标系
![2D笛卡尔坐标系.png](https://img-blog.csdnimg.cn/img_convert/41afa86161f2f4282826380d2af968a2.png)
![3D笛卡尔坐标系.png](https://img-blog.csdnimg.cn/img_convert/daeb12054d77eddff30e58eb6bfef479.png)
二、视口(Viewport)
世界窗口:在世界坐标系中定义一个对齐的矩形(aligned rectangle,即矩阵的边与坐标轴平行)的窗口,这个世界窗口外的部分被裁减并不被绘制。OpenGL会自动地做剪裁。
视口:在显示器的屏幕窗口上定义一个对齐的矩形的视口,OpenGL会自动建立世界窗口和视口的变换(包括缩放和平移)。当世界窗口中所有对象都被绘制时,对象在世界窗口中的部分会被自动地映射到视口中————换句话说,被映射到屏幕坐标中,即像素在显示器上的坐标。
![视口和窗口大小相同.png](https://img-blog.csdnimg.cn/img_convert/80e833a898d9a0f1173f38ac5c07d200.png)
![视口和窗口大小不同.png](https://img-blog.csdnimg.cn/img_convert/24e03b2105e9da1066ae4a40e2de3183.png)
三、投影
在计算机三维图像中,投影可以看作是一种将三维坐标变换为二维坐标的方法,常用到的有正交投影和透视投影。正交投影
多用于三维健模,透视投影则由于和人的视觉系统相似,多用于在二维平面中对三维世界的呈现。
透视投影(Perspective Projection)
是为了获得接近真实三维物体的视觉效果而在二维的纸或者画布平面上绘图或者渲染的一种方法,也称为透视图。它具有消失感、距离感、相同大小的形体呈现出有规律的变化等一系列的透视特性,能逼真地反映形体的空间形象。透视投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面。
四、OpenGL中的6种坐标系
![左右手坐标系](https://img-blog.csdnimg.cn/img_convert/c553f093ca40fc1c27514dc399ea68bd.png)
在世界、物体、照相机空间是右手坐标系。
在规范化设备坐标系用的是左手坐标系。
1. 对象或模型坐标系(Object or model coordinates)
![模型坐标系](https://img-blog.csdnimg.cn/img_convert/eb189143abb858736a5877cd091b3ac9.png)
以物体某一点为原点而建立的“世界坐标”,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致
2. 世界坐标系(World coordinates)
世界坐标系
,是以屏幕中心为原点(0, 0, 0),且是始终不变的。
你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:
窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角坐标为(1,1)。
当前绘图坐标系
,是绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()等对当前绘图坐标系进行平移、伸缩、旋转变换之后,世界坐标系和当前绘图坐标系不再重合。注意,这里的平移旋转是将当前绘图坐标系看做一个整体在世界坐标系中进行旋转平移。然后,改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相对当前绘图坐标系来讲的。
其中相关坐标系的关系如图所示
![世界坐标系](https://img-blog.csdnimg.cn/img_convert/90d8b87a270b8206b77f5e057be84d31.png)
3. 眼(或相机)坐标系(Eye (or Camera) coordinates)
![摄像机坐标系.png](https://img-blog.csdnimg.cn/img_convert/475d3eb62a926edd50c1cf8038abfcb7.png)
![摄像机坐标系.png](https://img-blog.csdnimg.cn/img_convert/ac2ca94102f78aaa504e62ccbae6e8b4.png)
4. 裁剪坐标系(Clip coordinates)
![](https://img-blog.csdnimg.cn/img_convert/96c545b29a14c978637174da2c387d4f.png)
裁剪坐标是执行矩阵变换和透视投影之后,但在执行透视除法之前的坐标。超出裁剪空间的坐标会被丢弃。
5. 标准化的设备坐标系(Normalized device coordinates)
![设备坐标系.png](https://img-blog.csdnimg.cn/img_convert/bdde92de5e4a2805bfc7812cead1e881.png)
OpenGL 的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。
规格化设备坐标是以屏幕中心为原点,X轴朝右,Y轴朝上,所以左下角的坐标为(-1, -1),右上角的坐标为(1,1)。当然这是z轴为0时的显示,实际上我们的规格化设备坐标系统是要考虑z轴,所以由平面要转换成一个正方体,原点坐标为(0,0,0),也就是这个立方体的中心,而它左上角离我们最近的那个顶点的坐标就是(1,1,1),右下角离我们最远的那个顶点的坐标就是(-1,-1,-1)。
6. 窗口(或屏幕)坐标系(Window (or screen) coordinates)
![世界坐标系.png](https://img-blog.csdnimg.cn/img_convert/f2de6321672fb7f2ac9f47f1b854a7bb.png)
视窗坐标也就是我们手机窗口对应的坐标系统,以左上角为原点,右下角对应我们手机的最大像素值的集合,如下图是一个像素为320*480的手机,那他右下角的坐标就是(320,480)。
五、坐标变换
OpenGL最终渲染到屏幕上是2D的,所以我们需要将3D坐标进行一系列的变换为2D坐标,整个过程如下图所示。
![](https://img-blog.csdnimg.cn/img_convert/0e9d36c4138a74a1c602157324ea25b1.png)
OpenGL中只定义了裁剪坐标系、规范化设备坐标系和屏幕坐标系。而局部坐标系(模型坐标系)、世界坐标系和相机坐标系都是为了方便用户设计而自定义的坐标系,他们的关系如下图所示。
![自定义转换.png](https://img-blog.csdnimg.cn/img_convert/8782e0e9bccc0ccc377e7c7d3561794c.png)
模型变换的目的是通过变换,使得用顶点定义或3D模型软件构造的模型,能够按照需要,通过缩小、平移、旋转等操作放置到场景中合适的位置。
通过模型变换后,物体的位置在全局的世界坐标系下,世界坐标系是所有物体交互的一个公共坐标系。
视变换是为了方便观察场景中的物体、方便计算而设立的坐标系。相机坐标系中的坐标,是从相机的角度来解释世界坐标系中的位置。
![](https://img-blog.csdnimg.cn/img_convert/5c3c314ae2e3655cdafeb04dd5c7fb8e.png)
参考:
https://www.yuque.com/u1377509/iypri2/eropengl-zuo-biao-xi
https://www.jianshu.com/p/0cdb583c92b4