Unity3D 角度 弧度 向量

1.角度

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

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

之所以采用360这数值,是因为它容易被整除。360除了1和自己,还有21个真因子(2、3、4、5、6、8、9、10、12、15、18、20、24、30、36、45、60、72、90、120、180),所以很多特殊的角的角度都是整数。

2.弧度

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

3.关系

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

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

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

4.向量

点乘积的计算方式为:a*b=|a|*|b|*cos,其中|a|和|b|表示向量的模,表示两个向量的夹角。在点积中夹角是不分顺序的。所以通过点积,可以计算两个向量的夹角。

还可以粗略的判断当前物体是否朝向另一个物体,或者说物体是否在我的前面(后面)。只需要计算     

  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

性质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

你可能感兴趣的:(Unity3D,开发日常随笔)