[5]Cocos2d-x之坐标系

世界坐标系:也叫绝对坐标系,用来描述其他坐标系的位置。世界坐标系的原点在左下角,x轴向右,y向上。绘制屏幕时,节点元素的本地坐标会映射为世界坐标

GL坐标系:cocos使用的坐标系,原点在左下角,x轴向右,y轴向上。

屏幕坐标系:ios、android、windows phone等都是用屏幕坐标系,原点在屏幕左上角,x轴向右,y轴向下。需要把触摸点转换为OpenGL坐标。

本地坐标系:用于标记节点的位置相对于父节点的坐标系,使用position设置的位置为相对于其父节点的位置,与GL坐标系一样。

本地坐标系原点:锚点在左下角,值为(0,0),使用convertToNodeSpace 、convertToWorldSpace时做为转换坐标参考,与 convertToNodeSpaceAR、convertToWorldSpaceAR不一样,带AR使用的是我们设置的锚点,不是原点

坐标转换convertToNodeSpace、convertToWorldSpace、convertToNodeSpaceAR、convertToWorldSpaceAR的使用
auto sp1 = Sprite :: create( "HelloWorld.png" );
sp1 ->setAnchorPoint ( Vec2( 0 ,0 ));
sp1 ->setPosition ( Vec2( 300 ,400 ));
this ->addChild ( sp1);
auto sp2 = Sprite ::create ( "pk.png" );
sp2 ->setAnchorPoint ( Vec2( 1 ,1 ));
sp2 ->setPosition ( Vec2( 100 , 300 ));
this ->addChild ( sp2);
//参考点(100,300)
Vec2 convertNode = sp1 ->convertToNodeSpace ( sp2-> getPosition ());
Vec2 convertWorld = sp1 ->convertToWorldSpace ( sp2-> getPosition ());
Vec2 convertNodeAR = sp1 ->convertToNodeSpaceAR ( sp2-> getPosition ());
Vec2 convertWorldAR = sp1 -> convertToWorldSpaceAR (sp2 -> getPosition());
CCLOG ("sp1 ,x: %f , y: %f :" , sp1 -> getPosition(). x , sp1 ->getPosition (). y);
               CCLOG ("sp2 ,x: %f , y: %f :" , sp2 -> getPosition(). x , sp2 ->getPosition (). y);
               CCLOG ("convert Node ,x: %f , y: %f :" , convertNode . x, convertNode. y );
               CCLOG ("convert World,x: %f , y: %f :" , convertWorld . x, convertWorld. y );
               CCLOG ("convert Node AR ,x: %f , y: %f :" , convertNodeAR . x, convertNodeAR. y );
               CCLOG ("convert World AR ,x: %f , y: %f :" , convertWorldAR . x, convertWorldAR .y );
               /*sp1, x: 300.000000, y : 400.000000 :
                             sp2, x : 100.000000, y : 300.000000 :
                             convert Node, x : -200.000000, y : -100.000000 :
                             convert World, x : 400.000000, y : 700.000000 :
                             convert Node AR, x : -200.000000, y : -100.000000 :
                             convert World AR, x : 400.000000, y : 700.000000 :*/

               //sp2的坐标原点(-140,60)
Vec2 convertNode2 = sp2 ->convertToNodeSpace ( sp1-> getPosition ());//300-(-140)=440,400-60=340
Vec2 convertWorld2 = sp2 ->convertToWorldSpace ( sp1-> getPosition ());//300+(-140)=160,400+60=460
Vec2 convertNodeAR2 = sp2 ->convertToNodeSpaceAR ( sp1-> getPosition ());
Vec2 convertWorldAR2 = sp2 ->convertToWorldSpaceAR ( sp1-> getPosition ());
               CCLOG ("convert Node2 ,x: %f , y: %f :" , convertNode2 . x, convertNode2. y );
               CCLOG ("convert World2,x: %f , y: %f :" , convertWorld2 . x, convertWorld2. y );
               CCLOG ("convert Node AR2 ,x: %f , y: %f :" , convertNodeAR2 . x, convertNodeAR2 .y );
               CCLOG ("convert World AR2 ,x: %f , y: %f :" , convertWorldAR2 . x, convertWorldAR2 .y );
                              //convert Node2, x: 440.000000, y : 340.000000 :
                              //convert World2, x : 160.000000, y : 460.000000 :
                              //convert Node AR2, x : 200.000000, y : 100.000000 :
                              //convert World AR2, x : 400.000000, y : 700.000000 :

总结:
根据以上例子,可以得出转换世界坐标系与本地坐标系的方法:
     1、convertToNodeSpace和convertToWorldSpace以坐标原点为参考点,像例子1中的sp2参考点为(300,400),例子2(-140,60)。convertToNodeSpaceAR和convertToWorldSpaceAR则以节点所设置的锚点来进行计算
     2、需要转换的节点的坐标,这里不需要使用坐标原点,例子1中sp2(100,300),例子2中sp1(300,400)
     3、convertToNodeSpace的计算:需转换的节点的坐标-参考点坐标,例子1:(100-300,300-400),例子2(300-(-140),400-60)
     4、convertToWorldSpace的计算:需转换的节点的坐标+参考点坐标,例子1:(100+300,300+400),例子2(300+(-140),400+60)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值