Unity中的叉乘和点乘

本文深入解析了向量的点乘和叉乘运算,点乘用于计算两个向量之间的夹角和判断是否垂直,叉乘则用于确定两向量构成平面的法线方向,通过Unity代码示例展示了如何在游戏开发中应用这些向量运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个向量的点乘,就是我们说的数量级 

a·b=|a|·|b|cosθ  

结果是一个标量,如果==0,则两个向量夹角等于90度,垂直关系

小于0,则两个向量夹角大于90度

大于0,则两个向量夹角小于90度

如果cosθ  等于-1,则两个向量相反,等于1则两个向量同向

如果两个向量a,b均 为单位 向量 ,那么a.b等于向量b在向量a方向上的投影的长度

 

两个向量的叉乘,得到的是一个向量,是一个矢量,垂直于原来两个向量组成的平面,有两个方向。

c = a x b,其中a b c均为向量

模长|c| = |a||b| sinθ

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

代码如下:

 void Start ()
    {
        Vector3 a = new Vector3(2, 0, 2);
        Vector3 b = new Vector3(-2,0,0);
        MyDot(a, b);
        MyCross(a, b);
    }

    //点乘
    private void MyDot(Vector3 a, Vector3 b)
    {
        //点乘结果
        float _result1 = Vector3.Dot(a, b);

        //角度[0-180]
        float _angle1 = Vector3.Angle(a, b);

        //也可通过 单位向量 来计算角度
        //_result2 为夹角余弦值
        float _result2 = Vector3.Dot(a.normalized, b.normalized);
        //反余弦函数来求对应的弧度
        float _temp = Mathf.Acos(_result2);
        //弧度转角度[0,90]
        float _angel2 = Mathf.Rad2Deg * _temp;


        Debug.Log(string.Format("角度1:{0},角度2:{1}", _angle1, _angel2));
    }


    //叉乘
    private void MyCross(Vector3 a, Vector3 b)
    {
        //叉乘结果
        Vector3 _result3 = Vector3.Cross(a, b);
        //获取两个向量夹角(弧度)
        float _temp = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
        float _angel3 = Mathf.Rad2Deg * _temp;

        Debug.Log("角度3:" + _angel3);

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

       


    }

 

部分借鉴:https://blog.youkuaiyun.com/yupu56/article/details/53609028

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值