* 点乘 - Dot --重点理论课程
* · 又称“点积”或“内积”。
* · 公式:各分量乘积和
* [x1,y1,z1] · [x2,y2,z2] = x1·x2 + y1·y2 + z1·z2
* · 几何意义:a·b = |a| · |b| · cos<a,b>
* 两个向量的单位,向量相乘后再乘以二者夹角的余弦值。
*
* · API:
* float DotNum = Vector3.Dot(a, b);
*
* 点乘结果与角度关系
* · 对于标准化(归一化、向量的方向)过的向量,方向完全相同(夹角为0),点乘结果为1(cos值为1),
* 方向完全相反(夹角为180°),点乘结果为-1(cos值为-1),方向互相垂直(夹角90°)结果为0(cos值为0)。
*
* 点乘的应用
* · 对于标准化过的向量,点乘结果等于两向量夹角的余弦值。
* · 应用:计算两向量的夹角。
* float DotNum = Vector3.Dot(a.normalized, b.normalized);
* CosNum = Mathf.Acos(DotNum) * Mathf.Rad2Deg;
*
* 叉乘 - Cross
* · 又称“叉积”或“外积”。
* · 公式:
* [x1,y1,z1] x [x2,y2,z2] = [y1 * z2 - z1 * y2,z1 * x2 - x1 * z2,x1 * y2 - y1 * x2]
* · 几何意义:结果为两个向量所组成面的垂直向量,模长为两向量模长乘积再乘夹角的正弦值。
* · 脚本:Vector vector = Vector3.Cross(a,b);
*
* 应用
* · 创建垂直于平面的向量。
* · 判断两条向量相对位置。
*
* 点乘和叉乘在游戏的实际运用
* · 在敌人正前方20米的120度为敌人视觉危险区,超过正前方的20米120度则是安全区
* · 解题思路:计算敌人的正前方向量方向和玩家减敌人的向量方向,使用点乘计算夹角,小于60°代表已经进入视觉危险区,图例如下:
public GameObject GameObjPort1; //点乘、叉乘方法测试语句
public GameObject GameObjPort2; //点乘、叉乘方法测试语句
public float CosNum; //点乘、叉乘方法测试语句,利用点乘计算的夹角值
private void Update()
{
DotFF(); //点乘、叉乘讲解方法
}
//点乘、叉乘讲解方法
private void DotFF()
{
Debug.DrawLine(Vector3.zero, GameObjPort1.transform.position);
Debug.DrawLine(Vector3.zero, GameObjPort2.transform.position);
//举例,根据Dot方法,实参传两个向量的方向,即可求出余弦值
float DotNum = Vector3.Dot(GameObjPort1.transform.position.normalized, GameObjPort2.transform.position.normalized);
//计算夹角,反余弦值乘以转换为角度即可求出两根向量的夹角角度
CosNum = Mathf.Acos(DotNum) * Mathf.Rad2Deg;
//注意:点乘结果转换出来的夹角为计算最小夹角,即范围为0-180° !!
//注意:Vector3.Dot计算出来的值为-1至1,是两根向量的夹角弧度,如果代码需要优化,则可以使用弧度为单位做类似if判断的作业,
//可不用反余弦,可以增加计算资源,优化性能!
//计算叉乘
Vector3 CroNum = Vector3.Cross(GameObjPort1.transform.position, GameObjPort2.transform.position);
//判定叉乘的垂直面y轴是否小于0(小于0代表夹角大于180°),是则计算大于180°的夹角
if (CroNum.y < 0)
{
CosNum = 360 - CosNum;
}
Debug.DrawLine(Vector3.zero, CroNum);
}
|