为什么我们需要一个单位vector(换句话说,为什么我们需要归一化vector)?
我正在阅读关于游戏AI的一本书。
正在使用的术语之一是规范化一个vector,这是一个vector变成一个单位。 要做到这一点,你必须将每个尺寸x
, y
和z
除以它的大小。
在我们做任何事情之前,我们必须把vector变成一个单位。 为什么?
任何人都可以给我们一些场景,我们必须使用单位vector?
谢谢!
你不必对vector进行归一化,但是当你这样做的时候,它使得很多方程变得简单一些。 它也可以使API更小:任何forms的标准化都有可能减less必要的function。
这是一个简单的例子。 假设你想find两个向量u和v之间的angular度,如果它们是单位向量,angular度就是arccos(u v)。 如果它们不是单位vector,则angular度是arccos(u v /(| u | | v |))。 在这种情况下,你最终计算u和v的规范。
正如约翰·D·库克所说 – 主要是你这样做,因为你关心的是方向,而不是向量本身。 根据上下文,你很可能不想/不需要大小信息 – 只是方向本身。 你规范化剥离的幅度,这样就不会扭曲其他计算,这反过来简化了许多其他的事情。
就AI而言 – 假设你把P1(AI坏人)和P2(你的英雄)之间的向量V作为坏人移动的方向。 你想让这个坏人以每个节拍N的速度移动 – 你怎么计算的? 那么,我们要么将每个vector的vector归一化,要乘以N来计算它们移动的距离,或者我们首先将方向预先标准化,然后每乘以N单位vector – 否则坏人会移动再远一点的话,就是英雄! 如果英雄不换位置,那就less了一点担心。
在这种情况下,这不是一个大问题 – 但如果你有一百个坏人呢? 还是一千? 如果你的AI需要处理坏人的组合呢? 突然之间,你每节省一百万个正常化。 由于这是less数几个乘法和每个平方根,所以最终达到不提前对数据进行规范化的地步意味着你要杀死你的AI处理速度。
更广泛地说 – 这个math是非常普遍的 – 人们在这里做什么,他们如3D渲染的东西 – 如果你没有统一,例如,你的表面的法线,你可能有数千标准化每渲染是完全不必要的。 您有两个select:一个 – 使每个function执行计算,或者两个 – 预先规范数据。
从框架devise师的angular度来看:后者本质上更快 – 如果我们假设前者,即使用户认为要规范化数据,他们将不得不通过相同的规范化例程,或者你将提供两个每个function的版本,这是一个头痛的问题。 但是,在让人们考虑要调用哪个版本的函数的时候,你也可以让他们足够认真地调用正确的函数,并且首先提供它,使他们做正确的性能。
你经常使vector正常化,因为你只关心vector指向的方向而不是幅度。
一个具体的场景是法线贴图 。 通过将撞击表面的光线与垂直于表面的vector相结合,您可以给出深度的幻觉。 表面的vector定义了平行方向,vector的大小实际上会使计算错误。
在我们做任何事情之前,我们必须把一个载体变成单位。
这个陈述是不正确的。 所有的向量不是单位向量。
构成坐标空间基础的vector具有两个非常好的属性,使它们易于使用:
- 它们是正交的
- 他们是单位向量 – 大小= 1
这使您可以在3D空间中编写任何vector作为单位vector的线性组合:
替代文字latexrender/pictures/e691d8878d3d2cf83362af36faa16096.gif
我可以select把这个向量转换成一个单位向量,如果我需要把每个分量的大小除以
alt text latexrender/pictures/78a0af48a0d02492fdd2b5377157c6a8.gif
如果你不知道坐标空间或基本向量是什么,那么我build议你在进一步学习之前多学习一下graphics的math。