2012-04-03 84 views
18

尝试多了解一些向量。正则化矢量需要什么?

归一化矢量需要什么?

如果我有一个向量,N =(X,Y,Z)

什么你真的当你规范化得到它 - 我让你必须分配X /理念| N | Y/| N | & z/| N |。我的问题是,为什么我们要做这件事,我的意思是我们从这个等式中得到什么?

这样做的意义或'内部'的目的是什么。

有一点数学问题,我很抱歉,但我在这个话题中并不清楚。

回答

4

这有点像问我们为什么要乘以数字。它一直出现。

我们使用的笛卡尔坐标系是一个正交基(由相互正交的长度为1的向量组成,基表示任何向量可以由这些向量的唯一组合表示),当您想要旋转你的基础(当你环顾四周时发生在视频游戏机制中)你使用行和列是正交向量的矩阵。

只要你开始在线性代数中使用矩阵,你就会想要正交向量。有太多的例子来命名它们。

在这一天结束时,我们并不需要标准化向量(以同样的方式,因为我们不需要汉堡包,我们可以生活在没有他们,但谁去?),但类似的v/|v|模式经常出现,人们决定给它一个名称和一个特殊的符号(一个向量意味着它是一个标准化的向量)作为捷径。标准化向量(也称为单位向量)基本上是生活中的一个事实。

+0

辉煌。非常感谢。现在我有了更好的理解。矩阵表示法帮助了很多! :) – HungryCoder 2012-04-04 18:44:59

+0

正常化的优点是什么? – 2017-05-19 06:12:51

+1

@StanlyMoses一个向量可以被认为是两个部分 - 一个方向和一个大小。通过将矢量除以它的大小,我们只保留方向分量并丢弃幅度。例如,<1,1>和<2,2>等价。这对许多操作(如投影)很有用。 – Shuklaswag 2017-06-04 17:36:28

0

您正在使其长度为1 - 找到指向相同方向的单位矢量。

这对于各种目的很有用,例如,如果您将单位矢量的矢量的点积乘以单位矢量方向上该矢量的分量的长度。

1

法线应该只用作方向矢量。它们用于照明计算,这需要归一化的法向量。

29

对于任何矢量V = (x, y, z),|V| = sqrt(x*x + y*y + z*z)给出了矢量的长度。

当我们规范化一个向量时,我们实际计算了V/|V| = (x/|V|, y/|V|, z/|V|)

这是很容易看到,归一化的向量具有长度1。这是因为:

| V/|V| | = sqrt((x/|V|)*(x/|V|) + (y/|V|)*(y/|V|) + (z/|V|)*(z/|V|)) 
      = sqrt(x*x + y*y + z*z)/|V| 
      = |V|/|V| 
      = 1 

因此,我们可以调用归一化的向量为单位向量(即,与单位长度矢量)。

任何矢量在归一化时只会改变其大小,而不会改变其方向。而且,每个指向相同方向的矢量都被归一化为相同的矢量(因为大小和方向唯一定义了一个矢量)。因此,单位矢量对于提供指导非常有用。

但请注意,以上所有讨论都是针对三维笛卡尔坐标(x, y, z)。但是,笛卡尔坐标究竟意味着什么?原来,为了在3D空间中定义一个矢量,我们需要一些参考方向。这些参考方向通常被称为i,j,k(或者i,j,k,其上带有小帽子 - 称为“i帽子”,“j帽子”和“k帽子”)。任何我们认为为V = (x, y, z)的矢量实际上可以写为V = xi + yj + zk。 (注意:我不再用大写字母打电话给他们,我只是称他们为i,j,k)。 i,j和k是X,Y和Z方向上的单位矢量,它们形成一组相互正交的单位矢量。它们是所有笛卡尔坐标几何的基础。

还有其他形式的坐标(如圆柱坐标和球坐标),虽然它们的坐标不是直接理解为(x, y, z),但它们也由一组3个相互正交的单位矢量组成,这3个坐标相乘以产生矢量。

因此,上述讨论清楚地表明,我们需要单位向量来定义其他向量,但为什么要关心?

