我是编程和游戏编程的新手。我已经阅读了一些关于向量和数学的知识,但是我有一个问题-在游戏编程中应该在哪里使用向量?也许有人可以举一个简单的例子说明您正在使用矢量(在2D模式下)?
我已经找到了示例,但是大多数情况下它们在控制台中,它们在其中输出数字,还有一些我不理解的大示例。
class Star
这里
我是编程和游戏编程的新手。我已经阅读了一些关于向量和数学的知识,但是我有一个问题-在游戏编程中应该在哪里使用向量?也许有人可以举一个简单的例子说明您正在使用矢量(在2D模式下)?
我已经找到了示例,但是大多数情况下它们在控制台中,它们在其中输出数字,还有一些我不理解的大示例。
class Star
这里
Answers:
什么是向量?
向量是不同维度的坐标集。向量中的每个坐标表示向量所在空间方向上的某个绝对位置。
请注意,在所有情况下,我们都为问题的向量分配了含义。尽管通常会发现游戏中用于几何图形的矢量,但没有理由不能对它们做其他事情。
为什么要使用向量?
首先,您不必使用向量。只要您跟踪x和y或您关心的任何坐标,就可以以某种方式进行。
但是,使用矢量的好处是它们可以整洁地表示诸如方向和位置之类的东西,并且在它们上定义了一些数学运算,可以使您的生活更轻松。
对于这些的简单示例,请考虑点积。
假设您在自上而下的游戏中拥有雷达系统。出现在雷达区中的每个敌人(2D中为一些饼形楔形物)都应该在屏幕上出现一个小红点。因此,您需要确定雷达部分中有哪些敌人。
您可以测试敌人是否在三角形内。您还可以测试是否在确定雷达扇区两侧的平面/线的两个半空间的交点中包含了敌人。
或者,您可以只使用点积进行检查。这是如何做:
这非常方便,现在还可以让您轻松地将雷达指向不同的方向(只需更改前向矢量)并具有不同的宽度(只需更改雷达宽度角度),并且在这些情况下您也可以重复使用相同的代码!
为什么还要使用向量?
如果您使用2D模式,则实现复杂效果和运动(旋转,缩放等)的最佳方法可能是使用场景图。行星有轨道飞船,该船有轨道无人机。不使用向量数学的计算非常丑陋。
使用矢量数学,我们将每个表示为具有一个点和一个3x3变换矩阵。行星使用其变换,船使用其变换和行星的变换,而无人机使用其变换以及船的变换和行星的变换。
当行星移动时,您更改其变换,船和无人机将自动“免费”定位。更清晰的代码。
仍然不服气。 向量还是几乎所有图形库(当然还有OpenGL和DirectX)所使用的位置,几何形状和运动的本地表示形式。您不必使用它们就不可能逃脱。
结论 向量是编写清晰代码的强大工具,可以清晰,优雅地解决几何问题。
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,因为您使用的第三方库使用此约定。
screen_pos = internal_pos * screen_resolution
是不坐标不变您已写入它的方式,它可以更适当地写入screen_pos = map_to_screen * internal_pos
,其中,map_to_screen
是的线性映射(其可以被写为一个矩阵,在这种情况下的对角一个)。
在Wolfire Games博客上,这是游戏开发中向量的绝佳解释:
http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
向量是既具有值又具有方向的实体。现实世界和基于物理的游戏中矢量的示例包括速度和动量。仅具有值但没有方向的属性称为标量,包括位置,质量,密度等。
对于模拟类似于矢量的物理属性(如上所述,速度,加速度等)的游戏,需要使用矢量。用于矢量计算的数学称为线性代数。
在每个维都有数字表示某物的任何地方,这些数字的集合都可以视为向量。位置,速度和加速度是向量的主要示例。在某些情况下,将面对的方向表示为向量也是可行的。
对于基本的东西,是否将这些数字视为向量并不重要,但是,如果您想进行任何形式的物理学,则应研究向量数学。
很简单,在游戏中到处都是具有位置或方向的任何事物,它们都使用矢量。向量就像一个点
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;
最后要注意的一点是,有时矢量就像点一样使用,反之亦然,因为它们保存相同类型的数据。
v = pos - origin
因此,v != pos
因为原点是一个点{0, 0, 0, 1}