以下都是个人理解。
Dot 计算 2 个向量的点乘法,一般的几何意义是计算力在方向上做的攻,或者一个向量在另外一个向量上的投影,Dot(Va, Vb) = |Va| * |Vb| * cos 夹角 = Vax * Vbx + Vay * Vby + Vaz * Vbz
他的一般用法有以下几种
1:求夹角是钝角还是锐角
因为 Dot 的结果在 2 个向量均为单位向量时,其结果就为 cos 夹角,当锐角时,值大于 0,钝角时,值小与 0
再细分一点
2:求敌人是否可见
观察流星.net,在角色正面夹角 75 度以内且距离 140 码以内敌方,会成为自动目标,这里的夹角 75 度,就是用 Vector3.Dot 计算的
设主角的面向单位向量为 Vector3 forward
设主角的位置向量为 Vector3 playerPos;
设敌方的位置向量为 Vector3 enemyPos;
则有
float angler = Vector3.Dot(Vecotr3.Normalize(playerPos - enemy.Pos), forward)
float degree = Mathf.Acos(angler);
这个 degree 就是对应的弧度反 cos 得到的角度。由于 angler 的取值范围受到 cos 值域的影响(-1, 1),degree 的范围也会受到影响(0, 180)
3:求攻击者在我的何方
判断锐角钝角很简单,但是还有遇见其他情况的时候
受击动作,在 P0.pos 文件里,每个攻击定义都包含 4 个方向的受击动作,每个动作都不同,想象把整个空间划分为前方,左方,右方,后方,每个占 90 度那么
前方,(-45,45) 左方-135,-90,右方 45,135,后方 (135,180) (-180,-135)
这个是以受击者为主体,攻击者在受击者的某个方位来算的。
根据前面 2 计算的角度,只能得到一个 0-180 度以内的角, 这个夹角,是绕着 2 个向量形成的平面的法线作为轴旋转的夹角,这意味着,绕着这个轴顺逆旋转都可以达到一个角度,
那么一般只能判断夹角是否为钝角,那怎么判断攻击者在我的左方,或者右方,就需要叉乘
叉乘成为向量积,其几何意义是计算结果是一个向量,其结果的模长,为 2 个向量组成的平行四边形的面积
Vector3.Cross 计算 2 个向量形成的面法向量,其计算结果是一个向量,且不满足交换律 cross(a,b) != cross(b, a)这是因为这个法线有 2 个方向,ab 形成的平面把空间划分为 2 个部分
法线垂直 ab 形成的平面贯穿 2 个空间,法线是向量,具有方向,所以这时候 2 个方向都可以选,选定任意一个为法向量 n
绕法向量 n 顺时针旋转得到的角度为正方向,以 A 向量为起点,绕法向量 n 顺时针旋转到 B 向量,那么夹角从 0 开始增大,一直到 A 向量与 B 向量的夹角
绕法向量 n 逆时针旋转得到的角度为负方向,以 B 向量为起点,绕法向量 n 逆时针旋转到 A 向量,那么夹角从 0 开始减小,一直到 B 向量与 A 向量的夹角
Cross(Va, Vb) = new Vector3(VayVbz - Vaz Vby, Vaz * Vbx - Vax * Vbz, Vax * Vby - Vay * Vbx) = |Va| * |Vb| * sin(夹角)
Cross(Vb, Va) = |Va| x| Vb| x sin(-夹角)
这里,夹角在 0-180 间时,b 在 a 的右侧,叉乘结果为正数,sin 夹角 = x 分量 / r 半径 x 分量为正
夹角在-180,0 之间时,b 在 a 的左侧,叉乘结果为负数,sin 夹角 = x 分量 / r 半径 x 分量为负
在这个求方位的例子里,只要点乘夹角 <145 度,且 [叉乘 >0 则在右侧,叉乘 <0 则在左侧],就可以判断出全部方位
那么知道这些结论后,即可推出游戏中 2 个角色间的位置关系。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于