因为有时候,只有量级很重要。那就是当你使用一个“常规”数字(类似于4或1/3或3.141592653 - 不会,因为你所有的OCD怪胎,我都不会把Pi放在那里 - 它应该保留一个终止小数,只是因为我是邪恶的化身)。你不希望抛出麻烦的方向,是吗?我的意思是说,我想要4公斤的西瓜面向西方吗?除非你是疯狂的狂热者,当然。

其他时间,只有方向很重要。你只是不在乎这个数量级,或者这个数量级太大而无法衡量(像无限的东西,只有没有人真的知道无穷无尽 - 所有的冰雹无限大,因为他有无限的无限......对不起,有一点被带走了)。在这种情况下,我们使用向量的归一化。例如,说我们有一条面向北4公里的线路并不意味着什么。说我们有一条面向北方的路线更有意义。那么你做了什么?你摆脱了4公里。你破坏了这个数量。你剩下的只有北方(和冬天来了)。经常这样做,你必须给你的名字和记号。你不能把它称为“忽略数量级”。这太过分了。你是一个数学家,所以你称之为“规范化”,并且给它一个“帽子”的符号(可能是因为你想参加一个派对而不是被媒介卡住)。

顺便说一句,因为我提到的直角坐标系,这里的强制性XKCD:XKCD

+1

非常有帮助。给出正常化重要性的清晰画面。 – 2017-04-21 05:38:44

+2

比接受的答案好得多。 – 2017-05-11 20:17:48

+1

这是一个非常好的解释。事实上,我总是喜欢这类问题,因为它产生了这样的答案,而且这里的一些人总是自己解释行话而不解释为什么被称为“为什么”。我是开发者,被jargons(我根本不在乎)所困扰,但有时候有一点他们的命名原因对我来说更重要。例如(Espresso单元测试中的意向vs预期方法)和(反应中的map vs flatMap方法)。 – 2017-06-02 15:12:31

8

阅读Godot Game Engine
documentation about unit vector,标准化和积真的有很大的意义。这里是文章:

单位载体 好的,所以我们知道什么是矢量。它有一个方向和规模。我们也知道如何在Godot中使用它们。下一步是学习单位向量。任何幅度为1的矢量都被认为是一个单位矢量。在2D中,想象绘制一个半径为1的圆。该圆包含所有存在2维的单位矢量:

enter image description here 那么,单位矢量有什么特别之处呢?单位向量是惊人的。换句话说,单位向量有几个非常有用的属性。

迫不及待地想知道更多关于单位矢量的奇妙属性,但一次只能一步。那么,如何从一个正则矢量创建一个单位矢量?

标准化 取任何矢量并将其大小减小到1.0,同时保持其方向称为标准化。归一化是通过其幅度除以向量的x和y(和z在3D)组件来执行:

var a = Vector2(2,4) 
var m = sqrt(a.x*a.x + a.y*a.y) 

AX/=米 AY/=米 你可能已经猜到,如果载体具有幅度0(意思是,它不是一个矢量,而是起源也称为空矢量),除以零发生,宇宙经历第二次大爆炸,除了反极性和后退。因此,人类是安全的,但戈德将打印一个错误。记得!矢量(0,0)不能正常化!

当然,Vector2的Vector3和已经提供了一种方法来做到这一点:

a = a.normalized() 

点产品 OK,点积矢量数学中最重要的组成部分。没有dot产品,Quake将永远不会被制造出来。这是本教程中最重要的部分,因此请确保正确掌握它。大多数试图理解矢量数学的人会放弃这里,因为尽管它有多简单,但他们无法从中得到头或尾。为什么?这里的原因,那是因为...

点积需要两个向量,并返回一个标:

var s = a.x*b.x + a.y*b.y 

是,相当多的是。从向量a乘以x从向量b乘以x。对y做同样的事情并将其加在一起。在3D中它几乎是相同的:

var s = a.x*b.x + a.y*b.y + a.z*b.z 

我知道,这是完全没有意义的!你甚至可以用内置函数来做:

