1.点积
对于n维度代数定义:
几何的定义: a·b=|a|*|b|*cos<a,b>
1.1 关于它的公式
而判断两个物体的位置 关系,是可以通过 这个 cos<a,b> 来判断,知道了这个余玄值,就可以知道 这个角度了。
它在Unity中 调用是通过Vector3.Dot(),Unity中使用的也是代数公式
public static float Dot(Vector3 lhs, Vector3 rhs)
{
return (float) ((double) lhs.x * (double) rhs.x + (double) lhs.y * (double) rhs.y + (double) lhs.z * (double) rhs.z);
}
1.2 关于它的作用
一是光照模型的应用,漫反射,高光的计算,diffuse=0.5+0.5*dot(n,l) ,n是法线方向,l是光照方向, 高光saturate(pow(dot(n,h),_Gloss))其中,h是 (viewDir+worldLightDir)/2
二是判断方位,角度,视野
三是 几何意义可以是求b在 a的投影
....还有很多
1.3 如何求方位
如何判断 a 与b 的方位呢
使用a物体的transform.forward向量与 a物体到b的方向做点击就可以得到这个余弦值了
a到b的方向: otherObj.transform.position – transform.position
transform.forward 是玩家正面朝向 方向
大于0则面对,否则则背对着。当然这个计算也会有一点误差,但大致够用。
因为求的角度用的是 单位向量,所以可以直接求得cos<a,b>
这个角度值 还可以用来判断是否在视野内,一般情况下人的视野是在124度内,游戏里一般是限制在90度左右,视距就直接是两点之间的距离了。
a·b= |a| *|b| * cos<a,b> => a·b= |1|
cos<a,b>的 含义图:
2.叉积
叉积的定义: c =a x b 其中a,b,c均为向量。即两个向量的叉积得到的还是向量!
性质1: c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面 。
性质2: 模长|c|=|a||b|sin<a,b>
性质3: 满足右手法则 。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。
public static Vector3 Cross(Vector3 lhs, Vector3 rhs)
{
return new Vector3
(
(float) ((double) lhs.y * (double) rhs.z - (double) lhs.z * (double) rhs.y),
(float) ((double) lhs.z * (double) rhs.x - (double) lhs.x * (double) rhs.z),
(float) ((double) lhs.x * (double) rhs.y - (double) lhs.y * (double) rhs.x)
);
}
3.关于使用:
自己个人项目的用法,用来判断前后关系,大于0在前方,小于0在后方下面会解释
1.判断目标在自己的前后方位可以使用下面的方法:
Vector3 dir = target.position - transform.position; //位置差,方向
Vector3.Dot(transform.forward, dir);
返回值为正时,目标在自己的前方,反之在自己的后方
2.判断目标在自己的左右方位可以使用下面的方法:
Vector3.Cross(transform.forward, target.position).y
返回值为正时,目标在自己的右方,反之在自己的左方
为什么取y呢 ,因为 transform.forward实际上是 (0,0,1)*rotation, 也就是只有z有值,
cross出来,就只有 y是计算 x和z 的情况,x是计算 y的情况,z是0;因此 左右关系,是由x和z决定的。
Mathf.Sign 符号
static function Sign (f : float) : float
Description描述
Returns the sign of f.
返回 f 的符号。
Return value is 1 when f is positive or zero, -1 when f is negative.
当 f 为正或为0返回1,为负返回-1。
http://www.ceeger.com/Script/Mathf/Mathf.Sign.html