Cocos-2d中,涉及到4种坐标系:

  • GL坐标系:Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系。GL坐标系原点在屏幕左下角,x轴向右,y轴向上

     getLocation()返回GL坐标系坐标点

  • 屏幕坐标系:苹果的Quarze2D使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下

     getLocationInView()返回屏幕坐标系坐标点。

      ios的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。

  • 世界坐标系:也叫做绝对坐标系。世界坐标系和GL坐标系一致,原点在屏幕左下角
    cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。
  • 本地坐标系:本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。
    每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。比如用cocos2d-x创建了个矩形colorLayer:CCRect(10,10,100,100),这是的本地坐标系为以(10,10)为坐标原点,x轴向右,y轴向上。如果创建了一个CCSprite,锚点为(0.5,0.5),位置为(100,100),size为(40,40),这时的本地坐标系为以(80,80)为坐标原点,x轴向右,y轴向上。总之,本地坐标系原点为node的左下角坐标
 CCDirector->convertToGL()  //将屏幕坐标系转换为GL坐标系CCDirector->convertToUI()  //将GL坐标系转换为屏幕坐标系

CCPoint convertToNodeSpace(const CCPoint& worldPoint);   //将orignPosition转换为相对于spriteParent的本地坐标
CCPoint convertToWorldSpace(const CCPoint& nodePoint);   //将orignPosition转换为相对于spriteParent的世界坐标
CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint); //将spriteParent的坐标系原点设置在spriteParent的锚点位置,然后orignPosition转换为相对于spriteParent的本地坐标
CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint); //将spriteParent的坐标系原点设置在spriteParent的锚点位置,然后orignPosition转换为相对于spriteParent的世界坐标

CCSprite *sprite1 = CCSprite::spriteWithFile("CloseNormal.png");
sprite1->setPosition(ccp(20,40));
sprite1->setAnchorPoint(ccp(0,0));
this->addChild(sprite1);
CCSprite *sprite2 = CCSprite::spriteWithFile("CloseNormal.png");
sprite2->setPosition(ccp(-5,-20));
sprite2->setAnchorPoint(ccp(1,1));
this->addChild(sprite2);
CCPoint point1 = sprite1->convertToNodeSpace(sprite2->getPosition());
CCPoint point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
CCPoint point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());
CCPoint point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());
CCLog("position = (%f,%f)",point1.x,point1.y);
CCLog("position = (%f,%f)",point2.x,point2.y);
CCLog("position = (%f,%f)",point3.x,point3.y);
CCLog("position = (%f,%f)",point4.x,point4.y);

运行结果:

position = (-25.000000,-60.000000)
position = (15.000000,20.000000)
position = (-25.000000,-60.000000)
position = (15.000000,20.000000)

和预期的一样,这里在将sprite1的锚点设置成(0.5,0.5),对convertToNodeSpaceAR和convertToWorldSpaceAR进行了进一步的测试

sprite1->setAnchorPoint(ccp(0.5,0.5));
sprite1->setPosition(ccp(100,100));
CCPoint point5 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());
CCPoint point6 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());
CCLog("position = (%f,%f)",point5.x,point5.y);
CCLog("position = (%f,%f)",point6.x,point5.y);

运算结果:

size = (40.000000,40.000000)
position = (-105.000000,-120.000000)
position = (95.000000,80.000000)

分析:重置的sprite1的坐标为(100,100),锚点为(0.5,0.5)所以对于convertToNodeSpaceAR和convertToWorldSpaceAR这两个方法的坐标系为原点(100,100),所以用convertToNodeSpaceAR转化之后的坐标为(-105,-120)用convertToWorldSpaceAR化之后的坐标为(95,80),和运算结果一样。

convertToNodeSpace:调用CCPoint point = node1->convertToNodeSpace(node2->getPosition());

将node2的坐标转化成相对于node1的本地坐标

比如坐标如上图所示,node1的锚点为(0,0),node2的锚点为(1,1),转化之后,node2的坐标变成了(-25,-60),即相对于node1的锚点的偏移。

而convertToWorldSpace:调用CCPoint point = node1->convertToWorldSpace(node2->getPosition());

是将node2的坐标转化成相对于node1的世界坐标,如上图所示:
首先将node1的坐标当做世界坐标,
然后让node2的坐标位置重置成相对于node1的世界坐标,(node2的position为(-5,-20),相对于(20,40)的偏移为(15,20),相当于将(20,40)设为原点。)
也就是(15,20)
convertToNodeSpaceAR,就是把node1的坐标系原点设置在锚点的位置,这里的锚点是(0,0)所以转化之后的坐标系位置和上面的convertToNodeSpace一样,结果也是一样的,convertToWorldSpaceAR同理

转载于:https://www.cnblogs.com/DswCnblog/p/3663512.html

