1. 起点A(0,0) 终点B(100,100),特别注意
var angle = Math.atan2((this.B.y - this.A.y), (this.B.x - this.A.x));
angle如果是正,顺时针旋转,B点减去A点,一定是一个正值,所以顺时针旋转,但是在cocos中一般要的是逆时针旋转,所以前面需要添加一个负号来实现逆时针旋转
var angle = Math.atan2((this.A.y - this.B.y), (this.A.x - this.B.x));
angle如果是负,逆时针旋转,A点减去B点,一定是一个负值,所以逆时针旋转。这个就刚刚好。cocos中一般要的是逆时针旋转
2. 让一个对象朝向另一个对象 旋转角度一
cc.Class({
extends: cc.Component,
properties: {
target:{
default: null,
type:cc.Node
},
},
start () {
let angle = this.getAngle();
this.node.rotation = angle;
},
getAngle() {
//第一种方法,用目标点减去起点,得出angle如果是正,顺时针旋转,但是在cocos中一般要的是逆时针旋转,所以前面需要添加一个负号来实现逆时针旋转
var angle = -Math.atan2((this.target.y - this.node.y), (this.target.x - this.node.x));
//第二种方法,用起点减去目标点,一定是一个负值,所以逆时针旋转。这个就刚刚好。cocos中一般要的是逆时针旋转
var angle = Math.atan2((this.node.y - this.target.y), (this.node.x - this.target.x));
var theta = angle * (180 / Math.PI);
return theta;
},
});
2.让一个对象朝向另一个对象 旋转角度方法二
getAngle() {
//第一种方法,用目标点减去起点,得出angle如果是正,顺时针旋转,但是在cocos中一般要的是逆时针旋转,所以前面需要添加一个负号来实现逆时针旋转
var dx = this.target.x - this.node.x;
var dy = this.target.y - this.node.y;
var dir = cc.v2(dx,dy);
dir.normalizeSelf();
var angle = -Math.atan2(dir.y, dir.x);
var theta = angle * (180 / Math.PI);
return theta;
},
getAngle() {
//第二种方法,用起点减去目标点,一定是一个负值,所以逆时针旋转。这个就刚刚好。cocos中一般要的是逆时针旋转
var dx = this.node.x - this.target.x;
var dy = this.node.y - this.target.y;
var dir = cc.v2(dx,dy);
dir.normalizeSelf();
var angle = Math.atan2(dir.y, dir.x);
var theta = angle * (180 / Math.PI);
return theta;
},
3.让一个对象朝向另一个对象 旋转角度方法三
function lookAtObj(target){
//计算出朝向
var dx = target.x - this.node.x;
var dy = target.y - this.node.y;
var dir = cc.v2(dx,dy);
//计算夹角的参考方向,这里选择x轴正方向
var angle = dir.signAngle(cc.v2(1,0));
//将弧度转换为欧拉角
var degree = angle / Math.PI * 180;
//赋值给节点
this.node.rotation = degree;
}
4.对象--->朝着他的方向移动. cc.Node节点的rotation是一个角度,首先要根据rotation求出他的dir方向.
var angle = this.node.rotation/180*Math.PI;
注意:合成基于 X正方向的方向向量
var dir = cc.v2(Math.cos(angle),Math.sin(angle));
dir.normalizeSelf();
update(dt) {
//注意:angle如果是正,顺时针旋转,angle如果是负,逆时针旋转,但是cocos中一般要的是逆时针旋转。 this.node.rotation可以调整为0 45 90 135 180 270等。
var angle = -this.node.rotation / 180 * Math.PI;
var dir = cc.v2(Math.cos(angle), Math.sin(angle));//Math.cos(0)==1 Math.sin(0)=0;
dir.normalizeSelf();
var moveSpeed = 100;
this.node.x += dt * dir.x * moveSpeed;
this.node.y += dt * dir.y * moveSpeed;
},
5.起点ball1,终点ball2,人物point站立方向朝上,根据ball1和ball2坐标,算出人物point旋转朝向ball2坐标
|
| ball2
|
| ball1
| point(90度)
----------------------
|
|
|
start() {
let angle = this.calculateAngle();
this.point.rotation = angle;
},
calculateAngle() {
let len_y = this.ball2.position.y - this.ball1.y;
let len_x = this.ball2.position.x - this.ball1.x;
let tan_yx = Math.abs(len_y / len_x);
let temp = Math.atan(tan_yx) * 180 / Math.PI;
let angle = 0;
if (len_y > 0 && len_x < 0) {
angle = temp - 90;
}
else if (len_y > 0 && len_x > 0) {
angle = -temp + 90;
}
else if (len_y < 0 && len_x < 0) {
angle = -temp - 90;
}
else if (len_y < 0 && len_x > 0) {
angle = temp + 90;
}
else if (len_y == 0 && len_x != 0) {
angle = len_x < 0 ? -90 : 90;
}
else if (len_x == 0 && len_y != 0) {
angle = len_y < 0 ? 180 : 0;
}
console.log('Temp', temp);
console.log('Angle ', angle)
return angle;
},
6. 向量相减,得到目标向量
起点A(200,100) 目标B(100,200)
A到B的向量 = B点 - A点。 那我们只需要将目标对象的位置 - 自己的位置,即可得到方向向量,方向向量转换为角度
需要认清一个隐含变量,就是这个角度的基准是 X 轴正方向使用向量来表示就是 (1,0)
方法一:
var dx = target.x - this.node.x;
var dy = target.y - this.node.y;
var dir = cc.v2(dx,dy);
//var dir = cc.v2(Math.cos(angle), Math.sin(angle));//Math.cos(0)==1 Math.sin(0)=0;
var angle = dir.signAngle(cc.v2(1,0));
var degree = angle / Math.PI * 180;
this.node.rotation = degree;
方法二:
var dx = this.target.x - this.node.x;
var dy = this.target.y - this.node.y;
var dir = cc.v2(dx,dy);
dir.normalizeSelf();
A到B的向量 = B点 - A点。 那我们只需要将目标对象的位置 - 自己的位置,即可得到方向向量,方向向量转换为角度
顺时针旋转,angle如果是负,逆时针旋转,但是cocos中一般要的是逆时针旋转
var angle = Math.atan2(dir.y, dir.x);
var theta = angle * (180 / Math.PI);
this.node.rotation = -theta;
7.atan2在数学坐标系中,结果为正表示从 X 轴逆时针旋转的角度,结果为负表示从 X 轴顺时针旋转的角度