cc.Node坐标空间

cc.Node坐标空间

cc.Vec2

实质为JavaScript上的字典,结构{x:num,y:num};它表示 2D 向量和坐标 
cc.p()cc.v2都是cc.Vec2的对象

向量常用API

方法功能
cc.pSub()返回两个向量的差
cc.pAdd()返回两个向量的和
cc.pLength()返回指定向量的长度
cc.pLengthSQ()返回指定向量长度的平方
cc.pAngle()获取当前向量与指定向量之间的弧度角

创建一个Vec2对象

var pos = new cc.Vec2(100,100);//第一种方法
pos = cc.v2(100,100);//第二种方法
pos = cc.p(100,100);//第三种方法
  • 1
  • 2
  • 3

创建一个向量

var a = cc.p(100,100);
var b = cc.p(50,50);
var ba = cc.pSub(b,a); //终点减去起点坐标即为向量
var len = cc.pLength(ba); //计算向量长度
  • 1
  • 2
  • 3
  • 4

cc.Size与cc.Rect

cc.Size本质上也是一个表结构{width:num,height:num}包含高度与宽度的表 
不过从官方文档上看到其即将被cc.Vec2所取代 
cc.Rect同理,结构为{x:num,y:num,width:num,height:num}的表对象 
cc.Rect通常用于表示一个矩形,从x,y坐标为原点向右对角创建矩形

cc.Rect方法功能
Rect.contains(point)当前矩形是否包含指定坐标点,在内返回true,否则返回false
Rect.intersects()判断当前矩形与指定矩形是否相交,相交返回true,否则返回false

创建cc.Size对象

//通过new创建对象
var s = new cc.Size(100,100);
var r = new cc.Rect(0,0,100,100);

s = cc.size(100,100);
r = cc.rect(0,0,100,100);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

creator坐标系

世界坐标与相对坐标

简单来说就是屏幕坐标 
世界坐标的原点与安卓的坐标原点不一样,creator的坐标原点是从左下角开始的,坐标系与数学标准坐标系相同 
坐标
可以看出世界坐标与相对坐标的区别,并且我们可以得知,拥有大小的单色精灵节点其实都是以锚点作为原点,并且position记录的就是相对父节点的坐标,所以假设a移动到相对Canvas下的(100,100)位置,b仍然在相对于a的(100,100)位置 
相对坐标

相关API功能
Node.convertToWorldSpace()将一个点转换到世界空间坐标系,结果以 Vec2 为单位。
Node.convertToWorldSpaceAR()将一个点转换到世界空间坐标系,结果以 Vec2 为单位, 返回值将基于世界坐标。
Node.convertToNodeSpace()将一个点转换到节点 (局部) 坐标系,结果以 Vec2 为单位。
Node.convertToNodeSpaceAR()将一个点转换到节点 (局部) 空间坐标系,结果以 Vec2 为单位, 返回值将基于节点坐标。

将节点坐标转换为屏幕坐标

把这个组件代码挂载到节点b中

 start:function(){
      cc.log(this.node.position);
       cc.log("相对于a的坐标:("+"x:"+this.node.position.x+"y:"+this.node.position.y+")");
       //以节点左下角为原点
       var Wpos = this.node.convertToWorldSpace(cc.p(0,0));  
       cc.log(Wpos);
         //加上AR后为以锚点为原点
         var WposAR = this.node.convertToWorldSpaceAR(cc.p(0,0));  
       cc.log(WposAR);
    },
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

打印结果 
打印结果

将世界坐标转换为相对节点坐标

继续将组件挂载到节点b上

start:function(){
     //节点b锚点的世界坐标
     var WposAR = this.node.convertToWorldSpaceAR(cc.p(0,0));
      cc.log(WposAR);
      //以b节点左下角为原点,将该坐标(Wpos)转换为相对于b节点左下角的相对节点坐标
      var Npos = this.node.convertToNodeSpace(WposAR);
     cc.log(Npos);
     //以b节点锚点为原点,将该坐标(Wpos)转换为相对于b节点锚点的相对节点坐标
     var NposAR = this.node.convertToNodeSpaceAR(WposAR);
     cc.log(NposAR);
  },
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

打印结果 
节点坐标
由于这个单色节点b的Size为(100,100),所以节点b的锚点为(50,50)因此,以节点b左下角为原点打印出来的坐标就是(50,50)了

获取包围盒

相关API功能
Node.getBoundingBox()获取父节点为坐标系下的包围盒
Node.getBoundingBoxToWorld()获取世界坐标系下的包围盒

触摸事件所返回的坐标对象

触摸事件会返回用户触摸事件的世界坐标,因此每一次点击,都会返回一个坐标对象。可以利用convertToNodeSpaceAR()将其转换为以锚点为原点的节点坐标,以此获取用户点击位置

  start () {
       var pos = this.node.on(cc.Node.EventType.TOUCH_START,function(e){
           //方法1
           var Wpos = e.getLocation();
           var pos = this.node.convertToNodeSpaceAR(Wpos);
           cc.log(Wpos+"<----->"+pos);
           //方法2
           pos = this.node.convertTouchToNodeSpaceAR(e);
          cc.log("**********"+pos);
       },this);
   },
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

移动子节点到指定世界坐标

有时候往往需要移动某子节点到某点世界坐标系中 
假如我们需要把节点b移动到世界坐标(200,200)的位置当中,因此,需要把世界坐标转为相对父节点的坐标

