使用 pygame 了解 3D 空间,创造深度错觉

327 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

迈向第三维度

游戏通常试图模仿现实世界,或者创建一个离现实不远的世界,玩家仍然能够以某种方式认同它。在过去,这需要代表玩家实现真正的信念飞跃,因为技术还无法创造出看起来很像现实的视觉效果。但随着技术的进步,游戏设计师开始推动硬件创造更令人信服的图形。

最初,一切都是二维的,因为绘制2D精灵是一个相当简单的操作,控制台和计算机可以做得很好。即使只有2D功能,游戏设计师也试图创建带有阴影和运动的三维外观。最终,游戏硬件能够创建更具说服力的3D图形,开发人员可以自由地尝试额外的维度。早期的3D游戏具有粗糙的图形,由线条和平面,无阴影的三角形生成,但很快这些图形就演变成具有数千个多层多边形和逼真照明的丰富场景。

如今,大多数游戏都是3D游戏,家用计算机具有专用于创建3D视觉效果的硬件的显卡。桌面上的计算机可以在几分之一秒内生成3D图像 - 这在几十年前需要花费数小时 - 您可以在Pygame应用程序中访问这些功能。本章介绍存储 3D 信息并从中创建图像的基础知识。

创造深度错觉

就像电脑游戏中的几乎所有其他东西一样,3D是一种幻觉。电视和显示器仍然只能显示二维图像。如果你在玩游戏时将头部从一侧移动到另一侧,则不会再看到任何场景,因为它基本上是平坦的,没有真正的深度。如果您使用的是VR设备,则实际上可能会进行一些移动。不管它让你感觉如何,这也是一种错觉。这种错觉可能非常令人信服,因为我们的大脑高度调整,可以识别三维世界的特征。我们的大脑判断我们正在观看的内容的深度的主要方法是将每只眼睛的两个图像结合起来。但即使你闭上一只眼睛,你也会发现你能够判断距离,在不撞到东西的情况下四处走动(即使它比以前更难一点)。这是因为透视和阴影等视觉线索也被用来理解每只眼睛的图像,我们的大脑下意识地利用这些信息来帮助我们理解深度。因此,即使屏幕上的图像是平面的,如果它包含透视和阴影,它仍然具有深度。

具有 3D 图形的游戏必须具有以您期望的方式移动的对象他们在现实世界中。有时,物体以合理的方式移动以产生深度错觉就足够了。清单 8-1 是一个示例,说明仅靠运动即可创建具有明显第三维度的视觉效果。

image.png

image.png

当您运行清单 8-1 时,您将看到一个相当令人信服的星场,其中不同距离的星形经过屏幕。虽然星场看起来是3D的,但你不会在代码中找到任何特别不熟悉的东西。它所做的只是以不同的速度在屏幕上移动许多点。深度的印象是你的大脑假设快速的物体离你很近,而较慢的物体离你更远的结果。

了解 3D 空间

要存储实体在 2D 游戏中的位置,请使用具有两个组件(x 和 y)的坐标系,这两个组件对应于屏幕上的物理像素。对于 3D 游戏,您需要使用带有名为 z 的附加组件的坐标系(请参见图 8-1)。这个额外的组件用于测量进入或离开屏幕的距离。当然,Pygame实际上不能使用3D坐标绘制任何东西,因为屏幕是平坦的。因此,3D坐标最终必须转换为2D,然后才能用于将任何内容渲染到屏幕上。我们将在本章的后面部分介绍如何执行此操作,但首先我们需要知道如何使用Python存储3D坐标。

image.png

在 3D 坐标系中,x 向右点,y 指向上方。这与我们用于创建 2D 图形的坐标系不同,后者的 y 指向屏幕下方。在 3D 模式下,如果增加 y 分量,坐标将在屏幕上向上移动,而不是向下移动。

3D坐标系中的z轴可以以两种方式之一指向,具体取决于所使用的图形技术;它要么指向屏幕(远离查看器),要么指向屏幕外(朝向查看器)。在本书中,我们将使用一个坐标系,该坐标系带有指向屏幕外的正z。图 8-2 显示了带有间谍机器人的 3D 坐标系,该机器人由圆点坐标 (7, 5,10) 表示。由于这不是弹出式图书,因此多余的轴表示为对角线。

3D坐标的单位可以表示任何东西,具体取决于游戏的规模。如果你正在写一个第一人称射击游戏,单位可能是米甚至

厘米,但对于太空游戏,单位可能代表更大的比例(也许是光年)!假设机器人的坐标以米为单位,士兵阿尔法(玩家角色)站在坐标(0,0,0)处,面向负z轴,机器人将在玩家的后面和右侧悬停在空中10米处。