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

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

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

图片详解:

Unity项目中的应用

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

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

话不多说看代码:

   /// <summary>
    /// 点乘
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    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与向量ab所在平面垂直

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

图片详解:

Unity项目中的应用:

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

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

  /// <summary>
    /// 叉乘
    /// </summary>
    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的逆时针方向");
        }
    }
————————————————
                        
原文链接:https://blog.csdn.net/qq_39091751/article/details/103167778

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值