计算两个向量之间的角度

时间:2016-08-06 11:24:46

标签: c# unity3d math-functions

如果尝试在互联网上搜索,但我找不到回复。

我试图计算从第一个向量看到的2个向量之间的角度。

因此,如果向量1为0,0且向量2为1,1,则标题为45。

在1,0那将是90。

在-1,0,它将是270。

是否有一个简单的解决方案来创建它?

5 个答案:

答案 0 :(得分:1)

这不是Unity,这是一个数学问题。

您需要使用向量dot multiplication。它构造成统一的,等于矢量长度乘以它们之间角度的余弦的乘积,因此你很容易得到它之间的矢量之间的角度。当然,团结有built-in function for that

由于每帧执行涉及向量的大量操作,因此有助于了解您正在运行的代码的性能影响。遗憾的是,这个问题的其他解决方案在计算上更复杂。另外,请记住,通常你不需要角度本身:角度的余弦实际上很容易使用。

当然,这个答案并不涵盖270度的情况。但是,对于这种应用程序,Quaternions更适合。基本上,270个案例要求你知道 up 向量来计算它,而向量本身(作为数学抽象)不包含那些信息 - 因此,在数学层面上,你不会&# 39; t有任何方法可以区分它们之间有270度和90度的向量。

所以,如果你真的需要270个案例,create quaternions from the vectors(顺便说一句,你可以看到 up 向量是一个独特的信息)然后{{3} }。与向量不同,Quaternions是为了处理旋转和方向而创建的,Unity具有为此实现的所有功能。

答案 1 :(得分:1)

给出偏移矢量(例如,相对于0,0,0)

.flex-container { display: flex; flex-wrap: wrap; } .flex-item { width: 45%; margin: 5px; }

请注意,我们要添加360并取结果的模数,否则将得到0-180,然后是负角。按照原始海报的要求,这会将-1度转换为359度。 / p>

答案 2 :(得分:-1)

我无法测试它,但这应该有效:

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);
}

答案 3 :(得分:-1)

非常感谢您的回复,我决定进行人工计算。 对于那些在我之后发现这个问题的人来说,我就是这样做的:

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;
}

答案 4 :(得分:-1)

老兄,你试过用谷歌吗?我只是用Google搜索&#34;两个向量之间的统一角度&#34;并找到官方文件。

https://docs.unity3d.com/ScriptReference/Vector3.Angle.html

var angle = Vector3.Angle(Vector3 from, Vector3 to); 

或在你的情况下

var angle = Vector2.Angle(Vector2 from, Vector2 to);