start () {
       var N_pos = this.node.parent.convertToNodeSpaceAR(cc.p(200,200));
       this.node.setPosition(N_pos);
    },
  • 1
  • 2
  • 3
  • 4

只要获得了相对父节点的坐标,就是我们需要设置的世界坐标,效果如下: 
移动位置

<think>我们正在讨论Cocos Creator中的坐标转换方法。用户询问的是`this.node.convertToNodeSpaceAR`的作用。 根据Cocos Creator的文档,`convertToNodeSpaceAR`是一个将世界坐标转换为节点本地坐标的方法,其中AR表示以节点的锚点为原点。 与`convertToNodeSpace`(以节点左下角为原点)不同,`convertToNodeSpaceAR`以节点的锚点(通常也是节点的中心,但可以自定义)为原点。 因此,这个方法会将给定的世界坐标点转换为相对于节点锚点的坐标。 注意:用户提供的引用代码中并没有直接使用`convertToNodeSpaceAR`,而是使用了`this.node.parent.convertToNodeSpaceAR`,这表示将世界坐标点转换到父节点的本地坐标系(以父节点的锚点为原点)。 下面我将详细解释`convertToNodeSpaceAR`的作用,并提供一个示例。 步骤: 1. 首先,明确坐标转换的概念:在Cocos Creator中,节点有本地坐标(相对于父节点)和世界坐标(相对于整个场景)。 2. `convertToNodeSpaceAR`是Node类的方法,用于将世界坐标转换到当前节点的本地坐标(以锚点为原点)。 3. 例如,假设节点A的锚点在中心,我们有一个世界坐标点P,我们想知道P相对于节点A的中心的位置,就可以使用A.convertToNodeSpaceAR(P)。 示例代码: ```javascript // 假设我们有一个节点this.node,我们想知道世界坐标点worldPos在该节点本地坐标系中的位置(以锚点为原点) let localPos = this.node.convertToNodeSpaceAR(worldPos); ``` 这样,localPos就是一个cc.Vec2对象,表示点P相对于节点锚点的坐标。 同时,我们还可以对比`convertToNodeSpace`(以节点左下角为原点)和`convertToNodeSpaceAR`(以节点锚点为原点)的区别。 另外,用户提供的代码片段中,最后一行是: ```javascript point = this.node.parent.convertToNodeSpaceAR(point) ``` 这里是将一个世界坐标点(或父节点坐标系中的点?实际上,在Cocos中,`convertToNodeSpaceAR`的参数是世界坐标)转换到父节点的本地坐标系(以父节点的锚点为原点)。因为`this.node.parent`就是当前节点的父节点。 因此,我们可以总结: - `convertToNodeSpaceAR`:将世界坐标转换为以当前节点的锚点为原点的本地坐标。 - 如果是对父节点调用,则得到的是在父节点本地坐标系中的坐标(以父节点的锚点为原点)。 注意:在用户提供的代码中,`point`最初是从`preAabb`和`aabb`等计算出来的,然后被转换为父节点的本地坐标。但用户的问题并不关心这段代码,而是问`convertToNodeSpaceAR`的作用。 所以,我们直接回答用户的问题。 </think> 在 Cocos Creator 中,`this.node.convertToNodeSpaceAR()` 是一个用于**坐标空间转换**的重要方法,它的作用是将**世界坐标系中的点**转换为**当前节点本地坐标系中的点(以节点锚点为原点)**。以下是详细说明: ### 作用解析 1. **坐标系转换** 将**世界坐标 (World Space)** 转换为**节点本地坐标 (Node Space)**,转换后的坐标以当前节点的**锚点 (Anchor)** 为原点 `(0, 0)`。 - 世界坐标:整个场景的全局坐标系,原点在场景左下角。 - 节点本地坐标:以当前节点的锚点为原点的相对坐标系。 2. **"AR" 的含义** `AR` 代表 **Anchor Referenced**(锚点参考),表示转换后的坐标原点**不是节点的左下角**,而是节点的**锚点位置**(默认为节点中心 `(0.5, 0.5)`,可自定义)。 3. **典型使用场景** - 计算其他物体(如触摸点、碰撞体)相对于当前节点的位置。 - 将全局坐标(如物理引擎返回的坐标)转换为当前节点的局部坐标。 - 动态对齐或定位子节点。 ### 代码示例 ```typescript // 假设触摸点 worldPos 是世界坐标系中的点 const worldPos = touch.getLocation(); // 转换为当前节点的本地坐标系(原点 = 节点锚点) const localPos = this.node.convertToNodeSpaceAR(worldPos); // 此时 localPos 的 (0,0) 对应节点锚点位置 console.log(`相对于锚点的坐标: (${localPos.x}, ${localPos.y})`); ``` ### 对比其他方法 | 方法 | 转换目标 | 原点位置 | |------|----------|----------| | `convertToNodeSpaceAR()` | 世界坐标 → 节点坐标 | 节点锚点 | | `convertToNodeSpace()` | 世界坐标 → 节点坐标 | 节点左下角 | | `convertToWorldSpaceAR()` | 节点坐标 → 世界坐标 | 节点锚点 | ### 用户引用代码分析 在您提供的代码片段中: ```javascript point = this.node.parent.convertToNodeSpaceAR(point) ``` 这里将 `point`(世界坐标)转换到**父节点的本地坐标系**(以父节点锚点为原点),常用于计算当前节点在父容器中的相对位置[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值