Unity 点乘及叉乘的几何意义及运用

1:点乘: 定义:a·b=|a|·|b|cos 【注:粗体小写字母表示向量,表示向量a,b的夹角,取值范围为[0,180]】

注:看到公式,我们即可知道点乘过后得到的是一个标量,而不是一个向量。 而且可以通过这个去计算两个点之间的夹角及方向;

图片详解:

Unity 点乘及叉乘的几何意义及运用_第1张图片

Unity项目中的应用

         1:通过点乘,我们可以计算出两个点之前的前后所属位置,当a·b>0;角度值在0到90度之间,可想而知及b点在a点的前方,反之a·b<0;角度值在90到180度之间,可想而知b点在a点的后方

          2:可以根据点乘计算两个向量之间的夹角;= arccos(a·b / (|a|·|b|))

话不多说看代码:

   ///


    /// 点乘
    ///

    ///
    ///
    private void TestDot(Transform a,Transform b) 
    {
        //一个物体的坐标点也是有方向的  是和原点作为参考系
        Vector3 vecAObj = a.transform.position;
        Vector3 vecBObj = b.transform.position;
        
        float dotResult = Vector3.Dot(vecAObj.normalized, vecBObj.normalized);
        float radians = Mathf.Acos(dotResult);
        //将弧度转化为角度
        float angle = radians * Mathf.Rad2Deg;
        Debug.Log("Vector3.Dot两个向量的角度为--------->" + angle);
        Debug.Log("Vector3.Angle两个向量的角度为--------->" + Vector3.Angle(vecAObj, vecBObj));

        Vector3 vecAPoint = a.transform.forward;
        Vector3 vecBPoint = b.transform.position - a.transform.position;
        float dotResult2 = Vector3.Dot(vecAPoint.normalized, vecBPoint.normalized);
        if (dotResult2 > 0)
        {
            Debug.Log("b点在a点的前方-------->");
        }
        else {
            Debug.Log("b点在a点的后方----------->");
        }
        float radians2 = Mathf.Acos(dotResult2);
        float angle2 = radians2 * Mathf.Rad2Deg;
        Debug.Log("该两个点的角度值为---------->" + angle2);
    }

2:叉乘:定义:c = a x b,其中a b c均为向量

几何意义是:得到一个与这两个向量都垂直的向量

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

性质2:模长|c| = |a||b| sin

图片详解:

Unity 点乘及叉乘的几何意义及运用_第2张图片

Unity项目中的应用:

1.根据叉乘得到a,b向量的相对位置,和顺时针或逆时针方位。

简单的说: 点乘判断角度,叉乘判断方向。 
形象的说: 当一个敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所成的角度大小。

  ///


    /// 叉乘
    ///

    private void TestCross(Transform a, Transform b) 
    {
        Vector3 vecAobj = a.transform.forward;
        Vector3 vecBObj = b.transform.position - a.transform.position;
        Vector3 crossC = Vector3.Cross(vecAobj.normalized, vecBObj.normalized);
        float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, crossC));
        float angle = radians * Mathf.Rad2Deg;
        Debug.Log("该两个点的角度值为---------->" + angle);
        if (crossC.y > 0)
        {
            Debug.Log("b在A的顺时针方向");// 由此可以用来判断我A点是向左转还是右转可以更快的找到B点。此处的顺时针和逆时针是指更快的速度找到对应点。 琢磨下 应该就清楚这里指什么意思了
        }
        else {
            Debug.Log("b在A的逆时针方向");
        }
    }

你可能感兴趣的:(Unity)