游戏开发中的载体


19

我是编程和游戏编程的新手。我已经阅读了一些关于向量和数学的知识,但是我有一个问题-在游戏编程中应该在哪里使用向量?也许有人可以举一个简单的例子说明您正在使用矢量(在2D模式下)?

我已经找到了示例,但是大多数情况下它们在控制台中,它们在其中输出数字,还有一些我不理解的大示例。


基本TL; DR向量是线性代数主题的一部分,并通往矩阵。使用矩阵和线性代数,您可以编写任何东西,从扫雷求解器到3D世界投影,以查看光标下方是什么对象。对于任何游戏开发人员来说,线性代数都是数学中最有用,最必要的分支。现在学习;你不会后悔的。
罗伯特·马赛利

谢谢大家提供的所有出色答案!但是,为什么像这样的东西在本教程中不使用Vector ?:zetcode.com/tutorials/javagamestutorial还是一个开发人员使用其他否?
vqwer 2011年

很难说,作者可能想对初学者保持简单和基本。
Maik Semder 2011年

实际上作者使用它们,在class Star 这里
Maik Semder 2011年

此外这里Point2D在使用class ResizeRectangle
MAIK Semder

Answers:


31

什么是向量?

向量是不同维度的坐标集。向量中的每个坐标表示向量所在空间方向上的某个绝对位置。

  • 一维向量将为{1}。例如,这可能是X = 1的位置或时间t = 1。
  • 2-D向量将为{-4,3}。例如,这可以是X轴上的-4和Y轴上的3的位置。也可能是X轴后面(-4米)处的温度(3度)。
  • 3-D向量将为{1,2,3}。这可能是在空间1中沿X轴的位置,在空间2中沿Y轴的位置,以及空间3中沿Z轴的位置。或者颜色可以是1红色,2绿色和3蓝色。或者,它可能是在某个时间T({3})上的XY位置({1,2 })。

请注意,在所有情况下,我们都为问题的向量分配了含义。尽管通常会发现游戏中用于几何图形的矢量,但没有理由不能对它们做其他事情。

为什么要使用向量?

首先,您不必使用向量。只要您跟踪x和y或您关心的任何坐标,就可以以某种方式进行。

但是,使用矢量的好处是它们可以整洁地表示诸如方向和位置之类的东西,并且在它们上定义了一些数学运算,可以使您的生活更轻松。

对于这些的简单示例,请考虑点积

假设您在自上而下的游戏中拥有雷达系统。出现在雷达区中的每个敌人(2D中为一些饼形楔形物)都应该在屏幕上出现一个小红点。因此,您需要确定雷达部分中有哪些敌人。

您可以测试敌人是否在三角形内。您还可以测试是否在确定雷达扇区两侧的平面/线的两个半空间的交点中包含了敌人。

或者,您可以只使用点积进行检查。这是如何做:

  1. 创建从雷达中心到“雷达前端”的矢量。标准化它。
  2. 创建一个从雷达中心到要检查其雷达可见性的对象的向量。标准化它。
  3. 取两个归一化向量的点积。
  4. 取该产品的反余弦,并检查其是否小于雷达宽度角度的一半。如果是,请绘制一个点。

这非常方便,现在还可以让您轻松地将雷达指向不同的方向(只需更改前向矢量)并具有不同的宽度(只需更改雷达宽度角度),并且在这些情况下您也可以重复使用相同的代码!

为什么还要使用向量?

如果您使用2D模式,则实现复杂效果和运动(旋转,缩放等)的最佳方法可能是使用场景图。行星有轨道飞船,该船有轨道无人机。不使用向量数学的计算非常丑陋。

使用矢量数学,我们将每个表示为具有一个点和一个3x3变换矩阵。行星使用其变换,船使用其变换和行星的变换,而无人机使用其变换以及船的变换和行星的变换。

当行星移动时,您更改其变换,船和无人机将自动“免费”定位。更清晰的代码。

仍然不服气。 向量还是几乎所有图形库(当然还有OpenGL和DirectX)所使用的位置,几何形状和运动的本地表示形式。您不必使用它们就不可能逃脱。

结论 向量是编写清晰代码的强大工具,可以清晰,优雅地解决几何问题。


14

2D示例是屏幕坐标,它标识屏幕上的像素,并具有x分量和y分量[x,y],即屏幕左上方的位置[0,0]

另一个示例:想象一个文本从右屏幕边框滚动到左屏幕边框。现在,您需要以像素/秒为单位定义滚动文本的速度,即[-20,0],这意味着文本每秒向左滚动20个像素,并且永远不会改变高度。

另一个更高级的示例:想象一个2D游戏,该游戏应该在800x600、1024x768等不同的屏幕分辨率下运行。可以通过内部使用0.0到1.0的屏幕宽度和0.0到1.0的高度在内部将游戏逻辑解耦来轻松地完成此操作。从实际的屏幕分辨率。现在,当您绘制到屏幕上时,只需将内部矢量与分辨率矢量相乘即可:

