文章目录

* 左手坐标系和右手坐标系
<https://blog.csdn.net/shengpeng3344/article/details/90736223#_1>
* 坐标系 <https://blog.csdn.net/shengpeng3344/article/details/90736223#_5>
* 坐标变换的全局图 <https://blog.csdn.net/shengpeng3344/article/details/90736223#_37>
* 将坐标系统组合在一起
<https://blog.csdn.net/shengpeng3344/article/details/90736223#_46>
* 模型变换 <https://blog.csdn.net/shengpeng3344/article/details/90736223#_49>
* 视变换 <https://blog.csdn.net/shengpeng3344/article/details/90736223#_52>


<>左手坐标系和右手坐标系


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

<>坐标系

OpenGL希望每次顶点着色后,我们的可见顶点都为标准化设备坐标(Normalized Device
Coordinate,NDC),也就是说每个顶掉的x,y,z值都在-1到1之间,超出这个范围的顶点是不可见的

通常情况下我们会自己设定一个坐标范围,之后再在顶点着色器中将这些坐标变换为表转化设备坐标。然后这些标话设备坐标传入光栅器(Rasterizer),将他们转化为屏幕上的二维坐标和像素。

将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分部进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate
System)。将物体的坐标变换到几个过渡坐标系(Intermediate Coordinate
System)的优点在于,在这些特定系统中,一些操作和特定运算更加方便和容易,这一点很快就会变得明显,总结下比较重要的5个坐标系统

* 局部空间(Local Space,或者称为物体控件(Object Space))
* 世界空间(World Space)
* 观察空间(View Space,或者称为视觉空间(Eye Space))
* 裁剪空间(Clip Space)
* 屏幕空间(Screen Space)
上面就是一个顶点在最终被转化为片段之前需要经历的所有不同的状态。为了将坐标从一个坐标系转换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是
模型(Model)、观察(View)、投影(Projection)三个矩阵,
物体的起始坐标为局部空间(物体空间),这里称他为局部坐标,之后它会变成世界坐标(World Coordinate),观测坐标(View
Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)形式结束。
在3D图形学中,常用的坐标系如下:

* 世界坐标系
* 物体坐标系
* 摄像机坐标系
* 惯性坐标系
世界坐标系:世界坐标系是系统的绝对坐标系,在没有建立用户坐标系之前的画面上的所有的点的坐标都可以在该坐标系的原点来确定各自的位置,世界坐标系始终是不变的。
物体坐标系:每个物体都有他们独立的坐标系,当物理移动或者改变方向时,该物体关联的坐标系将随之移动或者改变。
物体坐标系是以物体本身而言的,比如,你向前走十步,此时你的前后左右方向是不会改变的,整个人就像带着一个坐标在走。

如果我告诉你向前走一步,是在你的物体坐标系发送指令。我们并不知道你会向哪个绝对方向移动,如果你的前面是北方,则是向北(这个向北则是世界坐标系中的)。故“前后左右”这样的概念只有在物体坐标系中才有意义。
摄像机(照相机)坐标系:照相机坐标系是和观察者密切相关的坐标系。照相机坐标系和屏幕坐标系相似,差别在于照相机坐标系处于3D空间中,而屏幕坐标系处于2D平面


惯性坐标系:指的是世界坐标系到物体坐标系的“半途”参照的一个坐标系。惯性坐标系的原点和物体的坐标原点重合,但惯性坐标系的轴平行于世界坐标系的轴。
为什么要进入惯性坐标系?因为物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系转换到世界坐标系只需要平移。


<>坐标变换的全局图


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


在上面的图中,有些是我们接触不到的,OpenGL中只定义了裁剪坐标系、规范化设备坐标系、屏幕坐标系,而局部坐标系(模型坐标系)、世界坐标系和照相机坐标系都是为了方便用户设计而自定义的坐标系,通常我们不会接触到,OpenGL里面做了处理:


* 图中左边的过程包括模型变换、视变换、投影变换,这些变换可以由用户根据需要自行制定,这些内容在顶点着色器中完成;
* 图中右边的两个步骤,包括透视除法、视口变换,这两个步骤是OpenGL自动执行的,在顶点着色器处理后的阶段完成。
<>将坐标系统组合在一起



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

<>模型变换

局部坐标系(模型坐标系)是为了方便构造模型而设立的坐标系,建立模型时我们无需关心最终对象显示在屏幕哪个位置。
模型变换的主要目的是:通过变换是的用顶点属性定义或者3D建模软件构造的模型,能够按照需要,通过缩小、平移等操作放置到场景中合适的位置
。通过模型变换后物体放置在一个全局的世界坐标系中,世界坐标系是所有物体交互的一个公共坐标系。

<>视变换


视变换是为了方便观察场景中物体而设定的坐标系,在这个坐标系中相机是个假设的概念,是为了便于计算而引入的。照相机坐标系中的坐标,就是从相机的角度来解释世界坐标系中物体的位置

OpenGL中相机始终位于原点,指向-Z轴。要观察-Z轴方向的一个立方体的右侧边,可以有两种方式:

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信