U2L4-3——向量点乘
向量点乘
向量点乘可以用来判断对象的方位,计算两个向量之间的夹角
点乘计算公式:
向量A:(Xa,Ya,Za)
向量B:(Xb,Yb,Zb)
A⋅B=Xa×Xb+Ya×Yb+Za×Zb=∣A∣∣B∣cosθ
向量 · 向量 = 标量
向量点乘的几何意义是:
一个向量到另一个向量的投影的长度
点乘结果 > 0 两个向量夹角为锐角
点乘结果 = 0 两个向量夹角为直角
点乘结果 < 0 两个向量夹角为钝角
我们可以用这个规律判断对方的大致方位
它与向量模长和单位向量知识延伸出:
如果向量和自己的点乘结果为1,则该向量为单位向量:A⋅A=x2+y2+z2=1
值得一提的是,两个标准化后的单位向量,点乘以后得到的是这两个单位向量夹角的 cos 值
本章代码关键字
1 2 3 4
| Debug.DrawLine(, , ) Debug.DrawRay(, , ) Vector3.Dot(,) Vector3.Angle(,)
|
调试画线
画线段
前两个参数 分别是 起点 终点
1 2
| Debug.DrawLine(this.transform.position, this.transform.position + this.transform.forward, Color.red);
|
画射线
前两个参数 分别是 起点 方向
1 2
| Debug.DrawRay(this.transform.position, this.transform.forward, Color.white);
|
计算两个向量点乘方法
Vector3 提供了计算点乘的方法 (向量点乘)
1 2
| float dotResult = Vector3.Dot(this.transform.forward, target.position - this.transform.position);
|
通过点乘判断对方方位
1 2 3 4 5 6 7 8 9 10 11
|
float dotResult = Vector3.Dot(this.transform.forward, target.position - this.transform.position); if (dotResult < 0) { print("在我后方"); } else { print("在我前方"); }
|
通过点乘推导公式算出夹角
重要推论:AB夹角 = Acos(单位向量A · 单位向量B)
步骤
- 用单位向量算出点乘结果
- 用反三角函数得出角度
1 2 3 4 5
|
dotResult = Vector3.Dot(this.transform.forward, (target.position - this.transform.position).normalized);
print("角度:" + Mathf.Acos(dotResult) * Mathf.Rad2Deg);
|
得到两个向量之间夹角的方法
Vector3也提供了 得到两个向量之间夹角的方法(返回的是角度,和Mathf不同!!!)
1
| print("角度2:" + Vector3.Angle(this.transform.forward, target.position - this.transform.position));
|