OpenGL相关坐标系

2D笛卡尔坐标系 2D Cartesian Coordinate System

笛卡尔坐标系 (Cartesian coordinate system) 是一种正交坐标系,亦称为直角坐标系。

2D笛卡尔坐标系即二维笛卡尔坐标系,用于描述平面上的位置和方向。它由两个坐标轴(x和y)构成,它们相互垂直并形成一个二维网格。每个点都可以通过x和y坐标值的组合来确定其在坐标系中的位置。

在2D笛卡尔坐标系中,x轴通常表示横向方向,y轴表示纵向方向。坐标轴的正方向和单位长度可以根据需要进行调整,但通常情况下,x轴的正方向为右侧,y轴的正方向为上方。

在计算机图形学中,2D笛卡尔坐标系被广泛用于描述2D图形的位置和方向。例如,在计算机游戏和图形界面中,2D坐标系用于定义屏幕上的元素位置,例如按钮,图像和文本。在绘图应用程序中,2D坐标系也常用于绘制图形,例如直线,矩形和圆形。

2D笛卡尔坐标系

3D笛卡尔坐标系 3D Cartesian Coordinate System

3D笛卡尔坐标系用于描述3D空间中的位置和方向。它由三个坐标轴(x,y和z)构成,它们相互垂直并形成一个三维网格。每个点都可以通过x,y和z坐标值的组合来确定其在坐标系中的位置。

在3D笛卡尔坐标系中,x轴通常表示横向方向,y轴表示纵向方向,z轴表示垂直方向。坐标轴的正方向和单位长度可以根据需要进行调整,但通常情况下,x,y和z轴的正方向分别为右侧,上方和正面。

3D笛卡尔坐标系(3D Cartesian Coordinate System)是一个常用的三维坐标系,用于描述3D空间中的位置和方向。它由三个坐标轴(x,y和z)构成,它们相互垂直并形成一个三维网格。每个点都可以通过x,y和z坐标值的组合来确定其在坐标系中的位置。

在3D笛卡尔坐标系中,x轴通常表示横向方向,y轴表示纵向方向,z轴表示垂直方向。坐标轴的正方向和单位长度可以根据需要进行调整,但通常情况下,x,y和z轴的正方向分别为右侧,上方和正面。

与2D笛卡尔坐标系一样,3D笛卡尔坐标系的原点通常位于坐标系的中心,具有坐标(0, 0, 0)。在3D坐标系中,每个点都可以通过三个坐标值(x,y和z)来描述,其中x,y和z表示点在x轴,y轴和z轴上的距离。因此,可以使用三元组(x,y,z)来表示点的位置。

在计算机图形学中,3D笛卡尔坐标系被广泛用于描述3D物体的位置和方向。例如,在OpenGL中,3D坐标系用于定义3D模型的顶点坐标,并在渲染过程中将模型从模型坐标系转换到世界坐标系和摄像机坐标系。在游戏和虚拟现实应用程序中,3D坐标系也常用于控制相机位置和方向,以实现不同的视角和观察效果。

3D笛卡尔坐标系

摄像机坐标系 Camera Coordinate System

摄像机坐标系(Camera Coordinate System)是一个基于相机本身的坐标系,用于描述相机在3D世界中的位置和朝向。

在摄像机坐标系中,相机本身位于坐标原点,通常面向z轴负方向。x轴通常指向相机右侧,y轴指向相机顶部。这种坐标系中的坐标值表示的是物体相对于相机的位置和方向。

由于摄像机坐标系是一个独立的坐标系,因此它需要与世界坐标系进行转换。这通常是通过一个矩阵变换来完成的,称为相机变换矩阵(Camera Transformation Matrix)或视图矩阵(View Matrix)。该矩阵描述了相机在世界坐标系中的位置和朝向,并将物体从世界坐标系转换到摄像机坐标系。

使用相机坐标系和相机变换矩阵,我们可以轻松地控制相机在3D世界中的位置和方向,从而实现不同的视角和观察效果。例如,我们可以通过改变相机的位置来实现从不同的角度查看场景,或者通过旋转相机来实现物体的自由旋转。

在OpenGL中,通常将相机变换矩阵传递给顶点着色器,以便在绘制物体时将物体从世界坐标系转换到相机坐标系。这样可以使物体始终面向相机,同时还可以在不改变物体本身位置的情况下实现相机的移动和旋转。

摄像机坐标系

世界坐标系 World Coordinate System

世界坐标系是一个在3D图形学中常用的坐标系,用于描述3D场景中物体的位置和方向。它是一个全局坐标系,用于将物体的位置和方向与世界空间中的其他物体相对比较。

在世界坐标系中,每个物体都有一个唯一的位置和方向,可以使用三元组(x,y,z)来表示。这些坐标值通常是相对于场景中的某个固定点或基准位置(例如场景的中心点)来定义的。与摄像机坐标系不同,世界坐标系通常是固定不变的,因为它定义了物体在场景中的绝对位置和方向。

它为描述和操作3D场景提供了一个标准的坐标系,为实现3D渲染和交互提供了基础。

物体坐标系 Object Coordinate System

物体坐标系是指一个局部坐标系,用于描述3D模型在其自身空间中的位置和方向。每个3D模型都有一个自己的物体坐标系,用于描述模型的形状和位置。

在物体坐标系中,模型的原点通常位于其几何中心,具有坐标(0,0,0)。可以使用三元组(x,y,z)来表示模型上的每个点相对于其局部坐标系的位置。因此,在物体坐标系中,每个3D模型都有一个唯一的局部坐标系,用于描述其自身形状和位置。

在3D图形学中,通常需要将3D模型从其局部坐标系转换到世界坐标系,这样才能将多个物体组合在一起组成完整的场景。这种转换涉及到平移,旋转和缩放操作,将物体的局部坐标系转换为全局坐标系。这样,可以将每个物体放置在场景中的正确位置,并且可以使用世界坐标系中的摄像机来查看整个场景。

物体坐标系为描述模型的形状和位置提供了一个本地坐标系。通过使用物体坐标系,可以对3D模型进行精确的定位和旋转,使其可以被正确地放置在3D场景中。

惯性坐标系 Inertial Coordinate System

为了方便世界坐标系和物体坐标系的相互转化,引入了一种新的坐标系,称作惯性坐标系,惯性坐标系是在世界坐标系到物体坐标系的“中间产物”。
惯性坐标系的原点与物体坐标系的原点相重合,并且惯性坐标系的轴平行于世界坐标系的轴。

惯性坐标系

投影 Projection

投影是将3D场景投影到2D平面上的过程。这个过程涉及到将场景中的物体转换为适合显示在屏幕上的2D图像。OpenGL中定义了两种基本的投影类型:正交投影和透视投影。

正交投影 Orthographic Projection

正交投影将场景中的所有物体投影到一个平行于近平面的平面上。这种投影方式不会改变物体的形状或大小,因为所有物体都保持相同的比例。正交投影通常用于制作2D游戏或需要不变形的3D图像的应用程序。

透视投影 Perspective Projection

透视投影可以创建更加逼真的3D场景。透视投影使用一个透视矩阵将物体投影到近平面上,这使得离观察者越远的物体看起来更小,离观察者更近的物体看起来更大。透视投影可以让3D场景看起来更加真实,因为它能够模拟真实世界中物体的远近和大小

正交投影和透视投影

视口 ViewPort

窗口 Screen

窗口其实就是屏幕。所有的场景最终都是要被光栅化乘显示器上的图像,屏幕是所有场景(2D、3D等)的最终输出目的地。一个Screen可以显示多个视口中的内容。

视口 Viewport

视口就是窗口中用来显示图形的一块矩形区域,它可以和窗口等大,也可以比窗口大或者小。它具有两个意义:

  1. 定义了视体(View Frustum)中的景物要被绘制到一张什么尺寸的画布之上。
  2. 定义了画布在屏幕的什么区域。

视体 View Frustum

视体是指场景中摄像机的可见的一个锥体范围,它有上(Top)、下(Bottom)、左(Left)、右(Right)、近(Near)、远(Far)共6个面组成。在视锥体内的景物可见,反之则不可见。为提高性能,只对其中与视锥体有交集的对象进行绘制。

近平面和远平面决定了可视区域的深度范围,这个范围内的物体将会被渲染到屏幕上。视锥的顶点位于相机位置,视锥沿着相机方向延伸,视锥的底面是近平面,远平面是视锥的顶面。

根据投影方式的不同,视体的形状也会不同,在3D图形学中,是通过定义投影矩阵的方式来描述视体。通过定义透视投影矩阵来描述透视视体,通过定义正交矩阵的方式来定义正交视体。
透视投影-透视视体

正交投影-正交视体

视体剔除 Viewing Frustum Culling

视体剔除是一种在计算机图形学中用于提高渲染效率的技术,其基本思想是在进行渲染前,先根据视口和投影矩阵计算出当前视图中可见的物体,并且只渲染这些可见的物体,而不渲染那些不可见的物体。

在OpenGL中,视体剔除通常是在顶点着色器中完成的。顶点着色器将顶点坐标变换到裁剪空间,然后通过透视除法将坐标变换到标准化设备坐标,最后通过视口变换将坐标变换到屏幕坐标。在裁剪空间中,可以根据物体的位置和大小,以及相机的位置和方向,计算出视锥体的六个面,分别是近平面、远平面、左平面、右平面、上平面和下平面。对于每个顶点,只有当它位于视体内部时才需要进行渲染,否则就将其剔除掉,以提高渲染效率。

视体剔除是一种非常有效的优化技术,因为它可以将不必要的计算和渲染操作从渲染流程中剔除掉,从而大大提高渲染效率。视体剔除在现代游戏引擎中得到了广泛应用,是实现高效渲染的关键技术之一。

