汇总页
上一篇: OpenGL/C++_学习笔记(三) 绘制第一个图形
OpenGL/C++_学习笔记(四)空间概念与摄像头
- 空间概念与摄像头
- 前置科技树: 线性代数
- 空间概念
- 流程简述
- 各空间相关概念详述
空间概念与摄像头
前置科技树: 线性代数
矩阵/向量定义和运算: learnglCN-变换
空间概念
流程简述
想要通过OpenGL实现无限空间的场景的展现, 需要将需要显示的顶点的坐标从三维空间经过多个坐标系统(Coordinate System)的转换或映射最后得到标准化设备坐标(Normalized Device Coordinate, NDC) – 每个顶点的x,y,z坐标都应该在区间[-1.0, 1.0]上,超出这个坐标范围的顶点都将不可见,接着再转化为屏幕上像素的坐标. 这个过程通常是分步进行的,也就是类似于流水线/管线那样子.
将物体的坐标变换到几个过渡坐标系(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 Coordinate)的形式结束. 上述图例展示了整个流程以及各个变换过程做了什么:
- 局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标.
- 下一步是将局部坐标变换为世界空间坐标,世界空间坐标是处于一个更大的空间范围的. 这些坐标相对于世界的全局原点,它们会和其它物体一起相对于世界的原点进行摆放.
- 接下来我们将世界坐标变换为观察空间坐标,使得每个坐标都是从摄像机或者说观察者的角度进行观察的.
- 坐标到达观察空间之后,我们需要将其投影到裁剪坐标. 裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上(深度检测等).
- 最后,我们将裁剪坐标变换为屏幕坐标,我们将使用一个叫做视口变换(Viewport Transform)的过程. 视口变换将位于-1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内(绘制窗口宽和高). 最后变换出来的坐标将会送到光栅器,将其转化为片段.
各空间相关概念详述
下一篇: OpenGL/C++_学习笔记(五)纹理与材质