3D Game Development with LWJGL 3 第三章:关于坐标的简介

本章将讨论坐标与坐标系,尝试以一种简单的方式引入一些基本的数学概念,用于支持在后续章节中讨论的技术与专题。为了提高易读性,本章节将假设一些简化的情景,可能会牺牲精确性。

我们通过指定对象的坐标来定位空间中的物体。例如地图,你会通过经度与纬度在地图上指定一个地点。只需要一对数字就能精确地识别一个点,这对数字即为该点的坐标(在现实中有点复杂,因为地球是一个非完美的椭圆,地图为其投影,所以需要更多的数据,但这是一个很好的类比)。

坐标系是使用一个或多个数字的系统,也就是说,一个或多个组成部分来唯一指定一个点的位置。不同的坐标系(笛卡尔(Cartesian)、极地(polar)等)之间能够互相转换。本章将使用笛卡尔坐标系来讲述后续内容。

在笛卡尔坐标系中,对于二维空间,坐标由两个数字定义,用于测量距离X与Y轴的垂直符号距离(signed distance)。
笛卡尔坐标系

继续与地图类比,坐标系定义了一个原点。对于地理坐标,原点设置为赤道与零子午线(zero meridian cross,又名本初子午线)的交叉点。根据我们设定原点的位置,特定点的坐标会有所不同。坐标系还可以定义轴的方向。在上图中,当点向右移动时,X坐标增加,当点向上移动时,Y坐标增加。但是,我们也可以定义一个具有不同轴方向的另类笛卡尔坐标系,在其中将获得不同的坐标。
另类笛卡尔坐标系
正如你所看到的,我们需要定义一些任意参数,如原点以及轴的方向,以便给予这对构成坐标的数字恰当的含义。我们将带有这组任意参数的坐标系称作为坐标空间。我们必须使用相同的坐标空间来处理坐标组。好的是,只需平移和旋转,就可以将坐标从一个空间转换至另一个空间。

如果处理3D坐标,则需要添加一条Z轴。3D坐标将由三个数字(x,y,z)组成一组。
3D笛卡尔坐标系
与2D笛卡尔坐标系一样,只要轴相互垂直,我们可以改变3D坐标空间中轴的方向。下图表示了另一种3D坐标空间。
另类3D笛卡尔坐标系
3D坐标可以分为两种:左手坐标系(left handed)与右手坐标系(right handed)。怎么判断坐标系是哪种类型?张开手,在拇指和食指间形成一个“L”,中指方向与拇指和食指垂直,此时拇指指向X轴正方向,食指指向Y轴正方向,中指指向Z轴正方向。你的左右手分别对应左手坐标系和右手坐标系。
左手坐标系与右手坐标系
对2D坐标空间,运用旋转,能够使一个坐标空间转换为另一个,因此2D坐标空间都是等效的。相反,3D空间并不都是等效的。只有在相同手系(同为左手系或同为右手系)中才能运用旋转将一个坐标空间转换为另一个坐标空间。

现在我们阐述了一些基本原理,再来讲讲在处理3D图形中常用的术语。当在后续章节中讲解如何渲染3D模型时将会看到不同的3D坐标空间,因为这些坐标空间有各自的上下文与用途。没有一组坐标是无意义的。当你在检查一个坐标(例如:40.438031, -3.676626)时,它可能会告诉你相关信息,也可能不会。如果我说它是一个几何坐标(经纬度),那么你就会知道它是马德里的坐标。

在加载3D对象时,我们会得到一组3D坐标。这些坐标表现在名为对象坐标空间的坐标空间中。当图形设计师在创建这些3D模型时,他们不会知道这个模型所显示在的3D场景中的一切东西。因此,他们仅能使用与模型相关的坐标空间来定义坐标。

当将要绘制一个3D场景时,所有的3D对象都将和称为世界空间的坐标空间相对应。我们需要将3D对象空间坐标转换为世界空间坐标。一些对象需要被旋转、拉伸或放大以及转换,才能再3D场景中正确显示。

就像在3D空间中移动摄像机一样,我们还需要限制所显示的3D空间的范围。然后,需要将世界空间坐标转换为相机或视图空间坐标。最后这些坐标需要被转换为屏幕坐标,即2D,因此我们需要将3D视图坐标投射到2D屏幕坐标空间。

下图为OpenGL坐标(Z轴与屏幕垂直),坐标介于-1和+1之间。
OpenGL坐标
如果仍未清晰地理解这些概念,不必担心,后续章节将会重新讨论这些问题,并加以实例。

猜你喜欢

转载自blog.csdn.net/m0_37942304/article/details/108004807