您的位置:首页 > 移动开发 > Cocos引擎

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两个节点,我们通过这两个节点来用下以上两个坐标转换方法:



代码如下:

//创建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)然后再进行坐标转换。







以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: