CocosCreator开发笔记(22)-使用convertToNodeSpace和convertToWorldSpace

这篇博客详细解释了CocosCreator中convertToNodeSpace、convertToNodeSpaceAR、convertToWorldSpace和convertToWorldSpaceAR四个方法的含义和使用场景。convertToNodeSpace和convertToNodeSpaceAR将点从世界坐标转换到节点的局部坐标,而convertToWorldSpace及convertToWorldSpaceAR则反之。理解这些方法对于在CocosCreator中进行精确的坐标操作至关重要。

含义

convertToNodeSpace

将一个点转换到节点 (局部) 坐标系,并加上锚点的坐标。
也就是说返回的坐标是相对于节点包围盒左下角的坐标。

convertToNodeSpaceAR

将一个点转换到节点 (局部) 空间坐标系,这个坐标系以锚点为原点。
也就是说返回的坐标是相对于节点原点的坐标。

convertToWorldSpace

将一个相对于节点左下角的坐标位置转换到世界空间坐标系。

convertToWorldSpaceAR

将一个相对于节点原点的坐标位置转换到世界空间坐标系。

使用总结

  1. cocos引擎的世界坐标总是以左下角为原点,即左下角坐标为(0, 0)
  2. convertToNodeSpaceconvertToNodeSpaceAR的输入参数是个世界坐标,返回值是相对于节点的局部坐标;
  3. convertToWorldSpaceconvertToWorldSpaceAR的输入参数是节点相对坐标,返回值是世界坐标;
  4. 如果要把A节点的坐标转换为相对于B节点的坐标,应先把A坐标转换为世界坐标,然后再把得到的世界坐标转换为B坐标;
  5. convertToNodeSpaceAR返回目标节点空间系的局部坐标,一般使用它就够用了;
  6. convertToNodeSpace是在convertToNodeSpaceAR基础上,加上目标节点锚点的坐标,最终得到相对于节点左下角的局部坐标。看下它的源码实现就明白了:
convertToNodeSpace(node, worldPoint) {
    let localPt = node.convertToNodeSpaceAR(worldPoint);
    localPt.x += node.anchorX * node.width;
    localPt.y += node.anchorY * node.height;
    return localPt;
}
### Cocos Creator中 `convertToWorldSpace` `convertToNodeSpace` 的用法及区别 在Cocos Creator的场景中,节点通常位于一个层级结构中,每个节点都有其局部坐标系(相对于父节点)。为了处理不同节点之间的交互或计算,开发者需要将坐标从一个空间转换到另一个空间。以下是关于 `convertToWorldSpace` `convertToNodeSpace` 的详细说明。 #### 1. `convertToWorldSpace` 此方法用于将节点的局部坐标转换为世界坐标。这意味着无论节点在其父节点中的位置如何,都可以通过该方法获得其在全局场景中的实际位置[^1]。 ```javascript // 示例代码:获取节点的某个点的世界坐标 let worldPoint = node.convertToWorldSpace(cc.v2(0, 0)); console.log(worldPoint); ``` - 参数:一个 `cc.Vec2` 对象,表示节点局部坐标系中的点。 - 返回值:一个 `cc.Vec2` 对象,表示该点在世界坐标系中的位置。 #### 2. `convertToNodeSpace` 与此相反,`convertToNodeSpace` 方法将世界坐标或另一个节点的坐标转换为当前节点的局部坐标系下的坐标。这在处理如触摸事件、碰撞检测等场景时非常有用,因为这些事件通常以世界坐标的形式提供数据[^2]。 ```javascript // 示例代码:将世界坐标转换为节点的局部坐标 let localPoint = node.convertToNodeSpace(cc.v2(100, 100)); console.log(localPoint); ``` - 参数:一个 `cc.Vec2` 对象,表示世界坐标系中的点。 - 返回值:一个 `cc.Vec2` 对象,表示该点在当前节点局部坐标系中的位置。 #### 3. 主要区别 - **坐标空间**:`convertToWorldSpace` 将局部坐标转换为世界坐标;而 `convertToNodeSpace` 将世界坐标或其他节点的坐标转换为局部坐标。 - **应用场景**: - 使用 `convertToWorldSpace` 时,通常是为了计算某个节点在全局场景中的位置。 - 使用 `convertToNodeSpace` 时,通常是为了在局部坐标系下进行精确的操作,例如判断触摸点是否落在某个子节点上[^3]。 #### 示例对比 假设有一个父子节点关系,其中子节点的局部坐标为 `(50, 50)`,父节点的位置为 `(100, 100)`。 ```javascript // 子节点的世界坐标 let worldPos = childNode.convertToWorldSpace(cc.v2(50, 50)); // 结果可能是 (150, 150) // 将世界坐标转换回子节点的局部坐标 let localPos = childNode.convertToNodeSpace(cc.v2(150, 150)); // 结果应该是 (50, 50) ``` 以上示例展示了两种方法在坐标转换中的作用相互关系。 ### 注意事项 -使用这些方法时,确保节点已经正确地添加到场景中并完成了布局计算,否则可能会得到错误的结果。 - 如果节点存在旋转或缩放,转换后的坐标也会受到这些变换的影响[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值