Cocoscreator 向量计算


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 轴顺时针旋转的角度


    
    
    
    
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值