已知两点坐标,求角度旋转

已知两点坐标,求角度旋转

先看效果

已知两点坐标,求角度旋转_第1张图片
自己的视角
已知两点坐标,求角度旋转_第2张图片
五号玩家的视角

下面请看代码

AngleCalculation: function(own_x, own_y, target_x, target_y) {
     
    let targetPoint = {
      x: target_x, y: target_y };//目标的坐标位置
    let ownPoint = {
      x: own_x, y: own_y };//自己的坐标位置
    let vector_O = {
      x: 1, y: 0 };//因为枪口位置起始位置是右边,所以向量为{ x: 1, y: 0 },如果起始位置向上则为{ x: 0, y: 1 },一次类推
    let vector_T = {
      x: ownPoint.x - targetPoint.x, y: ownPoint.y - targetPoint.y };
    let abs_O = Math.sqrt(Math.pow(vector_O.x, 2) + Math.pow(vector_O.y, 2)); //向量长度
    let abs_T = Math.sqrt(Math.pow(vector_T.x, 2) + Math.pow(vector_T.y, 2));
    let dot = (vector_O.x * vector_T.x + vector_O.y * vector_T.y) / (abs_O * abs_T); //点乘   弧度余弦值计算
    let cross = (vector_O.x * vector_T.y - vector_O.y * vector_T.x); //叉乘  根据左右手定则判断方向
    let angle = Math.acos(dot) * 180 / Math.PI; //反余弦求弧度值   转化为角度
    //console.log(Math.atan2(vector_O.y, vector_O.x) - Math.atan2(vector_T.y, vector_T.x));
    if (cross < 0) {
     
        angle += -180;
    } else if (cross > 0) {
     
        angle = 180 - angle;
    }
    return angle;
}

因为CocosCreator2.0版本以下,想做这些,必须要自己写,Cocos又是右手坐标系法则,所以 叉乘判断方向角度+=180,如果是unity的左手坐标系,减等180就可以了,最后这个判断可能会有些奇怪,不要着急,往下面看

let angleR = this.AngleCalculation(ownPos.x, ownPos.y, targetPos.x, targetPos.y);
if (toIndex > beginIndex) {
     
  	if (angleR == 0) {
     
     	angleR += 180;
		}
     } else {
     
        if (angleR == 180) {
     
               angleR = 0;
        }
 	}

这里的toIndex 是要朝向的目标的位置索引(自身为0,逆时针旋转右一索引为1,右二为2……),这里会有两个特殊判断,可能会出现0或者180的特殊数值,所以当目标位置比自己大,在自己左边的时候,上面提到了动画枪口起始位置是朝右的,所以这里要加等180,反之亦然。上述方法可以根据左右收法则直接套来用,不用做修改,这个已经经过长时间的线上测试,应该没什么问题,如果哪里写的不对,欢迎大神指正。

你可能感兴趣的:(CocosCreator,Cocos,Creator,角度旋转,JavaScript)