计算两个矢量之间的角度

本文关键字:之间 两个 计算 | 更新日期: 2023-09-27 18:01:03

如果尝试在互联网上搜索,但找不到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);