游戏开发中的向量数学介绍本教程是线性代数的简短实用介绍,因为它适用于游戏开发。线性代数是向量及其用途的研究。向量在2D和3D开发中都有许多应用,并且Godot广泛使用它们。对矢量数学有深入的了解对于成为一名强大的游戏开发者至关重要。
坐标系(2D)在2D空间中,使用水平轴(x)和垂直轴(y)定义坐标。2D空间中的特定位置被写为一对值,例如。
二维平面中的任何位置都可以通过一对数字来标识。 但是,我们也可以将位置 这是一个向量。 向量代表许多有用的信息。 除了告诉我们该点位于 关于矢量要考虑的非常重要的一点是,它们仅代表相对方向和大小。没有向量位置的概念。以下两个向量是相同的: 两个向量都代表一个点,该点向右4个单位,在某个起点下方3个单位。在平面上绘制矢量的位置无关紧要,它始终表示相对方向和大小。 向量运算您可以使用任何一种方法(x和y坐标或角度和大小)来引用矢量,但是为了方便起见,程序员通常使用坐标符号。例如,在Godot中,原点是屏幕的左上角,因此,要使用一个名为Node2D400像素,向下300像素的2D节点,请使用以下代码:
Godot同时支持Vector2和 Vector3的2D和3D使用。本文讨论的相同数学规则适用于两种类型。 会员访问可以直接通过名称访问向量的各个组成部分。
添加向量当相加或相减两个向量时,将添加相应的分量:
我们还可以通过在第一个向量的末尾添加第二个向量来直观地看到这一点: 注意,加a + b的结果与b + a相同。 标量乘法
一个向量可以乘以一个标量:
实际应用让我们看一下向量加法和减法的两种常见用法。 运动向量可以表示具有大小和方向的任何数量。典型示例是:位置,速度,加速度和力。在此图像中,步骤1的太空飞船的位置矢量为
指向目标在这种情况下,您有一个坦克,希望将其炮塔指向机器人。从机器人的位置减去水箱的位置即可得出从水箱指向机器人的向量。
单位向量大小为的向量1称为单位向量。它们有时也称为方向向量或法线。当需要跟踪方向时,单位矢量会很有用。 正常化归一化向量意味着将其长度减小到,1同时保留其方向。这是通过将其每个组成部分除以其大小来完成的。因为这是这样一个共同的操作, Vector2并Vector3提供一种用于归一化的方法:
反射单位向量的一种常见用法是指示法线。法线向量是垂直于表面对齐并定义其方向的单位向量。它们通常用于照明,碰撞以及涉及曲面的其他操作。 例如,假设我们有一个要从墙或其他物体上反弹的运动球: 表面法线的值为(0,-1),因为它是水平面。 当球碰撞时,我们采取其剩余的运动(当其击中表面时剩余的量)并使用法线反射它。 在Godot中,Vector2类具有bounce()方法来处理此问题。 这是上面使用KinematicBody2D的图的GDScript示例:
点积该点积是矢量数学最重要的概念之一,但经常被误解。点积是对两个向量返回标量的运算。与既包含幅度又包含方向的向量不同,标量值仅包含幅度。 点积的公式有两种常见形式: 和 但是,在大多数情况下,最容易使用内置方法。请注意,两个向量的顺序无关紧要:
与单位向量一起使用时,点积最有用,这会使第一个公式简化为just cosθ。这意味着我们可以使用点积来告诉我们有关两个向量之间的角度的一些信息: 使用单位矢量时,结果将始终在-1(180°)和1(0°)之间。 面对我们可以利用这一事实来检测一个对象是否面向另一个对象。在下图中,玩家P试图避开僵尸A和B。假设僵尸的视野为180°,他们可以看到玩家吗? 绿色箭头fA和fB是代表僵尸面向方向的单位矢量,蓝色半圆形代表其视野。 对于僵尸A,我们使用P-A找到指向玩家的方向向量AP并将其标准化,但是Godot有一个辅助方法来执行此操作,称为direction_to。 如果此向量和面对的向量之间的角度小于90°,则僵尸可以看到玩家。 在代码中,它看起来像这样:
叉积像点积一样,叉积是对两个向量的运算。但是,叉积的结果是一个向量,向量的方向垂直于两者。其大小取决于它们的相对角度。如果两个向量平行,则其叉积的结果将为空向量。
叉积计算如下:
使用Godot,您可以使用内置方法:
计算法线叉积的一种常见用法是在3D空间中找到平面或曲面的表面法线。如果我们有三角形,ABC则可以使用矢量减法找到两个边AB和AC。使用叉积, 产生一个垂直于两个方向的向量:表面法线。AB x AC 这是一个计算三角形法线的函数:
指向目标在上面的点积部分,我们看到了如何将其用于查找两个向量之间的角度。但是,在3D中,这还不够。我们还需要知道要旋转的轴。通过计算当前朝向和目标方向的叉积可以发现。所得的垂直向量是旋转轴。 更多信息 进阶向量数学 |
|