点乘
点乘,又称“点积”或“内积”。
公式:各分量乘积和
[x1,y1,z1] • [x2,y2,z2] = x1x2 + y1y2 + z1z2
几何意义:a•b = |a||b|cos<a,b>
两个向量的单位向量相乘后,再乘以两者夹角的余弦值。运算结果是标量。
API:float dot = Vector3.Dot(a, b);
当向量a和向量b归一化后
当向量a和向量b归一化后,|a||b|值为1,点乘a•b = cos<a,b>
运算结果就是当x取值范围为[-π,π]的余弦函数图像。
点乘的值:同向为1(夹角为0),反向为-1(夹角为180),垂直为0(夹角为90)。点乘只能求出0到180度的角度。
点乘用法:
float dotResult = Vector3.Dot(t1.position.normalized, t2.position.normalized); // 如果没有归一化,还需要除以两个向量的模长,再求角度
angle = Mathf.Acos(dotResult) * Mathf.Rad2Deg;
1、得到2个向量的夹角:范围[0, 180] ,可以做游戏怪物的视角是否有查看到玩家,可以用来计算敌人是否在角色的攻击范围之内,如前方左右60度内。夹角不区分左右。
2、判断目标在自己的前后方位。点乘的结果大于0为前方,小于0为后方。看余弦函数可以知道,已知y,求x,是无法区分x的正负的。
叉乘
又称“叉积”或“外积”。
公式:[x1,y1,z1] x [x2,y2,z2] = [y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1*x2]
几何意义:结果为两个向量所组成的面的垂直向量,模长为两向量模长乘积再乘夹角的正弦值。
API:Vector v = Vector3.Cross(a,b);
与点积不同,它的运算结果是一个向量而不是一个标量。
可以用左手法则确定叉乘结果的方向。
叉乘用法:
Vector3 crossValue = Vector3.Cross(t1.position.normalized, t2.position.normalized);
float crossAngle = Mathf.Asin(crossValue.magnitude) * Mathf.Rad2Deg;
可用于创建垂直于平面的向量。判断两条向量相对位置。夹角不区分前后,但分左右。左乘和右乘会影响结果的正负。
1、得到2个向量的夹角:范围[0,90]。
2、判断目标在自己的左右方位。叉乘的结果向量crossValue.y大于0,则为右方。小于0为左方。(左手法则)
3、求物体表面法线,用于求物体光照相关问题。
4、将炮管的正方向向量 与 敌人位置减去炮管位置的向量 进行叉积,得到一个向量,炮管绕此向量旋转,可以使炮管旋转至对准敌人,实现指向敌人的作用。
点乘和叉乘组合求0到360度角
float dot = Vector3.Dot(t1.position.normalized, t2.position.normalized);
angle = Mathf.Acos(dot) * Mathf.Rad2Deg;
Vector3 cross = Vector3.Cross(t1.position, t2.position);
if (cross.y < 0)
{
angle = 360 - angle;
}