游戏开发中的向量数学

  • 介绍
  • 坐标系(2D)
  • 向量运算
    • 会员访问
    • 添加向量
    • 标量乘法
  • 实际应用
    • 运动
    • 指向目标
  • 单位向量
    • 正常化
    • 反射
  • 点积
    • 面对
  • 叉积
    • 计算法线
    • 指向目标

介绍

本教程是线性代数的简短实用介绍,因为它适用于游戏开发。线性代数是向量及其用途的研究。向量在2D和3D开发中都有许多应用,并且Godot广泛使用它们。对矢量数学有深入的了解对于成为一名强大的游戏开发者至关重要。

注意

本教程不是关于线性代数的正式教科书。我们只会研究如何将其应用于游戏开发。要更广泛地了解数学,请参见https://www.khanacademy.org/math/linear-algebra

坐标系(2D)

在2D空间中,使用水平轴(x)和垂直轴(y)定义坐标。2D空间中的特定位置被写为一对值,例如。(4, 3)

注意

如果您是计算机图形学的新手,那么正y轴是指向下而不是指向上,这似乎很奇怪,就像您在数学课上学到的那样。但是,这在大多数计算机图形应用程序中很常见。

二维平面中的任何位置都可以通过一对数字来标识。 但是,我们也可以将位置(4,3)视为与(0,0)点或原点的偏移量。 绘制一个从原点指向该点的箭头:

这是一个向量。 向量代表许多有用的信息。 除了告诉我们该点位于(4,3)之外,我们还可以将其视为角度θ和长度(或大小)m。 在这种情况下,箭头是位置矢量-它表示相对于原点的空间位置。

关于矢量要考虑的非常重要的一点是,它们仅代表相对方向和大小。没有向量位置的概念。以下两个向量是相同的:

两个向量都代表一个点,该点向右4个单位,在某个起点下方3个单位。在平面上绘制矢量的位置无关紧要,它始终表示相对方向和大小。

向量运算

您可以使用任何一种方法(x和y坐标或角度和大小)来引用矢量,但是为了方便起见,程序员通常使用坐标符号。例如,在Godot中,原点是屏幕的左上角,因此,要使用一个名为Node2D400像素,向下300像素的2D节点,请使用以下代码:

var node2D = (Node2D) GetNode("Node2D");
node2D.Position = new Vector2(400, 300);

Godot同时支持Vector2和 Vector3的2D和3D使用。本文讨论的相同数学规则适用于两种类型。

会员访问

可以直接通过名称访问向量的各个组成部分。

// create a vector with coordinates (2, 5)
var a = new Vector2(2, 5);
// create a vector and assign x and y manually
var b = new Vector2();
b.x = 3;
b.y = 1;

添加向量

当相加或相减两个向量时,将添加相应的分量:

var c = a + b;  // (2, 5) + (3, 1) = (5, 6)

我们还可以通过在第一个向量的末尾添加第二个向量来直观地看到这一点:

注意,加a + b的结果与b + a相同。

标量乘法

注意

向量代表方向和大小。仅代表幅度的值称为标量。

一个向量可以乘以一个标量:

var c = a * 2;  // (2, 5) * 2 = (4, 10)
var d = b / 3;  // (3, 6) / 3 = (1, 2)

注意

标量乘以向量不会改变其方向,只会改变其大小。这就是缩放向量的方式。

实际应用

让我们看一下向量加法和减法的两种常见用法。

运动

向量可以表示具有大小和方向的任何数量。典型示例是:位置,速度,加速度和力。在此图像中,步骤1的太空飞船的位置矢量为(1,3),速度矢量为(2,1)。速度矢量表示船每步移动多远。我们可以通过将速度添加到当前位置来找到步骤2的位置。

提示

速度测量单位时间的位置变化。通过将速度添加到先前位置来找到新位置。

指向目标

在这种情况下,您有一个坦克,希望将其炮塔指向机器人。从机器人的位置减去水箱的位置即可得出从水箱指向机器人的向量。

提示

要找到一个向量指向A来B使用。B - A

单位向量

大小为的向量1称为单位向量。它们有时也称为方向向量或法线。当需要跟踪方向时,单位矢量会很有用。

正常化

归一化向量意味着将其长度减小到,1同时保留其方向。这是通过将其每个组成部分除以其大小来完成的。因为这是这样一个共同的操作, Vector2并Vector3提供一种用于归一化的方法:

a = a.Normalized();

