OpenGL(二)-OpenGL坐标系解析

logo.jpg

如果你想把图形渲染在正确的位置上,那么坐标的设置就很重要了。在OpenGL中,与坐标相关的主要有世界坐标系、物体机坐标系、摄像机坐标系、惯性坐标系以及这些坐标系的转换,如MVP(Model View Projection)转换。

2D笛卡尔坐标

在二维绘图中,最为常用的坐标系统是笛卡尔坐标系统. 笛卡尔坐标由一个X和一个Y坐标构成.X表示水平方向位置,Y表示垂直方向的位置.


2d.jpg

3D笛卡尔坐标系

将2D笛卡尔坐标系系统扩展到三维空间中.从水平和垂直方向,增加了深度分量.
增加的深度分量用Z来表示,Z轴同时垂直于X,Y轴.它代表的是一条从屏幕中心朝向读者的直线.
为了更好的观察,我们将Y轴向做旋转,把X轴向下和后渲染.否则Z轴将直面我们,我们无法具体观察到Z轴存在.


3d.jpg

视口

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

888.png

投影:从3D到2D

不管我们觉得自己的眼睛看到的三维立体图像多么真实.屏幕上像素实际上只有二维的. 我们的手机屏幕本身就是二维的,我们是无法真实去呈现立体图形.
那么OpenGL 是如何将笛卡尔坐标系映射成可以在屏幕上显示的二维坐标的?
在这里需要用到投影.我们需要指定投影空间,指定在窗口显示的视景体(Viewing Volume).并指定如何对它进行变换.

举例子: 类似于立体图像站在镜子前.
第一种正投影(Orthographics Projection)或平行投影. 使用正投影时,需要指定一个正方形/长方形的视景体. 在视景体以外的任何物体都不会被绘制. 并且使用正投影所以实际大小相同的物体在屏幕上都具有相同的大小.不管它们是否存在远近问题. 正投影比较适合平面图形/2D图形渲染时使用.

第二种透视投影(Perspective Projection).它在3D开发中更为常见. 同样需要指定视景体的.而这个视景体并不是类似于正方体,看起来像平截体. 透视投影一般会使用于3D图像渲染.因为它会更加逼真.


4624551-f21df0d2ec41e768.jpg
左手坐标系和右手坐标系
4624551-0a570771160bd2e5.jpg

注意OpenGL中坐标系 OpenGL中的物体世界照相机坐标系都属于右手坐标系,而规范化设备坐标系使用左手坐标系。笼统地说OpenGL使用右手坐标系是不合适的。

坐标系

OpenGL 希望每次顶点着色后,我们的可见顶点都为标准化设备坐标(Normalized Device Coordinate,NDC)。也就是说每个顶点的z,y,z都应该在−1到1之间,超出这个范围的顶点将是不可见的。
通常情况下我们会自己设定一个坐标范围,之后再在顶点着色器中将这些坐标变换为表转化设备坐标。然后这些标化设备坐标传入光栅器(Rasterizer),将它们变换为屏幕上的二维坐标和像素。
将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Intermediate Coordinate System)的优点在于,在这些特定的坐标系统中,一些操作或运算更加方便和容易,这一点很快就会变得很明显。对我们来说比较重要的总共有5个不同的坐标系统:

1.局部空间(Local Space,或者称为物体空间(Object Space))
2.世界空间(World Space)
3.观察空间(View Space,或者称为视觉空间(Eye Space))
4.裁剪空间(Clip Space)
5.屏幕空间(Screen Space)

就是一个顶点在最终被转化为片段之前需要经历的所有不同状态.为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。物体顶点的起始坐标再局部空间(Local Space),这里称它为局部坐标(Local Coordinate),它在之后会变成世界坐标(world Coordinate),观测坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Corrdinate)的形式结束

在3D图形学中常用的坐标系:

1.世界坐标系
2.物体坐标系
3.摄像机坐标系
4.惯性坐标系

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

物体坐标系: 每个物体都有他们独立的坐标系.当物理移动或者改变方向时.该物体相关联的坐标系将随之移动或改变方向。
物体坐标系是以物体本身而言,比如,我先向你发指令,“向前走一步”,是向您的物体坐标体系指令。我并不知道你会往哪个绝对的方向移动。比如说,当你开车时,有人会说向左转,有人说向东。但是,向左转是物体坐标系的概念,而向东则是世界坐标系中的。
在某种情况下,我们可以理解物体坐标系为模型坐标系。因为模型顶点的坐标都是在模型坐标系中描述的。

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

sxj.png

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

为什么要引入惯性坐标系?因为物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系转换到世界坐标系只需要平移.

3.png

坐标变换的全局图

OpenGL最终的渲染设备是2D的,我们需要将3D表示的场景转换为最终的2D形式,前面使用模型变换和视变换将物体坐标转换到照相机坐标系后,需要进行投影变换,将坐标从相机坐标系变换到裁剪坐标系,经过透视除法后,变换到规范化设备坐标系(NDC),最后进行视口变换后,3D坐标才变换到屏幕上的2D坐标,这个过程如下图所示:


4.png

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


99999.png

图中左边的过程包括模型变换、视变换,投影变换,这些变换可以由用户根据需要自行指定,这些内容在顶点着色器中完成;

图中右边的两个步骤,包括透视除法、视口变换,这两个步骤是OpenGL自动执行的,在顶点着色器处理后的阶段完成。

将坐标系统组合在一起:
2.jpg

我们为上述的每一个步骤都创建一个变换矩阵:模型矩阵、观察矩阵、投影矩阵。
一个顶点坐标会根据以下过程被变换到裁剪坐标:

bh.png

这一系列矩阵的变换需要从右往左读。最后的顶点应该被赋值到顶点着色器中的gl_position,OPENGL将会自动进行透视除法和裁剪。

OpenGL 然后对裁剪坐标执行透视除法从而将它们变换到标准化设备坐标。OpenGL 会使用 glViewPort 内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标都关联了一个屏幕上的点。这个过程称为视口变换。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350