点乘
点乘可以得到一个向量在另一个向量上的投影长度。
计算公式
向量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);