Unity3D 角度 弧度 向量

1.角度.net

两条相交直线中的任何一条与另外一条相叠合时必须转动的量的量度,转动在这两条直线的所在平面上并绕交点进行。code

角度是用以量度角的单位,符号为°。一周角分为360等份,每份定义为1度(1°)。orm

之因此采用360这数值,是由于它容易被整除。360除了1和本身,还有21个真因子(二、三、四、五、六、八、九、十、十二、1五、1八、20、2四、30、3六、4五、60、7二、90、120、180),因此不少特殊的角的角度都是整数。blog

2.弧度get

在数学和物理中,弧度是角的度量单位。它是由国际单位制导出的单位,单位缩写是rad。定义:弧长等于半径的弧,其所对的圆心角为1弧度。(即两条射线从圆心向圆周射出,造成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角的弧度为1)。数学

3.关系it

角度和弧度关系是:2π弧度=360°。从而1°≈0.0174533弧度,1弧度≈57.29578°。io

1) 角度转换为弧度公式:弧度=角度×(π ÷180 )form

2)弧度转换为角度公式: 角度=弧度×(180÷π)class

4.向量

点乘积的计算方式为:a*b=|a|*|b|*cos<a,b>,其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。在点积中<a,b>和<b,a>夹角是不分顺序的。因此经过点积,能够计算两个向量的夹角。

还能够粗略的判断当前物体是否朝向另外一个物体,或者说物体是否在个人前面(后面)。只须要计算     

  Vector3 selfforward = self.transform.forward;

Vector3 selftotarget = (target.transform.position - self.transform.position).normalized;

的点积便可,结果大于0则目标在我前方。

 

叉积定义:c = a x b,其中a b c均为向量,即两个向量的叉积结果仍是一个向量。

性质1:c⊥a,c⊥b,即向量c垂直于向量a b所在平面。

性质2:模长|c|=|a|*|b|*sin<a,b>。

性质3:知足右手法则。有a x b ≠ b x a,而a x b = - b x a。

 

简单的说: 点乘判断角度,叉乘判断方向。 叉乘能够判断你是往左转仍是往右转更好的转向敌人,点乘获得你当前的面朝向的方向和你到敌人的方向的所成的角度大小。

代码以下:

using UnityEngine;

public class Vector3Test : MonoBehaviour
{
    private Vector3 a = new Vector3(1, 0, 1);
    private Vector3 b = new Vector3(-2, 0, -2);
    private void Start()
    {
        //--向量点乘--结果为一个数值
        float value = Vector3.Dot(a, b);
        //Debug.Log(value);

        float radians = Mathf.Acos(Vector3.Dot(a.normalized, b.normalized));//--弧度
        //Debug.Log(radians);

        float degrees = radians * Mathf.Rad2Deg;//--角度
        //Debug.Log(degrees);

        float angle = Vector3.Angle(a, b);//--角度
        //Debug.Log(angle);

        //--向量叉乘--结果是一个向量
        Vector3 e = Vector3.Cross(a, b);
        //Debug.Log(e.y);
        Vector3 f = Vector3.Cross(b, a);
        float degrees1 = Mathf.Asin(Vector3.Cross(a.normalized, b.normalized).magnitude) * Mathf.Rad2Deg;
        //Debug.Log(e);
        //Debug.Log(f);
        // Debug.Log(degrees1);

        TestDot(a, b);
        TestCross(a, b);
        GetAngle(a, b);
    }

    //点积
    private void TestDot(Vector3 a, Vector3 b)
    {
        float result = Vector3.Dot(a, b);
        if (result > 0)
        {
            Debug.Log("b在a前");
        }
        else if (result == 0)
        {
            Debug.Log("ab垂直");
        }
        else
        {
            Debug.Log("b在a后");
        }
        float angle = Vector3.Angle(a, b);//[0 - 180]        
        result = Vector3.Dot(a.normalized, b.normalized);
        float radians = Mathf.Acos(result);
        angle = radians * Mathf.Rad2Deg;
    }

    //叉乘
    private void TestCross(Vector3 a, Vector3 b)
    {
        Vector3 c = Vector3.Cross(a, b);
        if (c == Vector3.zero)
        {
            Debug.Log("b和a(平行),夹角:" + Vector3.Angle(a, b));
            return;
        }
        float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
        float angle = radians * Mathf.Rad2Deg;

        // 判断顺时针、逆时针方向,是在 2D 平面内的,因此需指定一个平面
        //下面以X、Z轴组成的平面为例 , (Y 轴为纵轴),
        // 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向,
        if (c.y > 0)
        {
            Debug.Log("b在a的顺时针方向");
        }
        else if (c.y == 0)
        {
            //--
        }
        else
        {
            Debug.Log("b在a的逆时针方向");
        }
    }

    // 获取两个向量的夹角  Vector3.Angle 只能返回 [0, 180] 的值
    // 如真实状况下向量 a 到 b 的夹角(80 度)则 b 到 a 的夹角是(-80)
    // 经过 Dot、Cross 结合获取到 a 到 b, b 到 a 的不一样夹角
    private void GetAngle(Vector3 a, Vector3 b)
    {
        Vector3 c = Vector3.Cross(a, b);
        float angle = Vector3.Angle(a, b);

        // b 到 a 的夹角
        float sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(a.normalized, b.normalized)));
        float signed_angle = angle * sign;

        Debug.Log("b -> a :" + signed_angle);

        // a 到 b 的夹角
        sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(b.normalized, a.normalized)));
        signed_angle = angle * sign;

        Debug.Log("a -> b :" + signed_angle);
    }
}

参考了:https://blog.csdn.net/yupu56/article/details/53609028