今天为一个角度问题找了很多算法用法资料。结果发现网上几乎全来自一个源头。都是一样的。真的是文章一大抄!操!
找到一篇写得比较实用,正确的:
蓝色问题是我补充的用法
1.已知两个向量dirA,dirB。
Vector3 dirA = new Vector3(-1,1,0);
Vector3 dirB = new Vector3(-1,1,1);
2.使向量处于同一个平面,这里平面为XZ
dirA = dirA - Vector3.Project(dirA,Vecotr3.up);
dirB = dirB - Vector3.Project(dirB,Vecotr3.up);
注:Vector3.Project计算向量在指定轴上的投影,向量本身减去此投影向量就为在平面上的向量
3.计算角度
float angle = Vector3.Angle(dirA,dirB);
Vector3 pv =head.forward- Vector3.Project(head.forward,Vector3.up);
float ang = Vector3.Angle(enemy.transform.position-transform.position,pv);//head.forward);
上面先是用Project方法投影到平面,然后计算角度,得到的是一个平面上的夹角。我是在计算两人个拳手的相对角度,必须让他们面对面,动作才能准。这第一个参数用的是目标坐标减角色坐标。这也是很多网上资料写得含糊不清的地方(如果数学好,还需要找资料吗。很多只解释数学原理的我先BS一下)
4.计算方向
float dir = (Vector3.Dot (Vector3.up, Vector3.Cross (dirA, dirB)) < 0 ? -1 : 1);
angle *= dir;
Vector3.Cross 叉乘返回为同时垂直于两个参数向量的向量,方向可朝上也可朝下,由两向量夹角的方向决定。
Cross最主要的用处就是可以确定目标在你的左边还是右边,这样你就可以根据上面的 Angle方法获得的角度(这是个无方向的角度差值)来算要旋转的角度(是正向还是反向)。
float lr = Vector3.Cross(head.forward, enemy.position-transform.position).y;
这里的head是角色头部,这是计算角色面向的方向与敌人目标的点的角度差,也就是正对到目标需要左转还是右转。 lr为正或负来确定向哪边转。
Vector3.Dot 点乘意义为两参数向量方向完全相同返回1,完全相反返回-1,垂直返回0。当两向量角度减小,将得到更大的值。
这个方法是最早理解清楚的一个方法,简单说就是可以计算出两个目标的相对方向 (是面对还是背对,产生的值是一个-1到1的值。1表示面对,-1就是北对。值越接近1表示面对或背对的角度越正。
----------------------------------------
最后再BS一下一些转别人文章都不看正确错误的人,这样会误导很多人。