OpenGL 二. 坐标系
2020-12-11 本文已影响0人
傅里叶的叶
OpenGL 二. 坐标系基础概念
2D笛卡尔坐标
平面坐标系
3D笛卡尔坐标
我们可以用3个坐标(X,Y,Z)来指定三维空间中的一个位置.
视口
- 窗口是以像素为单位度量. 在开始在窗口中绘制点,线,形状之前,必须告诉OpenGL 如何把指定坐标映射为屏幕坐标.
- 坐标系统必须从逻辑笛卡尔坐标映射到物理屏幕像素坐标. 这个映射是通过一种叫做视口(
viewPort
)的设置来指定.笛卡尔坐标系和屏幕设备的坐标系,并不是完全一一对应的。 - 在我们代码中,我们会通过
glViewPort
函数来实现视口的设计. 视口就是窗口内部用于绘制裁剪区域的客户区域. - 一个屏幕区域可以用来,展示不同的信息。
投影:从3D到2D
- 不管我们觉得自己的眼睛看到的三维立体图像多么真实.屏幕上像素实际上只有二维的. 我们的手机屏幕本身就是二维的,我们是无法真实去呈现立体图形.
- 那么OpenGL 是如何将笛卡尔坐标系映射成可以在屏幕上显示的二维坐标的?
在这里需要用到投影.我们需要指定投影空间,指定在窗口显示的视景体(Viewing Volume).并指定如何对它进行变换. - 类比于照镜子和照相机照的照片。3D映射为2D。
投影方式
-
第一种正投影(Orthographics Projection)或平行投影
平行光投射。
需要指定一个正方形/长方形的视景体.因为距离远近投影大小一样.所以常用于,工程作业。 -
投影方式第二种透视投影(Perspective Projection)
点光源投射。
需要指定视景体的.而这个视景体看起来像平截体. 透视投影一般会使用于3D图像渲染
左手系,右手系
-
OpenGL
中坐标系中的物体、世界、照相机坐标系都属于右手坐标系,而规范化设备坐标系使用左手坐标系。便于在坐标系世界中确定正方向。笼统地说OpenGL使用右手坐标系是不合适的。
左手系,右手系
坐标系
将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的。物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。比较重要的有:
-
局部空间(Local Space,或者称为物体空间(Object Space))
-
世界空间(World Space)
-
观察空间(View Space,或者称为视觉空间(Eye Space))
-
裁剪空间(Clip Space)
-
屏幕空间(Screen Space)
从顶点转化为片段之前需要经历不同状态,为了将坐标系转到另一个坐标系。我们需要几个变换矩阵.
模型(Model)、观察(View)、投影(Projection) 三个矩阵
3D图形学中常用坐标系:
-
世界坐标系
- 世界坐标系是系统的绝对坐标系,在没有建立用户坐标系之前画面上所有的点的坐标都可以在该坐标系的原点来确定各自的位置.世界坐标系始终是固定不变的
-
物体坐标系
- 每个物体都有他们独立的坐标系.当物理移动或者改变方向时.该物体相关联的坐标系将随之移动或改变方向。
- 比如说,当你开车时,有人会说向左转,有人说向东。但是,向左转是物体坐标系的概念,而向东则是世界坐标系中的
- 我们可以理解物体坐标系为模型坐标系。因为模型顶点的坐标都是在模型坐标系中描述的
-
摄像机坐标系
- 在坐标系的范畴里,摄像机坐标系和照相机坐标系都是一样的意义。照相机坐标系是和观察者密切相关的坐标系。照相机坐标系和屏幕坐标系相似,差别在于照相机坐标系处于3D空间中,而屏幕坐标系在2D平面里。
-
照相机可以站在三维空间,观察物体.
摄像机坐标系
-
惯性坐标系
-
指的是世界坐标系到物体坐标系的"半途". 惯性坐标系的原点和物体坐标原点重合,但惯性坐标系的轴平行于世界坐标系的轴.
惯性坐标系
因为物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系转换到世界坐标系只需要平移.惯性坐标系便于理解,和操作坐标系变换.
-
OpenGL 二. 坐标系转换
坐标变换的全局图
坐标变换的全局图- 注意,OpenGL只定义了裁剪坐标系、规范化设备坐标系和屏幕坐标系,而局部坐标系(模型坐标系)、世界坐标系和照相机坐标系都是为了方便用户设计而自定义的坐标系,它们的关系如下图所示
关系图-
图中左边的过程包括模型变换、视变换,投影变换,这些变换可以由用户根据需要自行指定,这些内容在顶点着色器中完成;
-
图中右边的两个步骤,包括透视除法、视口变换,这两个步骤是OpenGL自动执行的,在顶点着色器处理后的阶段完成。
-
补充一: 视变换图示
- 相对应与MVP中的V,把世界坐标,转化为观察者坐标
alt
补充二: 坐标转换计算简易图示
- 主要介绍了 顶点的MVP变换大概流程
alt
补充三: 坐标转换矩阵计算
-
OpenGL
然后对裁剪坐标执行透视除法从而将它们变换到标准化设备坐标。OpenGL
会使用glViewPort
内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标都关联了一个屏幕上的点。这个过程称为视口变换
alt
上式子表示了,坐标经过MVP矩阵变换转换为裁剪坐标,后续坐标变换都由OpenGL自动完成