screen_pos = internal_pos * screen_ressolution

注意,这里的所有3个变量都是2D向量,它们具有x分量和y分量,即对于此internal_pos [0.5,0.25]:

[400, 150] = [0.5, 0.25] * [800, 600]

因此内部位置[0.5,0.25]被转换为实际屏幕位置[400,150]

这是基本的东西。向量的真正优势是在线性代数中的应用,您可以使用矩阵来变换顶点(旋转,缩放,镜像等),即轻松地将所有内部位置旋转90度,或者您必须将屏幕Y换成屏幕顶部到底部的位置0,因为您使用的第三方库使用此约定。


向量不是单个维数组,如某种列表吗?当我们谈论屏幕分辨率时,我们不是在谈论多维数组(每个X和Y轴一个坐标)吗?只是为了确保此处不将“向量”与矩阵混淆。=)
Will Marcouiller

@可以将屏幕的完整像素数据视为多维数组,基本上是位图,但是宽度和高度的值,换句话说就是分辨率,就不能了
Maik Semder 2011年

2
请注意,在数学和编程中,向量常常被完全不同地对待。从数学上讲,向量不是多维数组,尽管它的某些方面的组成部分共同定义了这种数组。向量本身是坐标不变的。该操作screen_pos = internal_pos * screen_resolution坐标不变您已写入它的方式,它可以更适当地写入screen_pos = map_to_screen * internal_pos,其中,map_to_screen是的线性映射(其可以被写为一个矩阵,在这种情况下的对角一个)。
大约


1

向量是既具有值又具有方向的实体。现实世界和基于物理的游戏中矢量的示例包括速度和动量。仅具有值但没有方向的属性称为标量,包括位置,质量,密度等。

对于模拟类似于矢量的物理属性(如上所述,速度,加速度等)的游戏,需要使用矢量。用于矢量计算的数学称为线性代数


速度是一个标量,它是速度矢量的长度
Maik Semder 2011年

正确-已修复
Eran Galperin

1
并且位置通常被视为向量,距离就是标量。
Ali1S232 2011年

位置既可以视为标量(或标量的集合),也可以视为从轴起点指向的向量。
伊兰·加珀林

1

在每个维都有数字表示某物的任何地方,这些数字的集合都可以视为向量。位置,速度和加速度是向量的主要示例。在某些情况下,将面对的方向表示为向量也是可行的。

对于基本的东西,是否将这些数字视为向量并不重要,但是,如果您想进行任何形式的物理学,则应研究向量数学。


位置不是向量
伊兰加尔佩林

速度也不是标量,速度也不是矢量
Maik Semder 2011年

2
@Eran Galperin我知道在数学家中这是一个相当普遍的观点。然而,一个点及其对应的位置向量之间的区别是相当学术的。没有实际理由对此做文章。
aaaaaaaaaaaaaa

1
有实际的原因,一旦使用4D均匀坐标和矩阵,必须进行区分。尽管与该问题的范围无关。
Maik Semder 2011年

@eBusiness这不是事实,而是事实。而且我是受过教育的物理学家,而不是数学家。
伊兰·加珀林

0

很简单,在游戏中到处都是具有位置或方向的任何事物,它们都使用矢量。向量就像一个点

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

然而,真正的区别在于这一点。点只是点,而矢量是箭头。

如果你有

Point2.x = 5;

Point2.y = 10;

您的意思是我在这个位置x 5和y 10。

但是,当您声明向量时...

Vector2.x = 5;

Vector2.y = 10; 

您的说法是说从0,0到x 5,y 10的箭头;

您甚至可以让向量指向的点成为任意位置的空间点,例如,让我们使用一个点和一个向量来移动对象,我们将使用Point2来存储其位置,并使用一个vector2来将其移动。

point2.x = 10;

point2.y = 15;

现在您可以使用向量移动该点,假设我们要将此点沿x轴向上移动10个单位,这样您就可以

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

现在,点已移动到矢量箭头指示的位置。

现在的重点是

point2.x = 20;

point2.y = 15;

最后要注意的一点是,有时矢量就像点一样使用,反之亦然,因为它们保存相同类型的数据。


向量。这是从原点到P点的矢量
共产党鸭

1
@Duck从技术上讲是不正确的,指的是同质坐标,可以通过从position_point中减去origin_point来找到矢量,但这并不会使它们相等:v = pos - origin因此,v != pos因为原点是一个点{0, 0, 0, 1}
Maik Semder 2011年

@Duck:一个点是不是一个向量而是一个点和原点定义一个载体,它是刚刚好,因为大部分的时间,如果你的起源是0

@Duck那么您为什么称其为P点呢?哈哈
EddieV223 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.