如果尝试在互联网上搜索,但找不到anwser。
我试图计算两个向量之间的角度,从第一个向量看。
因此,如果向量1为0,0,向量2为1,1,则航向为45。
在1.0时,它将是90。
在-1.0时,它将是270。
有没有一个简单的解决方案来创建这个?
给定偏移矢量(例如相对于0,0,0(
float resultInDegrees = (360 + Mathf.Atan2(rotateVector.x, rotateVector.z) * (180 / Mathf.PI)) % 360;
注意,我们加360,取结果的模量,否则你会得到0-180,然后是负角度。。按照原始海报的要求,这将-1度转换为359度。
我不能在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,这是一道数学题。
你需要使用矢量点乘法。它被构建成单位,等于向量的长度乘以向量之间角度的余弦的乘积,所以你很容易从中得到向量之间的角度。当然,单位有一个内置的函数。
由于每帧都要执行大量涉及向量的操作,因此了解正在运行的代码的性能影响会有所帮助。遗憾的是,这个问题的其他解决方案在计算上更为复杂。此外,请记住,通常不需要角度本身:角度的余弦实际上很容易处理。
当然,这个答案不包括270度的情况。然而,对于这类应用程序,四元数更适合。基本上,270的情况需要你知道up向量来计算它,而向量本身(作为数学抽象(不包含这些信息——所以,在数学层面上,你无法区分它们之间有270度和90度的向量。
因此,如果你真的需要270的情况,从向量中创建四元数(顺便说一句,你可以看到up向量是一条不同的信息(,然后计算它们之间的角度。与向量不同的是,四元数是用来处理旋转和方向的,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;
}
老兄,你试过用谷歌吗?我刚刚在谷歌上搜索了"两个向量之间的统一角度",找到了官方文件。
https://docs.unity3d.com/ScriptReference/Vector3.Angle.html
var angle = Vector3.Angle(Vector3 from, Vector3 to);
或者在您的情况下是
var angle = Vector2.Angle(Vector2 from, Vector2 to);