入门(入坑)第三次学习笔记,上一篇文章《OpenGL入门(二)-- 快速了解OpenGL下的专业名词》,本篇文章主要对OpenGL的坐标系统有一个大概的了解认知,还有想要对图形进行相应的变换效果,就需要对OpenGL的坐标变换要深刻的理解与使用变换。
坐标系统概述
2D笛卡尔坐标系
定义
- 每一个2D笛卡尔坐标系都有一个特殊的点。称作原点(Origin(0,0)),它是坐标系的中心。
每一个2D笛卡尔坐标系都有两条过原点的直线向两边无限延伸,称做轴(axis),两个轴相互垂直。如下图:
特点
- 2D坐标空间是无限伸展的。
- 坐标系中的直线没有宽度,坐标系中每一个点都是坐标系的一部分。
3D笛卡尔坐标系
我们须要用3个轴来表示三维坐标系,前两个轴称作X轴和Y轴,这类似于2D平面,但并不等同于2D的轴,第3个轴称作Z轴。(3各轴互相垂直)。如下图:
实际上,存在两种全然不同的3D坐标系:左手坐标系和右手坐标系。假设同属于左手坐标系或右手坐标系。则能够通过旋转来重合,否则不能够。
视口
就是窗口中用来显示图形的一块矩形区域,它可以和窗口等大,也可以比窗口大或者小。只有绘制在视口区域中的图形才能被显示,如果图形有一部分超出了视口区域,那么那一部分是看不到的。通过glViewport()函数设置。如下图所示:
OpenGL的投影方式
正投影
正投影(Orthographic Projection),又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体,如图所示。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。
透视投影
透视投影(Perspective Projection),透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部都被切除掉的棱椎,也就是棱台。这个投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面。
几种坐标系统
这部分内容来自这里LearnOpenGL CN,感谢原作者。
我们的可见顶点都为标准化设备坐标(Normalized Device Coordinate,NDC)。也就是说每个顶点的z,y,z都应该在−1到1之间,超出这个范围的顶点将是不可见的。通常情况下我们会自己设定一个坐标范围,之后再在顶点着色器中将这些坐标变换为表转化设备坐标。然后这些标化设备坐标传入光栅器(Rasterizer),将它们变换为屏幕上的二维坐标和像素。
将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Intermediate Coordinate System)的优点在于,在这些特定的坐标系统中,一些操作或运算更加方便和容易,这一点很快就会变得很明显。对我们来说比较重要的总共有5个不同的坐标系统:
- 局部空间(Local Space,或者称为物体空间(Object Space))
- 世界空间(World Space)
- 观察空间(View Space,或者称为视觉空间(Eye Space))
- 裁剪空间(Clip Space)
- 屏幕空间(Screen Space)
这就是一个顶点在最终被转化为片段之前需要经历的所有不同状态。为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。物体顶点的起始坐标再局部空间(Local Space),这里称它为局部坐标(Local Coordinate),它在之后会变成世界坐标(world Coordinate),观测坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Corrdinate)的形式结束。下面这张图阐释了流程以及各个变换在做什么:
有以下几点需要注意:
- 局部坐标是对象相对于原点的坐标,也是物体的起始坐标。
- 下一步将局部坐标转化为世界空间坐标,世界空间坐标是一个处于更大空间范围内的。这些坐标相对于世界的全局原点,它们会和其他物体一起相对于世界原点进行摆放。
- 接下来将世界坐标转化为观测坐标,使得每个坐标都是从摄像机或者说观察者角度进行观察的。
- 坐标到达观测空间后,我们需要将其投影到裁剪坐标。裁剪坐标会被处理到−1.0到1.0范围内,并判断哪些点将会出现在屏幕上。
- 最后,我们将裁剪坐标变换为屏幕坐标,我们将使用一个叫做视口变换(Viewport Transform)的过程。视口变换将位于−1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内。最后变换出来的坐标将会送到光栅器,将其转化为片段。
OpenGL坐标变换
篇幅有点多了,看来这篇文章写不完了,多了就看不下去了,下一篇文章专门介绍一下坐标转换的计算和原理吧,先附上OpenGL坐标转换全局图,大概了解一下转换管线流程:
--
总结:还是来总结一下,主要是了解一些坐标系系统的一些专业名词,然后理解各个系统坐标,对于后面的学习内容有很大的助力作用。
--
系列连载
OpenGL入门(一)-- 图形API简介与作用
OpenGL入门(二)-- 快速了解OpenGL下的专业名词
OpenGL入门(三)-- OpenGL坐标系解析与坐标变换
OpenGL入门(四)-- OpenGL坐标系与坐标变换
OpenGL入门(五)-- OpenGL渲染流程图解析
OpenGL入门(六)-- OpenGL 固定存储着色器的理解使用
OpenGL入门(七)-- 图形图像渲染中的深度缓冲区
OpenGL入门(八)-- OpenGL向量和矩阵简介
OpenGL入门(九)-- OpenGL 纹理简单介绍