Unity - 向量2 - 点乘

594 阅读1分钟

点乘

点乘可以得到一个向量在另一个向量上的投影长度。

计算公式

向量A = (x1,y1,z1);向量B = (x2,y2,z2);A·B = x1*x2 + y1*y2 + z1*z2;

向量A点乘向量B后得到的是一个标量。这个标量如果为正,表示向量A与向量B的夹角为锐角;若为0表示直角;若为负表示钝角。

使用场景:通过点乘我们可以判断B物体在A物体的大致方位。比如:A的正前方是一个向量。B-A得到AB向量。那么A向量*AB向量,如果大于0,表示B在前方;等于0表示B在左右;小于0表示B在身后。

代码示例

public class Test : MonoBehaviour
{    
    public Transform A;    
    public Transform B;​    
    private void Update()    
    {        
        //得到向量AB        
        var ab = B.position - A.position;        
        //A的正前方 点乘 AB向量        
        var result = Vector3.Dot(A.forward, ab);        
        if (result >= 0)        
        {            
            print("B在A的前方");        
        }        
        else        
        {            
            print("B在A的后方");        
        }    
     }
}

这里还可以算出A向量与AB向量的夹角。必须是A的单位向量与AB的单位向量。 推导过程如下图:**
**

结果就是

β = ACos(单位向量A·单位向量B)

代码示例

//向量A与向量AB的弧度var rad = Mathf.Acos(Vector3.Dot(A.forward, ab.normalized));
//角度var angle = Mathf.Rad2Deg * rad;

其实Unity已经内置了如何求两个向量夹角的方法,而且不需要传如的向量是单位向量。代码如下

var angle1 = Vector3.Angle(A.forward, ab);

qrcode.jpg