警告

由于规范化涉及除以向量的长度,因此无法规范化length的向量0。尝试这样做将导致错误。

反射

单位向量的一种常见用法是指示法线。法线向量是垂直于表面对齐并定义其方向的单位向量。它们通常用于照明,碰撞以及涉及曲面的其他操作。

例如,假设我们有一个要从墙或其他物体上反弹的运动球:

表面法线的值为(0,-1),因为它是水平面。 当球碰撞时,我们采取其剩余的运动(当其击中表面时剩余的量)并使用法线反射它。 在Godot中,Vector2类具有bounce()方法来处理此问题。 这是上面使用KinematicBody2D的图的GDScript示例:

// KinematicCollision2D contains information about the collision
KinematicCollision2D collision = MoveAndCollide(_velocity * delta);
if (collision != null)
{var reflect = collision.Remainder.Bounce(collision.Normal);_velocity = _velocity.Bounce(collision.Normal);MoveAndCollide(reflect);
}

点积

该点积是矢量数学最重要的概念之一,但经常被误解。点积是对两个向量返回标量的运算。与既包含幅度又包含方向的向量不同,标量值仅包含幅度。

点积的公式有两种常见形式:

但是,在大多数情况下,最容易使用内置方法。请注意,两个向量的顺序无关紧要:

float c = a.Dot(b);
float d = b.Dot(a); // These are equivalent.

与单位向量一起使用时,点积最有用,这会使第一个公式简化为just cosθ。这意味着我们可以使用点积来告诉我们有关两个向量之间的角度的一些信息:

使用单位矢量时,结果将始终在-1(180°)和1(0°)之间。

面对

我们可以利用这一事实来检测一个对象是否面向另一个对象。在下图中,玩家P试图避开僵尸A和B。假设僵尸的视野为180°,他们可以看到玩家吗?

绿色箭头fA和fB是代表僵尸面向方向的单位矢量,蓝色半圆形代表其视野。 对于僵尸A,我们使用P-A找到指向玩家的方向向量AP并将其标准化,但是Godot有一个辅助方法来执行此操作,称为direction_to。 如果此向量和面对的向量之间的角度小于90°,则僵尸可以看到玩家。

在代码中,它看起来像这样:

var AP = A.DirectionTo(P);
if (AP.Dot(fA) > 0)
{GD.Print("A sees P!");
}

叉积

像点积一样,叉积是对两个向量的运算。但是,叉积的结果是一个向量,向量的方向垂直于两者。其大小取决于它们的相对角度。如果两个向量平行,则其叉积的结果将为空向量。


叉积计算如下:

var c = new Vector3();
c.x = (a.y * b.z) - (a.z * b.y);
c.y = (a.z * b.x) - (a.x * b.z);
c.z = (a.x * b.y) - (a.y * b.x);

使用Godot,您可以使用内置方法:

var c = a.Cross(b);

注意

在交叉产品中,订单至关重要。a.cross(b)与给出的结果不同b.cross(a)。所得的矢量指向相反的方向。

计算法线

叉积的一种常见用法是在3D空间中找到平面或曲面的表面法线。如果我们有三角形,ABC则可以使用矢量减法找到两个边AB和AC。使用叉积, 产生一个垂直于两个方向的向量:表面法线。AB x AC

这是一个计算三角形法线的函数:

Vector3 GetTriangleNormal(Vector3 a, Vector3 b, Vector3 c)
{// find the surface normal given 3 verticesvar side1 = b - a;var side2 = c - a;var normal = side1.Cross(side2);return normal;
}

指向目标

在上面的点积部分,我们看到了如何将其用于查找两个向量之间的角度。但是,在3D中,这还不够。我们还需要知道要旋转的轴。通过计算当前朝向和目标方向的叉积可以发现。所得的垂直向量是旋转轴。

更多信息
有关在Godot中使用向量数学的更多信息,请参见我后续的文章:

进阶向量数学
矩阵与变换