var s = a.dot(b) 两个向量的顺序无关紧要,a.dot(b)返回的值与b.dot(一个)。

这是绝望的开始和书籍和教程告诉你这个公式:

enter image description here 而你知道是时候放弃制作的3D游戏或复杂的2D游戏。怎么能这么简单如此复杂?其他人将不得不作出下一个塞尔达或使命召唤。毕竟,自上而下的角色扮演游戏看起来并不那么糟糕。是的,我听到有人在蒸汽上做了一个漂亮的愿望...

所以这是你的时刻,这是你闪耀的时刻。不要放弃!在这一点上,本教程将突然转向,重点介绍dot产品的用途。这是,为什么它是有用的。我们将逐一关注dot产品的用例以及实际应用。没有更多的公式没有任何意义。一旦你了解了他们的用途,公式就会有意义。

壁板 dot产品的第一个有用的和最重要的属性是检查什么东西正在看。让我们想象我们有任何两个向量,a和b。任何方向或大小(不是起源)。无论它们是什么,但让我们想象我们计算它们之间的点积。该操作将返回单个浮点数(但由于我们在矢量世界中,我们称它们为标量,从现在开始将继续使用该术语)。这个数字会告诉我们以下几点:

如果数字大于零,两个都朝同一个方向(它们之间的角度是<90度)。 如果数字小于零,则两个方向都朝相反方向(它们之间的角度大于90度)。 如果数字为零,则矢量的形状为L(它们之间的角度为90°)。 enter image description here 那么让我们来考虑一个真实的用例场景。想象一下,蛇正在经过一片森林,然后附近有一个敌人。我们如何快速判断敌人是否见过发现的蛇?为了发现他,敌人必须能够看到蛇。比方说,那么:

蛇是在位置A 敌人处于位置B. 敌人面朝的方向向量F.

enter image description here 所以,让我们创建一个新的载体巴曙松认为云从保护装置(B),以蛇(A),减去二:

变种BA = A - B enter image description here 理想的情况下,如果保护正在寻找奔蛇,使眼对眼的接触,它会沿与矢量BA相同的方向进行。

如果F和BA之间的点积大于0,则会发现Snake。发生这种情况是因为我们可以告诉守卫面对他:

if (BA.dot(F) > 0): 
    print("!") 

似乎蛇目前是安全的。好吧,现在我们知道两个向量之间的点积可以让我们知道他们是朝向同一侧,相反侧还是正好相互垂直。

这与所有载体相同,无论幅度如何,单位向量不是例外。但是,使用与单位向量相同的属性会产生更有趣的结果,因为会添加一个额外的属性:

如果两个向量都朝向完全相同的方向(彼此平行,它们之间的角度为0°) ,得到的标量为1.如果两个矢量都朝向相反的方向(相互平行,但它们之间的角度为180°),则得到的标量为-1。 这意味着单位矢量之间的点积始终在1和-1的范围之间。所以再次...

如果他们的角度是0°点积是1. 如果他们的角度是90°,那么点积是0. 如果他们的角度是180°,那么点积是-1。 呃..这是奇怪的熟悉...看到这之前...哪里?

让我们拿两个单位向量。第一个是太朝上,第二,但我们将它从最多(0°)倒(180°度)一路旋转...

enter image description here 虽然绘制所产生的标量!

enter image description here 啊哈!这一切都有道理,这是一个余弦函数!

我们可以这么说,那么,作为一个规则...

两个单位向量的内积是这两个向量之间的夹角的余弦值。因此,为了获得两个矢量之间的角度,我们必须这样做:

var angle_in_radians = acos(a.dot(b)) 

这是什么有用的?直接获得角度可能不是很有用,但只能说出角度对于参考很有用。一个例子是在Kinematic Character演示中,当角色向某个方向移动时,我们碰到了一个物体。如何判断我们碰到的是底板?

通过比较碰撞点的法线与以前计算的角度。

这样做的好处在于,相同的代码工作原理完全相同,无需在3D中进行修改。矢量数学很大程度上与维度无关,因此添加或移除轴只会增加复杂度。