pygame 使用 使用 3D 矢量

366 阅读3分钟

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

使用 3D 矢量

到目前为止,您已经熟悉了我们用于表示 2D 示例中的位置和标题的二维矢量。3D 中的矢量与 2D 对应物相似,但具有三个分量而不是两个分量。这些3D矢量具有许多与2D相同的功能。它们可以被加法、减法、缩放等等。三维向量可以存储在元组或列表中,但使用专用类将使计算更容易。清单 8-2 显示了如何开始定义 3D 矢量类。

image.png image.png

大多数可以在 3D 模式下完成的操作都可以扩展以考虑 z 分量。例如,The_add_function与 2D 版本非常相似,但它也添加了两个矢量的 z 分量。

我们将使用在游戏对象库中定义的 Vector3 类作为 3D 代码。清单 8-3 显示了如何导入和使用此类。

image.png

运行此代码将生成以下输出:

image.png

3D 中基于时间的移动

我们可以使用Vector3类在3D中进行基于时间的运动,其方式与在二维空间中大致相同。例如,让我们使用一些3D矢量数学来计算目标矢量并计算出射弹武器的中间坐标(见图8-3)。

image.png

士兵阿尔法已经从图8-2中的原始位置走了几米远,现在站在点(-6,2,0)。间谍机器人仍在(7,5,10)徘徊,

监视阿尔法的行为。幸运的是,阿尔法敏锐的听觉(或玩家的扬声器)拾起了反重力引擎的微弱嗡嗡声,他决定取出机器人。为了向机器人开火,阿尔法需要计算一个从他的肩扛式等离子步枪到机器人位置的矢量。

Alpha 可能站在点 (-6, 2, 0) 上方,但他的肩膀在点 (-6, 2, 2) 处距离地面 2 米,因此这是矢量计算的起点。指向其目标的向量是通过从起点 A 处 (-6, 2, 2) 减去机器人在 (7,5,10) 处的位置点 B 而产生的,从而得到目标向量 (13, 3, 8)。归一化此矢量将生成可用于基于时间的运动的航向矢量。清单 8-4 显示了如何在代码中执行这些计算。

image.png

image.png

运行清单 8-4 生成以下输出:

image.png

如果我们使用这些值在游戏中渲染等离子体螺栓,则可以通过将航向矢量乘以自上一帧以来经过的时间和等离子体螺栓的速度来计算等离子体螺栓自上一帧以来移动了多远。将结果添加到螺栓的当前位置会给我们新的位置。代码将如下所示:

image.png

在Pygame应用程序中创建3D射弹之前,您首先必须学习如何将3D坐标转换为2D坐标以将其渲染到屏幕上 - 这是下一节的主题。