美文网首页
OpenGL--坐标系

OpenGL--坐标系

作者: tp夕阳武士 | 来源:发表于2019-12-19 15:05 被阅读0次
2D笛卡尔坐标系

2D笛卡尔坐标系是应该是我们每一个人接触过最多的坐标系

  • 每个2D笛卡尔坐标系都有一个特殊的点,称作原点(Origin(0,0)),它是坐标系的中心。原点相当于笛卡尔城的中心。
  • 每个2D笛卡尔坐标系都有两条过原点的直线向两边无限延伸,称作“轴”(axis)。两个轴互相垂直,这相当于笛卡尔城的中央街道和分界街道。


    2D笛卡尔坐标系.jpg
3D笛卡尔坐标系

3D笛卡尔坐标系是在2D笛卡尔坐标系的基础上,增加了一条垂直于原来X轴和Y轴的直线,这条线被称为Z轴,我们也可以理解为这是一条垂直于屏幕的坐标西安.
基于X,Y,Z 三条线,我们就可以呈现出一个立体的三维空间系统:


3D笛卡尔坐标系-图片摘取自CC老师课件.jpg
左手坐标系 与 右手坐标系
  • 左手坐标系: 伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
  • 右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
右手坐标系_图片源于CC老师课件.png

注意:OpenGL中坐标系 OpenGL中的物体、世界、照相机坐标系都属于右手坐标系,而规范化设备坐标系使用左手坐标系。

视口

窗口是以像素为单位度量. 在开始在窗口中绘制点,线,形状之前,必须告诉OpenGL 如何把指定坐标映射为屏幕坐标.
坐标系统必须从逻辑笛卡尔坐标映射到物理屏幕像素坐标. 这个映射是通过一种叫做视口(viewPort)的设置来指定.
在我们代码中,我们会通过glViewport(x,y,w,h)函数来实现视口的设计. 视口就是窗口内部用于绘制裁剪区域的客户区域.

视口1.jpg 视口2.jpg
OpenGL的坐标系

OpenGL将显示屏幕的中心点视为坐标系原点,也就是O(x=0,y=0,y=0),一块屏幕的最左边就是x=-1,最底部是y=-1,最右边是x=1,最顶部是y=1;
OpenGL 希望每次顶点着色后,我们的可见顶点都为标准化设备坐标(Normalized Device Coordinate,NDC)规范设备坐标->左手坐标系。也就是说每个顶点的z,y,z都应该在−1到1之间,超出这个范围的顶点将是不可见的。

坐标系.jpg

通常情况下我们会自己设定一个坐标范围,之后再在顶点着色器中将这些坐标变换为设备坐标。然后这些标准化设备坐标传入光栅器(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)的形式结束

在3D图形学中常用的坐标系:
  • 世界坐标系
  • 物体坐标系
  • 摄像机坐标系
  • 惯性坐标系

世界坐标系:世界坐标系是系统的绝对坐标系,在没有建立用户坐标系之前画面上所有的点的坐标都可以在该坐标系的原点来确定各自的位置.世界坐标系始终是固定不变的

物体坐标系: 每个物体都有他们独立的坐标系.当物理移动或者改变方向时.该物体相关联的坐标系将随之移动或改变方向。

物体坐标系是以物体本身而言,比如,我先向你发指令,“向前走一步”,是向您的物体坐标体系指令。我并不知道你会往哪个绝对的方向移动。比如说,当你开车时,有人会说向左转,有人说向东。但是,向左转是物体坐标系的概念,而向东则是世界坐标系中的。

在某种情况下,我们可以理解物体坐标系为模型坐标系。因为模型顶点的坐标都是在模型坐标系中描述的。

摄像机坐标系:在坐标系的范畴里,摄像机坐标系和照相机坐标系都是一样的意义。照相机坐标系是和观察者密切相关的坐标系。照相机坐标系和屏幕坐标系相似,差别在于照相机坐标系处于3D空间中,而屏幕坐标系在2D平面里。

惯性坐标系: 指的是世界坐标系到物体坐标系的"半途". 惯性坐标系的原点和物体坐标原点重合,但惯性坐标系的轴平行于世界坐标系的轴.

坐标变换过程

因为屏幕是2D的,所以OpenGL需要将3D场景转换为2D的形式,

OpenGL坐标转换过程.jpg
注意,OpenGL只定义了裁剪坐标系、规范化设备坐标系和屏幕坐标系,而局部坐标系(模型坐标系)、世界坐标系和照相机坐标系都是为了方便用户设计而自定义的坐标系,它们的关系如下图所示 坐标关系.jpg

相关文章

网友评论

      本文标题:OpenGL--坐标系

      本文链接:https://www.haomeiwen.com/subject/fchqnctx.html