在单个平面中获取两个变换之间的角度

时间:2014-09-17 19:58:48

标签: c# unity3d

我在场景中有两个游戏对象。

我知道我可以使用.angle函数来获取两个对象之间的角度,但这是3d中的单个角度。我想要的是获得两个不同的角度,一个在垂直平面,一个在水平平面。

所以,如果我有一个游戏对象,另一个向上20度,向右30度,我想得到:

垂直= 20; 水平= 30;

感谢。

1 个答案:

答案 0 :(得分:0)

您需要的是将矢量分别投影到垂直和水平平面上并计算角度。

我使用两个对象t1和t2之间的方向,以及t1.forward来计算角度。这样,如果旋转t1,角度将改变,但如果旋转t2则不会改变。

在此示例中,t1是您要计算的对象,如相机,t2是您测量的位置,如目标。

void Update () 
{
    Debug.Log(AngleInPlane(t1, t2.position, Vector3.up));
    Debug.Log(AngleInPlane(t1, t2.position, Vector3.right));
}

public float AngleInPlane(Transform from, Vector3 to, Vector3 planeNormal)
{
    Vector3 dir = to - from.position;

    Vector3 p1 = Project(dir, planeNormal);
    Vector3 p2 = Project(from.forward, planeNormal);

    return Vector3.Angle(p1, p2);
}

public Vector3 Project(Vector3 v, Vector3 onto)
{
    return v - (Vector3.Dot(v, onto) / Vector3.Dot(onto, onto)) * onto;
}