为什么单位vector显示方向?

如果我有两个对象,A人和B人,我想知道B人是否面向与A人相同的方向; 一旦我有向量,我怎样使用归一化的向量来显示方向?


我已经阅读了关于向量的math,但是我仍然在学习,我不了解单位向量如何显示方向。 我知道,但我不知道为什么。

有人说他们在单位圈子里想象。 我明白这是如何performance出一个方向的,但是我不明白的是归一化的向量是如何显示出一个方向的。

我已经看到“ 什么是方向vector,为什么要正常化? ”,但我仍然错过了它。

首先我们得到一个从B到A的向量,如下图所示:

从B到A的向量

现在我们有一个向量,告诉我们如何从B到A完全确定。在代码中,它看起来像这样:

var BtoA = A - B; 

在上图的情况下,得到的vector是X:15 Y:-20 。 在这一点上,我们实际上已经知道方向,因为它包含在如何从B到A的信息中。然后,如果我们只需要知道方向,就可以通过规范化我们得到的向量来得到:

 var direction = normalize(BtoA); 

规范化vector这样做:

 vec2 normalize(vec2 v) { return v / sqrt(vx * vx + vy * vy); } 

要分解它,首先我们得到毕达哥拉斯定理的vector长度(又名幅度),你可能在学校学到了这个定理 。 在得到vector的长度之后,我们把原始vector除以它自己的长度,使它成为一个单位vector。 换句话说,我们将BtoA的长度BtoA为一个,这使得它成为一个单位向量。

现在我们有一个方向vector,如下所示:

单位矢量

结果单位vector是X:0.6 Y:-0.8 。 如果你想确定,你可以检查它的长度,这应该是1:

 var v = vec2(0.6, -0.8); var length = sqrt(vx * vx + vy * vy); print(length); // Should print 1 

现在在这一点上,我们从BtoA向量归一化得到的单位向量现在就是从B点指向A的方向。

基本上我们只把BtoA向量的长度减less到1,这就是为什么它只是从B的角度指向A的方向。

然后,如你所问,如何弄清楚人B是否面向与人A相同的方向,你需要知道人B和A的方向。你不能通过计算从B到A的方向。

B的定位

通过首先计算B的方向向量来find方向,如果具有B的旋转角度,则可以计算该方向向量:

 var rotation = 1.5708; // 90 degrees in radians, radians are easier in code var orientationVec = vec2(sin(rotation), cos(rotation)); 

B的方向向量

现在方向vector应该是X:0 Y:1 ,因为它是90度角的。 现在我们有了B的方向,我们可以通过检查点积来检查它是否面向A:

 var facing = dot(direction, orientationVec); if(facing > 0) print("Yes, the B vector is roughly facing A"); 

那么什么是点积 ? 它看起来像这样:

 float dot(vec2 a, vec2 b) { return ax * bx + ay * by; } 

点积具有告诉两个单位向量是否平行的属性,如果不是它们有多less不同。 如果点积是1,则两个单位vector正好指向相同的方向。 如果它是0,则单位vector彼此垂直。 因此,任何大于0的值都意味着单位vector的走向大致相同。

点积

当然,使用0作为确定B是否面向A的阈值在这里有点不对,因为你正在谈论一个人。 如果你定义一个人面对另一个人的方向是在90度范围内,你可以检查面值是否大于0.5,这可能会给出更好的结果。 你也可以定义一个人正在面对另一个人,只有当他们正在看另一个,然后要求你使用一个非常接近1的值。

所以把它放在一起:

 bool IsBFacingA(vec2 A, vec2 B, float bRotation, float tolerance) { var BtoA = A - B; var dir = normalize(BtoA); var orientation = vec2(sin(bRotation), cos(bRotation); var facing = dot(dir, orientation); return facing >= tolerance; } 

现在你可以知道B是否面向A.它需要比从B到A的标准化方向多一点。

但是这仍然不能回答你的问题。

您可以使用所有这些信息来确定A和B是否面向相同的方向,方法是获取A和B的方向并将其与点积进行比较。 喜欢这个:

 bool IsBFacingTheSameDirectionAsA(float aRotation, float bRotation, float tolerance) { var aOrientation = vec2(sin(aRotation), cos(aRotation); var bOrientation = vec2(sin(bRotation), cos(bRotation); var facing = dot(aOrientation , bOrientation ); return facing >= tolerance; } 

在那里,你走了,这就是你如何确定A和B是否面临相同的方向。