[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)

發佈了42 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章