视口坐标 Viewport Coordinates

视口坐标也称作窗口坐标(Window Coordinates),是OpenGL管线中的最后一步坐标变换。在这个变换之前,我们已经将物体从模型空间转换到了裁剪空间,并应用了投影变换和视体剔除,得到了标准化设备坐标(Normalized Device Coordinates)。视口坐标将标准化设备坐标映射到屏幕上的像素坐标。

视口的大小和位置由开发者设定,通常是通过调用glViewport()函数来设置。glViewport()函数接受四个参数,分别是视口的左下角在窗口中的x和y坐标,以及视口的宽度和高度。

在视口坐标系中,屏幕的左下角是原点,x轴向右延伸,y轴向上延伸。因此,对于一个给定的像素坐标(x,y),OpenGL可以将它映射到标准化设备坐标系中的坐标,再应用投影变换和透视除法,最终得到在屏幕上显示的图像。

标准化设备坐标 Normalized Device Coordinates

标准化设备坐标(简称NDC)是OpenGL管线中的一个阶段,它是顶点着色器输出的最终坐标。NDC坐标是一个三维向量,其取值范围为[-1,1],表示位于以原点为中心,边长为2的立方体中的点。在这个坐标系中,每个点的x、y和z坐标都被映射到[-1,1]的范围内,其中x轴指向屏幕的右侧,y轴指向屏幕的上方,z轴指向屏幕内部。

将顶点从物体坐标系变换到标准化设备坐标系,需要经过一系列的变换操作,包括模型变换、视图变换和投影变换。在经过这些变换后,我们得到的是位于裁剪空间中的坐标。裁剪空间中的坐标是一个四维向量,由x、y、z和w四个分量组成。在执行透视除法后,得到的是一个三维向量,即标准化设备坐标。

标准化设备坐标是OpenGL管线中非常重要的一个阶段,因为它将物体的坐标归一化,并将其映射到屏幕上的像素坐标。此外,NDC坐标还可以用于实现一些特效,比如在NDC坐标中对每个像素应用一些自定义的函数来调整其颜色、深度等属性。

透视除法 Perspective Division

透视除法是OpenGL中在顶点着色器之后进行的一种坐标变换操作。它是将顶点从裁剪坐标系(Homogeneous Clip Coordinates)变换到屏幕坐标系(Window Coordinates)的最后一步。

在OpenGL中,顶点着色器通常将顶点坐标从对象坐标系(Object Coordinates)变换到裁剪坐标系。裁剪坐标系中的坐标是以齐次坐标(Homogeneous Coordinates)表示的,其中的w分量通常为1。在进行透视投影变换时,由于投影矩阵的作用,裁剪坐标系中的坐标的w分量不再为1,而是被改变了。

透视除法就是将裁剪坐标系中的坐标进行归一化处理,使w分量恢复为1,同时将x、y、z坐标分别除以w分量,得到屏幕坐标系中的坐标。透视除法的公式如下:

x_ndc = x_clip / w_clip
y_ndc = y_clip / w_clip
z_ndc = z_clip / w_clip

其中,x_clip、y_clip和z_clip是顶点在裁剪坐标系中的坐标,x_ndc、y_ndc和z_ndc是顶点在屏幕坐标系中的坐标。w_clip是在变换过程中被修改过的w分量。

透视除法的作用是将裁剪坐标系中的坐标转换为屏幕坐标系中的坐标,使得图形可以正确地显示在屏幕上。

坐标变换

下面是一个示意图,显示了OpenGL中的坐标变换管线和变换矩阵,包括模型变换、视图变换和投影变换。这些变换被组合在一起,以将3D场景中的物体从物体坐标系转换到最终在屏幕上呈现的像素坐标系。

坐标变换

在这个示意图中,顶部是场景中的物体,它们的位置和方向在物体坐标系中定义。首先,使用模型变换将物体从物体坐标系转换到世界坐标系。这通常涉及到平移、旋转和缩放等变换。然后,使用视图变换将场景从世界坐标系转换到观察者的坐标系(也称为相机坐标系)。这个变换通常涉及到相机的位置和方向。最后,使用投影变换将场景从相机坐标系转换到裁剪坐标系(也称为规范化设备坐标系)。这个变换通常涉及到定义视锥体(例如透视投影或正交投影)以及相应的投影矩阵。

最后,OpenGL会将裁剪坐标系中的物体坐标通过视口变换(Viewport Transform)转换为屏幕上的像素坐标。视口变换通常涉及到定义屏幕上的像素坐标范围,以及通过一个简单的缩放和平移操作将裁剪坐标系中的物体坐标映射到像素坐标系中。这样,我们就可以将3D场景呈现在屏幕上了。

坐标变换

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

openGL定义的坐标系和用户定义的坐标系

参考:

分类: 音视频开发 标签: OpenGL

评论

暂无评论数据

暂无评论数据

目录