世界坐标系:也叫绝对坐标系,用来描述其他坐标系的位置。世界坐标系的原点在左下角,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,sp2 -> getPosition(). x,sp2 ->getPosition (). y); CCLOG ("convert Node,convertNode . x,convertNode. y ); CCLOG ("convert World,convertWorld . x,convertWorld. y ); CCLOG ("convert Node AR,convertNodeAR . x,convertNodeAR. y ); CCLOG ("convert World AR,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,y : -100.000000 : convert World AR,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,convertNode2 . x,convertNode2. y ); CCLOG ("convert World2,convertWorld2 . x,convertWorld2. y ); CCLOG ("convert Node AR2,convertNodeAR2 . x,convertNodeAR2 .y ); CCLOG ("convert World AR2,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,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)