计算两个向量之间的角度
Calculating the angle between two vectors
如果尝试在互联网上搜索但找不到答案。
我正在尝试计算从第一个向量看到的两个向量之间的角度。
因此,如果向量 1 位于 0,0,向量 2 位于 1,1,则航向将为 45。
1,0 为 90。
在 -1,0 时为 270。
有没有简单的解决方案来创建这个?
我无法在 atm 上测试它,但这应该可以:
double getHeading(Vector2 a, Vector2 b)
{
double x = b.x - a.x;
double y = b.y - a.y;
return Math.Atan2(y, x) * (180 / Math.PI);
}
这不是 Unity,这是一道数学题。
您需要使用向量 dot multiplication. It's built into unity and equals the product of the lengths of the vectors multiplied by the cosine of the angle between them, so you easily get the angle between the vectors out of it. Of course, unity has a built-in function for that。
由于每帧都会执行大量涉及矢量的操作,因此了解您所用代码的性能影响会有所帮助 运行。可悲的是,这个问题的其他解决方案在计算上更加复杂。另外,请记住,您通常不需要角度本身:角度的余弦实际上很容易处理。
当然,这个答案不包括270度的情况。但是,对于这种应用程序,Quaternions 更合适。基本上,270 的情况要求你知道 up 向量来计算它,而向量本身(作为数学抽象)不包含该信息——所以,在数学层面上,你不会'有什么方法可以区分它们之间有 270 度和 90 度的矢量。
因此,如果您真的需要 270 外壳,create quaternions from the vectors (by the way, you can see that up vector is a distinct piece of information here) and then calculate the angle between them。与矢量不同,创建四元数是为了处理旋转和方向,而 Unity 具有为此实现的所有功能。
非常感谢您的回复,我决定进行人工计算。
对于在我之后发现这个问题的人,我是这样做的:
double calculateHeading(Transform target){
double newHeading = 0;
Vector3 vectorToTarget = target.position - transform.position;
double x = vectorToTarget.x;
double y = vectorToTarget.y;
if (x == 0 && y > 0) {
newHeading = 0;
} else if (x == 0 && y < 0) {
newHeading = 180;
} else if (x > 0 && y == 0) {
newHeading = 90;
} else if (x < 0 && y == 0) {
newHeading = 270;
} else if (y < 0) {
newHeading = 180 + (Mathf.Rad2Deg * Mathf.Atan (vectorToTarget.x / vectorToTarget.y));
} else if (y > 0) {
newHeading = 360 + (Mathf.Rad2Deg * Mathf.Atan (vectorToTarget.x / vectorToTarget.y));
}
if (newHeading > 360) {
newHeading -= 360;
} else if (newHeading < 0) {
newHeading += 360;
}
return newHeading;
}
伙计,你试过使用google吗?我只是 googled "unity angle between two vectors" 并找到了官方文档。
https://docs.unity3d.com/ScriptReference/Vector3.Angle.html
var angle = Vector3.Angle(Vector3 from, Vector3 to);
或者你的情况
var angle = Vector2.Angle(Vector2 from, Vector2 to);
给定一个偏移向量(例如相对于 0,0,0)
float resultInDegrees = (360 + Mathf.Atan2(rotateVector.x, rotateVector.z) * (180 / Mathf.PI)) % 360;
请注意,我们要加上 360 并取模数,否则你会得到 0 - 180,然后是负角。这会将 -1 度转换为 359 度,正如原始发帖者所要求的.
如果尝试在互联网上搜索但找不到答案。
我正在尝试计算从第一个向量看到的两个向量之间的角度。
因此,如果向量 1 位于 0,0,向量 2 位于 1,1,则航向将为 45。
1,0 为 90。
在 -1,0 时为 270。
有没有简单的解决方案来创建这个?
我无法在 atm 上测试它,但这应该可以:
double getHeading(Vector2 a, Vector2 b)
{
double x = b.x - a.x;
double y = b.y - a.y;
return Math.Atan2(y, x) * (180 / Math.PI);
}
这不是 Unity,这是一道数学题。
您需要使用向量 dot multiplication. It's built into unity and equals the product of the lengths of the vectors multiplied by the cosine of the angle between them, so you easily get the angle between the vectors out of it. Of course, unity has a built-in function for that。
由于每帧都会执行大量涉及矢量的操作,因此了解您所用代码的性能影响会有所帮助 运行。可悲的是,这个问题的其他解决方案在计算上更加复杂。另外,请记住,您通常不需要角度本身:角度的余弦实际上很容易处理。
当然,这个答案不包括270度的情况。但是,对于这种应用程序,Quaternions 更合适。基本上,270 的情况要求你知道 up 向量来计算它,而向量本身(作为数学抽象)不包含该信息——所以,在数学层面上,你不会'有什么方法可以区分它们之间有 270 度和 90 度的矢量。
因此,如果您真的需要 270 外壳,create quaternions from the vectors (by the way, you can see that up vector is a distinct piece of information here) and then calculate the angle between them。与矢量不同,创建四元数是为了处理旋转和方向,而 Unity 具有为此实现的所有功能。
非常感谢您的回复,我决定进行人工计算。 对于在我之后发现这个问题的人,我是这样做的:
double calculateHeading(Transform target){
double newHeading = 0;
Vector3 vectorToTarget = target.position - transform.position;
double x = vectorToTarget.x;
double y = vectorToTarget.y;
if (x == 0 && y > 0) {
newHeading = 0;
} else if (x == 0 && y < 0) {
newHeading = 180;
} else if (x > 0 && y == 0) {
newHeading = 90;
} else if (x < 0 && y == 0) {
newHeading = 270;
} else if (y < 0) {
newHeading = 180 + (Mathf.Rad2Deg * Mathf.Atan (vectorToTarget.x / vectorToTarget.y));
} else if (y > 0) {
newHeading = 360 + (Mathf.Rad2Deg * Mathf.Atan (vectorToTarget.x / vectorToTarget.y));
}
if (newHeading > 360) {
newHeading -= 360;
} else if (newHeading < 0) {
newHeading += 360;
}
return newHeading;
}
伙计,你试过使用google吗?我只是 googled "unity angle between two vectors" 并找到了官方文档。
https://docs.unity3d.com/ScriptReference/Vector3.Angle.html
var angle = Vector3.Angle(Vector3 from, Vector3 to);
或者你的情况
var angle = Vector2.Angle(Vector2 from, Vector2 to);
给定一个偏移向量(例如相对于 0,0,0)
float resultInDegrees = (360 + Mathf.Atan2(rotateVector.x, rotateVector.z) * (180 / Mathf.PI)) % 360;
请注意,我们要加上 360 并取模数,否则你会得到 0 - 180,然后是负角。这会将 -1 度转换为 359 度,正如原始发帖者所要求的.