COCOS学习笔记--坐标系统与坐标系转换

来源:互联网 发布:linux php ext 目录 编辑:程序博客网 时间:2024/06/05 15:19

Cocos2d-x中,涉及到四种坐标系:

 

屏幕坐标系:原点(0,0)在左上角,x轴向右增长,y轴向下增长,屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系;


GL坐标系: 原点(0,0)在左下角,x轴向右增长,y轴向上增长,Cocos2DOpenglES为图形库,所以Cocos2d-x坐标系和其保持一致,在Cocos2d-x中的场景,就是使用的该坐标系;


世界坐标系:也叫做绝对坐标系,是游戏开发中建立的概念,因此,“世界”是指游戏世界。世界坐标系和OpenGL坐标系方向一致:原点(0,0)在左下角,x轴向右增长,y轴向上增长;


本地坐标系:也叫相对坐标系,是和节点相关联的坐标系。每个节点都有独立的坐标系,当节点移动或改变方向时,和该节点关联(它的子节点)的坐标系将随之移动或改变方向。我们通过NodesetPosition()设定元素的位置使用的就是其相对于父节点的本地坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。

 

Cocos中经常需要本地坐标系和世界坐标系两者互相转换,主要用了两个方法:convertToNodeSpace()和convertToWorldSpace()

我们举个栗子看一下这两个方法的用法,如图node1和node2两个节点,我们通过这两个节点来用下以上两个坐标转换方法:


代码如下:

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

 

 

 

 以上。




3 0
原创粉丝点击