我正在读一本关于游戏AI的书.
正在使用的术语之一是规范化矢量,该矢量将矢量转换为单位.要做到这一点,您必须将每个维度x
,y
并z
通过它的大小.
在我们对它做任何事情之前,我们必须把矢量变成一个单元.为什么?
任何人都可以给出一些我们必须使用单位向量的场景吗?
谢谢!
你不必对矢量进行标准化,但是当你这样做时,它会使很多方程变得更简单.它还可以使API更小:任何形式的标准化都有可能减少必要的功能.
这是一个简单的例子.假设您想要找到两个向量u和v之间的角度.如果它们是单位向量,则角度只是arccos(u v).如果它们不是单位矢量,则角度为arccos(u v /(| u | | v |)).在这种情况下,无论如何,你最终都要计算u和v的规范.
正如John D. Cook所说 - 主要是你这样做是因为你关心方向,而不是矢量本身.根据具体情况,您很可能不希望/需要幅度信息 - 只需要方向本身.您可以标准化以消除幅度,以便它不会扭曲其他计算,从而简化了许多其他事情.
就人工智能而言 - 想象一下你把P1(AI坏人)和P2(你的英雄)之间的向量V作为坏人移动的方向.你希望坏人以每节拍的速度N移动 - 你怎么计算这个?好吧,我们要么将每个节拍的矢量标准化,乘以N来计算它们移动了多远,或者我们首先将方向预先标准化,然后每次将单位矢量乘以N - 否则坏人会移动如果它离英雄更远!如果英雄没有改变位置,那么担心的计算就少了一个.
在这种情况下,这不是什么大不了的事 - 但如果你有一百个坏人呢?还是一千?如果你的AI需要处理坏人的组合怎么办?突然间,你每节拍节省了一百或几千个标准化.由于这是少数乘法和每个的平方根,最终你会达到不提前规范化数据的意义,这意味着你要杀死你的AI处理率.
更广泛地说 - 数学对此非常普遍 - 人们在这里做他们为3D渲染做的事情 - 如果你没有统一,例如,表面的法线,你可能每次渲染有数千个标准化完全没必要.您有两个选择:一个 - 让每个函数执行计算,或者两个 - 预先标准化数据.
从框架设计者的角度来看:后者本质上更快 - 如果我们假设前者,即使您的用户想要规范化数据,他们也必须经历相同的规范化程序或者您将提供两个每个功能的版本,这是一个令人头疼的问题.但是,当你让人们考虑要调用哪个版本的函数时,你也可以让他们足够好地调用正确的函数,并且只在第一时间提供它,使它们为性能做正确的事情. .
您经常对矢量进行标准化,因为您只关心矢量指向的方向而不是幅度.
具体方案是法线贴图.通过组合照射表面的光线和垂直于表面的矢量,您可以给出一种深度的幻觉.来自曲面的矢量定义了平行方向,矢量的大小实际上会使计算错误.
在我们做任何事情之前,我们必须将矢量转换为单位.
这个说法不正确.所有向量都不是单位向量.
构成坐标空间基础的向量具有两个非常好的属性,使它们易于使用:
他们是正交的
它们是单位向量 - 幅度= 1
这使您可以将3D空间中的任何矢量写为单位矢量的线性组合:
替代文字http://www.equationsheet.com/latexrender/pictures/e691d8878d3d2cf83362af36faa16096.gif
如果需要将每个分量除以幅度,我可以选择将此向量转换为单位向量
替代文字http://www.equationsheet.com/latexrender/pictures/78a0af48a0d02492fdd2b5377157c6a8.gif
如果您不知道坐标空间或基础向量,我建议您在进一步学习之前学习更多有关图形数学的知识.