OpenGL之深入解析坐标系统

一、坐标系

  • 2D 笛卡尔坐标系(由 x、y 决定)
    2D笛卡尔坐标系
  • 3D 笛卡尔坐标系(由 x、y、z 决定)

3D笛卡尔坐标系

  • OpenGL 坐标系中每个顶点的 x,y,z 坐标都应该在 -1.0 到 1.0 之间,超出这个坐标范围的顶点都将不可见。
  • 将一个物体(图像)渲染到屏幕上,通常经过将物体坐标转换为标准化设备坐标,然后再将标准化设备坐标转化为屏幕坐标的过程。该过程通常涉及多个坐标系统的变换,将所有顶点转换为片段之前,顶点需要处于不同的坐标系统进行计算,其中比较重要的有 5 个坐标系统:

在这里插入图片描述

  • 局部空间(Local Space,或者物体空间(Object Space)):指对象所在的坐标空间,坐标原点由你自己指定,模型的所有顶点相对于对象来说都是局部的。
  • 世界空间(World Space):主要实现对象的平移、缩放、旋转变换,将它们放在指定的位置,这些变换是通过模型矩阵(Model Matrix)实现的。
  • 观察空间(View Space):也被称为 OpenGL 相机空间,即从摄像机的角度观察到的空间,它将对象的世界空间的坐标转换为观察者视野前面的坐标。
  • 裁剪空间(Clip Space):用来裁剪观察对象的空间,在一个顶点着色器运行的最后,OpenGL 期望所有的坐标都能落在一个给定的范围内,且任何在这个范围之外的点都应该被裁剪掉。
  • 屏幕空间(Screen Space)。

二、视口

  • glViewport(GLint x,GLint y,GLsizei width,GLsizei height),对应屏幕区域的范围;
  • 如下所示,对应全屏幕:

在这里插入图片描述

  • 如下所示,对应屏幕一部分:

在这里插入图片描述

三、投影

① 概念

  • 光源的出发点为投影中心;
  • 投影中心与物体上各点的连线称为投影线;
  • 接受投影的面,称为投影面;
  • 过物体上各点的投影线与投影面的交点称为这些点的投影。

② 投影类别

  • 中心投影:所有投影线都交于投影中心点的投影称为中心投影,透视图就是用这种投影方法绘制成的。
  • 平行投影:所有的投影线都互相平行的投影称为平行投影,平行投影又分为斜投影和正投影两种,当投影线倾斜于投影面时,称斜投影。
  • 正投影是指平行投射线垂直于投影面。透视投影属于中心投影,透视投影图简称为透视图或透视,它是从某个投射中心将物体投射到单一投影面上所得到的图形。透视图与人们观看物体时所产生的视觉效果非常接近,透视图以渲染、配景,使之成为形象逼真的效果图。
  • 透视投影(左)和正投影(右),如下所示:

左为透视投影,右为正投影

  • 正交投影是一种平行投影,投影点与原顶点的连线相互平行,且物体不产生“近大远小”的视觉效果:

在这里插入图片描述

  • 透视投影的投影线相交于一点,可以用来模拟真实世界“近大远小”的视觉效果:

在这里插入图片描述

四、OpenGL 的坐标系

① 左手坐标系与右手坐标系

  • 在世界、物体、照相机空间是右手坐标系。
  • 在规范化设备坐标系用的是左手坐标系。

在这里插入图片描述

② 视窗坐标系

  • 视窗坐标也就是手机窗口对应的坐标系统,以左上角为原点,右下角对应手机的最大像素值的集合,如下图是一个像素为 320*480 的手机,那他右下角的坐标就是 (320, 480)。

在这里插入图片描述

③ 规格化设备坐标系

  • 规格化设备坐标是以屏幕中心为原点,X 轴朝右,Y 轴朝上,所以左下角的坐标为(-1, -1),右上角的坐标为(1,1)。当然这是 z 轴为 0 时的显示,实际上规格化设备坐标系统是要考虑 z 轴,所以由平面要转换成一个正方体,原点坐标为(0,0,0),也就是这个立方体的中心,而它左上角离最近的那个顶点的坐标就是(1,1,1),右下角离最远的那个顶点的坐标就是(-1,-1,-1)。

在这里插入图片描述

④ 裁剪坐标系

  • 裁剪坐标是执行矩阵变换和透视投影之后,但在执行透视除法之前的坐标,超出裁剪空间的坐标会被丢弃。

在这里插入图片描述

⑤ 视觉坐标系

  • 视觉坐标系是观察者的眼睛出发,朝手机设备看过去所能看到的,会有一个 z 轴的最近距离和最远距离,也就是 zNear 和 zFar,只有在这两者之间并且也满足 x 轴和 y 轴坐标在屏幕当中的坐标才会显示出来,越远的东西会显示得越小,产生透视的效果;

在这里插入图片描述

⑥ 世界坐标系

  • 世界坐标系就是由用户构造的固定坐标系,方便描述这个坐标系下各种物体相对于原点的位置;

在这里插入图片描述

⑦ 惯性坐标系

  • 惯性坐标系是指世界坐标系和物体坐标系转换的中间产物。惯性坐标系的原点和物体坐标系的原点重合,但惯性坐标系的轴和世界坐标系的轴平行;

在这里插入图片描述

⑧ 物体坐标系

  • 物体坐标系:物体自己独有的坐标系;当物体旋转和移动的时候,这个坐标系也会发生相应的变化。

在这里插入图片描述
在这里插入图片描述

  • 惯性坐标系是指世界坐标系和物体坐标系转换的中间产物。惯性坐标系的原点和物体坐标系的原点重合,但惯性坐标系的轴和世界坐标系的轴平行。
  • 为什么要引入惯性坐标系?因为物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系转换到世界坐标系只需要平移。

五、坐标变换

  • OpenGL 最终渲染到屏幕上是 2D 的,所以只需要将 3D 坐标进行一系列的变换为 2D 坐标,整个过程如下图所示:

在这里插入图片描述

  • OpenGL 中只定义了裁剪坐标系、规范化设备坐标系和屏幕坐标系。而局部坐标系(模型坐标系)、世界坐标系和摄像机坐标系都是为了方便用户设计而自定义的坐标系,它们的关系如下图所示:

在这里插入图片描述

  • 模型变换、视变换、投影变换由用户在顶点着色器中完成。
  • 透视除法、视口变换由 OpenGL 在顶点着色器处理之后完成。
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╰つ栺尖篴夢ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值