游戏开发中的向量数学相关推荐

  1. Unity游戏开发中的向量运算-点乘和叉乘

    Unity游戏开发中的向量运算-点乘和叉乘 1.点乘: 定义: 又称点积.数量积.标量积.既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解. 公式一: 公式二: 点积 ...

  2. 游戏开发中必备的数学知识(一)——向量

    3D空间中的向量 向量:只有长度和方向,不含有位置信息的量,也就是说,两个向量只要长度和方向相同,则二者相同. 左手坐标系和右手坐标系 同样是三维的坐标系,两者的差别在Z轴上面.在左手坐标系中,Z轴正 ...

  3. 游戏开发中常用的数学知识---矩阵(一)

    在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 矩阵是高等代数学中的常见工具,也常见于统计分 ...

  4. 游戏开发中的进阶向量数学

    游戏开发中的进阶向量数学 飞机 到飞机的距离 远离原点 以2D方式构建平面 飞机的一些例子 3D碰撞检测 更多信息 飞机 点积具有带有单位向量的另一个有趣的属性.想象一下,垂直于该矢量(并通过原点)的 ...

  5. 游戏开发中的数学、向量的应用

    点 数学中的坐标系统(笛卡尔坐标系统) 这里A(0,0), B(1,2), C(4,3), D(–1,2), E(–2,–1), F(3,–2). 计算机中的坐标系统(屏幕坐标系统) 注意这里的y轴在 ...

  6. 游戏开发中的数学和物理算法10-18

    1.标量 标量只有大小没有方向. 2.矢量 矢量既有大小又有方向. 3.常用举例: 物理上常用的矢量与标量的对应概念有:速度和速率:距离和位移等.如图: 距离: 假设A到B的距离为a,B到C的距离为b ...

  7. [Unity游戏开发]向量在游戏开发中的应用(一)

    本文已同步发表在博客园:http://www.cnblogs.com/davidsheh/p/5246213.html ---------------------------------------- ...

  8. 向量在游戏开发中的应用(一)

    向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只知道向量的基本知识,但对于如何将所学到的向量知识运用到实际的游戏开发中却不知所措.我计划写几篇关于向量在游戏中的应用的文章,总结一下在实际工 ...

  9. 矩阵在游戏开发中的应用

    矩阵在游戏开发中的平移变换: 刚开始看3D数学学了矩阵之后并不明白他在游戏中的实际应用到底是怎么回事. 比如(1,0,0)可以表示一个点,也可以表示一个向量,当作为一个点沿x轴平移一个单位之后他的结果 ...

  10. 3D游戏开发中的矩阵详解

    矩阵很多同学没有接触过,所以感觉很难,很复杂,其实只要学过矩阵的同学都知道,矩阵运算并不难.今天我们给大家讲讲游戏开发中的矩阵的运算. 这里有个游戏开发交流小组 大家可以一起来学习交流哦 1:矩阵是什 ...

最新文章

  1. gradle新建工程,多项目依赖,聚合工程
  2. yarn的组成部分_图解YARN工作原理
  3. web前端数组塌陷的解决办法
  4. mac mysql php_Mac搭建php开发环境:Apache+php+MySql
  5. mysql 删除not null_从MySQL的列中删除NOT NULL限制?
  6. centos编译安装LNMP
  7. poj 1985 Cow Marathon 【树的直径】
  8. Windows Driver开发_NT Driver框架:The driver is not in a state to accept this command
  9. 宝藏女孩程序媛,谈谈职场成长这些事
  10. python核心编程
  11. 2019网易雷火笔试编程题
  12. 猿人学第5题,hook任意cookie被设置的瞬间
  13. 测试不同体重体型软件样子的,一种智能体型体重测量仪的设计
  14. Android Studio4.0以上设置护眼背景色
  15. ORACLE函数库大全
  16. 卡尔曼滤波理论小释之卡尔曼增益
  17. 北交大计算机学院教授,北京交通大学计算机与信息技术学院导师教师师资介绍简介-张树君...
  18. 淘宝天猫CTO若海:沉浸式的消费体验是下一步发力方向
  19. 十款入门级微信小程序源码分享之三
  20. PMBOK(第五版)学习笔记 —— 5 项目范围管理

热门文章

  1. bat脚本注释多行_批处理中的行,段注释
  2. 电脑重装系统后如何删除微软商店下载记录
  3. 存储数据使用数据库而不用EXCEL
  4. Android控件全解手册 - 玩转TextView属性
  5. 【Pix4d精品教程】垂直摄影空三加密生成DOM和DSM,并按10m间距提取高程点,生成等高线
  6. 计算机毕业设计jsp酒店管理系统
  7. SPSS基础教程:统计分析前的准备
  8. 利用oc门或od门实现线与_TTL,CMOS,OC门,OD门的理解
  9. AVR单片机学习笔记
  10. 放大器设计-光电放大电路噪声分析-理论