Cocos-2d 坐标系相关推荐

  1. cocos 2d CCSprite 触摸识别 非常有用!!!!!

    cocos 2d 中的CCSprite 无法识别触摸操作,需要自定义类. 解决思想:找到触摸发生的那个点,判断其是否在sprite的矩形区域内 完整代码如下: //MySprite.h文件 #impo ...

  2. 2D坐标系与3D坐标系的相互转换--python实现

    并不是做关于SLAM方向的,但由于某些任务涉及到,故作此笔记- 相机内参矩阵: 不同的的深度摄像头具有不同的特征参数,在计算机视觉里,将这组参数设置为相机的内参矩阵C: [fx0cx0fycy001] ...

  3. 【cocos 2d微信小游戏开发教程】基础使用笔记分享(三)

    富文本(RichText) 优点:自定义颜色,大小,描边,还能加图片.对于复杂的文本表现力更好. 缺点:cocos的富文本是由Label组件拼装实现的.低版本会打断合批.Label太多导致卡顿. 常用 ...

  4. cocos 2d - js

    cocos2d - js 知识整理 目录结构 index.html main.js代码 project.json文件 启动流程 导演 节点 节点常用基本属性 节点坐标 场景 图层Layer 精灵Spr ...

  5. opengl绘制刻度坐标系_OpenGL中的坐标系-2D

    关于坐标系系统 在图形渲染管线中,坐标系系统扮演了一个非常重要的角色,他们并不是很复杂.当我们在学校学习几何的时候,第一个接触到的就是坐标.不过,还是让我们来先见识一下这些东西,这将使得我们更容易理解 ...

  6. cocos 坐标系的转换

    //实现点击屏幕背景玩家移动到该位置 moveToClicked : function(eventString){ var self = this; self.bg.on(eventString,fu ...

  7. Quartz 2d绘图

    今天看了一下Quartz 2D绘图,我只想说:不要把绘图和动画那些东西当做一个很复杂的东西,其实只要你认真看还是可以理解的.他们并不难.啰嗦了几句,现在直接进入正题: 前提是我们必须新建一个singl ...

  8. Cocos Creator教程 ——(一)Hello World

    目录 一.新建项目 二.资管管理器 三.层级编辑器 四.属性检查器 五.内容来源 一.新建项目 我们先通过一个简单的项目了解Cocos的基本结构: 打开cocos creator,在下面界面中选择&q ...

  9. 2d游戏引擎_8年,从2D到3D,我的学习之路

    Mickey 写了一篇 <一个本科毕业生创业两年的感悟>,从他的视角,总结了我们合作的两年经历. 我也来写一篇,介绍我的学习之路,希望对大家有所帮助,谢谢大家- 我的学习方法 1.直接从0 ...

  10. 坐标系之间的旋转平移变换与对应变换矩阵的关系

    在摄影测量和计算机视觉中,经常会遇到空间坐标系之间的坐标转换问题,而两个坐标系之间的变换关系一般可以通过一个旋转矩阵R和一个平移向量T(或C)描述.因此,理解清楚坐标系之间旋转平移的转换过程与对应变换 ...

最新文章

  1. 魔豆路由工程版体验:智能路由脱离手机的尝试
  2. (转)IntelliJ Idea 的相关使用
  3. python拿什么做可视化界面好-python爬虫如何制作可视化界面?(pyqt5环境配置篇)...
  4. linux网卡O I流量查询,查看linux server网络I/0流量的shell脚本
  5. bzoj1055 [HAOI2008]玩具取名 区间DP
  6. 评分较高对鸿蒙文,万倍增幅:鸿蒙至高神,加入诸天万界群
  7. Linux 启动流程即init程序分析--2
  8. C#dataGridView字体显示设置
  9. 《深入理解Java虚拟机》第6章 类文件结构
  10. Java对象toString()方法
  11. mtd_utils交叉编译
  12. 2ask matlab仿真,2ask调制解调系统仿真实验程序
  13. Windows Server AppFabric安装教程
  14. 把一个base64编码的图片绘制到canvas (canvas的图片在转成dataurl)
  15. 士不可以不弘毅,任重而道远
  16. Anaconda如何卸载干净
  17. 视频处理——去交错原理
  18. 访问者模式-好人打贱人
  19. access下如何配置两个vlan_锐捷三层交换机创建的两个vlan之间怎么样配置能通
  20. 口腔实验室5s管理实施内容办法

热门文章

  1. SAP EWM - 其他主数据 - 供应链单元
  2. 2019年,人工智能要落地,更要小心被“摔死”
  3. 机器学习Basics-第九期-CNN卷积神经网络详解
  4. 一句话总结贝叶斯分类器
  5. 如何下载指定版本的torchtext
  6. Science Robotics:新型多足机器人可自行组装,零件损坏时也能继续运动
  7. 大脑进化追不上社会文化:化石和脱氧核糖核酸证明人类大脑进化比社会慢
  8. 2020 五大技术趋势:无人驾驶发展、机器视觉崛起、区块链实用化、人类增强技术、超自动化...
  9. 超级智能的定义,一个已经诞生并不断深刻影响人类的新智能
  10. “脑补”的科学依据:眼前的黑不是黑,靠得是你的大脑