COCOS学习笔记--坐标系统与坐标系转换
2016-01-07 22:16
525 查看
在Cocos2d-x中,涉及到四种坐标系:
屏幕坐标系:原点(0,0)在左上角,x轴向右增长,y轴向下增长,屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系;
GL坐标系: 原点(0,0)在左下角,x轴向右增长,y轴向上增长,Cocos2D以OpenglES为图形库,所以Cocos2d-x坐标系和其保持一致,在Cocos2d-x中的场景,就是使用的该坐标系;
世界坐标系:也叫做绝对坐标系,是游戏开发中建立的概念,因此,“世界”是指游戏世界。世界坐标系和OpenGL坐标系方向一致:原点(0,0)在左下角,x轴向右增长,y轴向上增长;
本地坐标系:也叫相对坐标系,是和节点相关联的坐标系。每个节点都有独立的坐标系,当节点移动或改变方向时,和该节点关联(它的子节点)的坐标系将随之移动或改变方向。我们通过Node的setPosition()设定元素的位置使用的就是其相对于父节点的本地坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。
Cocos中经常需要本地坐标系和世界坐标系两者互相转换,主要用了两个方法:convertToNodeSpace()和convertToWorldSpace()。
我们举个栗子看一下这两个方法的用法,如图node1和node2两个节点,我们通过这两个节点来用下以上两个坐标转换方法:
代码如下:
运行结果如下:
convertToNodeSpace()方法很好理解,node1->convertToNodeSpace(node2->getPosition())表示node2相对于node1的坐标,就是在node1的本地坐标系中,node2的坐标。在node1的本地坐标系中,原点就是node1的位置,x轴向右增长,y轴向上增长,计算方法为:
newPosition = Pos(node2)- Pos(node1) = (-5,-20) - (20,40) = (-25,-60)。
convertToWorldSpace()方法是将node2的坐标系转化成相对于node1的世界坐标。这里我起初还有疑惑,什么叫相对于node1的世界坐标?世界坐标系不是固定的吗?其实这个方法是这个意思,node1是相对于世界坐标原点平移了(20,40),所以node2相对于node1的世界坐标就是把node2也平移(20,40),简单来说,这个方法就是将node2平移后的坐标,平移多少呢?参照node1在世界坐标系中相对原点平移的距离,虽然有点绕但是不难理解。计算方法为:
newPosition = Pos(node2)+ Pos(node1) = (-5,-20) + (20,40) = (15,20)。
另外注意一下这两个方法调用时都需要两个对象,后面的即括号里面的参数为要转换的对象的坐标,前面的即调用方法的对象为参照物。
此外有时还会提到与之相关的2个方法:convertToNodeSpaceAR()和convertToWorldSpaceAR(),这两者与前两个方法的区别就是提供了把锚点转成(0,0)的作用,就是在转化前先把node1、node2锚点设置为(0,0)然后再进行坐标转换。
以上。
屏幕坐标系:原点(0,0)在左上角,x轴向右增长,y轴向下增长,屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系;
GL坐标系: 原点(0,0)在左下角,x轴向右增长,y轴向上增长,Cocos2D以OpenglES为图形库,所以Cocos2d-x坐标系和其保持一致,在Cocos2d-x中的场景,就是使用的该坐标系;
世界坐标系:也叫做绝对坐标系,是游戏开发中建立的概念,因此,“世界”是指游戏世界。世界坐标系和OpenGL坐标系方向一致:原点(0,0)在左下角,x轴向右增长,y轴向上增长;
本地坐标系:也叫相对坐标系,是和节点相关联的坐标系。每个节点都有独立的坐标系,当节点移动或改变方向时,和该节点关联(它的子节点)的坐标系将随之移动或改变方向。我们通过Node的setPosition()设定元素的位置使用的就是其相对于父节点的本地坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。
Cocos中经常需要本地坐标系和世界坐标系两者互相转换,主要用了两个方法:convertToNodeSpace()和convertToWorldSpace()。
我们举个栗子看一下这两个方法的用法,如图node1和node2两个节点,我们通过这两个节点来用下以上两个坐标转换方法:
代码如下:
//创建node Node * node1 = Node::create(); Node * node2 = Node::create(); //设置node坐标 node1->setPosition(Vec2(20,40)); node2->setPosition(Vec2(-5, -20)); //通过convertToNodeSpace获得node2相对于node1的本地坐标 Vec2 nodePosition = node1->convertToNodeSpace(node2->getPosition()); //通过convertToWorldSpace获得node2相对于node1的世界坐标 Vec2 worldPosition = node1->convertToWorldSpace(node2->getPosition()); //打印结果 CCLOG("nodePosition : x = %f y = %f" , nodePosition.x, nodePosition.y); CCLOG("worldPosition : x = %f y = %f", worldPosition.x, worldPosition.y);
运行结果如下:
convertToNodeSpace()方法很好理解,node1->convertToNodeSpace(node2->getPosition())表示node2相对于node1的坐标,就是在node1的本地坐标系中,node2的坐标。在node1的本地坐标系中,原点就是node1的位置,x轴向右增长,y轴向上增长,计算方法为:
newPosition = Pos(node2)- Pos(node1) = (-5,-20) - (20,40) = (-25,-60)。
convertToWorldSpace()方法是将node2的坐标系转化成相对于node1的世界坐标。这里我起初还有疑惑,什么叫相对于node1的世界坐标?世界坐标系不是固定的吗?其实这个方法是这个意思,node1是相对于世界坐标原点平移了(20,40),所以node2相对于node1的世界坐标就是把node2也平移(20,40),简单来说,这个方法就是将node2平移后的坐标,平移多少呢?参照node1在世界坐标系中相对原点平移的距离,虽然有点绕但是不难理解。计算方法为:
newPosition = Pos(node2)+ Pos(node1) = (-5,-20) + (20,40) = (15,20)。
另外注意一下这两个方法调用时都需要两个对象,后面的即括号里面的参数为要转换的对象的坐标,前面的即调用方法的对象为参照物。
此外有时还会提到与之相关的2个方法:convertToNodeSpaceAR()和convertToWorldSpaceAR(),这两者与前两个方法的区别就是提供了把锚点转成(0,0)的作用,就是在转化前先把node1、node2锚点设置为(0,0)然后再进行坐标转换。
以上。
相关文章推荐
- Cocos2d-x利用jni调用java层代码
- cocos jpg alpha_mask png
- cocos2d-x Undefined symbols for architecture x86_64 when porting iOS app in Xcode? 问题的解决
- Cocos2d-x环境搭建
- 关于Can't find Class org.cocos2dx.cpp.AppActivity的解决
- Cocos2d-x 多分辨率适配完全解析
- libuv在cocos2d-x中的使用
- COCOS学习笔记--Cocod2dx内存管理(三)-Coco2d-x内存运行原理
- Mac平台的Cocos2dx开发环境搭建
- 23.cocos2d-x骨骼动画
- cocos2dx-Lua中关于Lua和Java的互相操作的解决方案
- cocos2d-lua里float 转 int
- 21.cocos2d-x小鱼Sprite3D
- cocos2d-js动画的播放的2种方式
- cocos2d-x游戏开发 跑酷(九) 源代码下载及小结
- 锯齿数独 cocos2d-x 开发 (二)
- Cocos2d-x v3.9发布
- Cocos2d-x 3.x中解决无法打开文件:“extensions/ExtensionMacros.h”
- 关于cocos2dx在android设备黑屏或者纹理黑块的几种情况
- cocos2d-x中3D游戏的制作-相机的使用教程