cocos2dx 坐标之convertToNodeSpace、convertToWorldSpace、convertToNodeSpaceAR、convertToWorldSpaceAR区别和用法

convertToNodeSpace、convertToWorldSpace,都是以参照物的坐下角作为坐标点原点,向右和向上创建坐标系。
convertToNodeSpace:获得的坐标相对于参照物的坐标。
convertToWorldSpace:获得的坐标是参照物所在的坐标系中的坐标,即转换到参照物的世界坐标。

convertToNodeSpaceAR、convertToWorldSpaceAR,是以参照物的锚点为原点,向右、向上创建坐标系。
convertToNodeSpaceAR:获得的坐标相对于参照物的坐标(此时坐标系的原点在参照物的锚点)。
convertToWorldSpaceAR:获得的坐标是参照物所在的坐标系中的坐标,即转换到参照物的世界坐标(此时坐标系的原点在参照物的锚点)。

验证:
Sprite *sprite1 = Sprite::create("CloseNormal.png");
sprite1->setPosition(Point(100,100));
this->addChild(sprite1);
 
Sprite *sprite2 = Sprite::create("CloseNormal.png");
sprite2->setPosition(Point(200,200));
this->addChild(sprite2);
 
auto point1 = sprite1->convertToNodeSpace(sprite2->getPosition());
auto point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
auto point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());
auto point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());
log("position = (%f,%f)",point1.x, point1.y);
log("position = (%f,%f)",point2.x, point2.y);
log("position = (%f,%f)",point3.x, point3.y);

输出结果:
position = (120.000000,120.000000)
position = (280.000000,280.000000)
position = (100.000000,100.000000)
position = (300.000000,300.000000)

总结:
不带AR的是以参照物的坐下角作为坐标原点,向右、向上创建坐标系。
带AR的是以参照物的锚点为原点,向右、向上创建坐标系。

convertToWorldSpace它是一层一层向上回溯找其父结点的变换矩阵的,所以最后能求到最上层父结点的变换矩阵,也就求得了世界坐标系。所以
posBullet = (bullet->getParent())->convertToWorldSpace(bullet->getPosition()); 此方法是正确的

local delBtnTxt = self.resetBtn.delBtnTxt
    print("delBtnTxt 本地坐标: ", delBtnTxt:getPosition())
    local wx, wy = delBtnTxt:getParent():convertToWorldSpace(delBtnTxt:getPosition())
    print("resetBtn 世界坐标: ", wx, wy)
    local lx, ly = self.resetBtn:convertToNodeSpace(wx, wy)
    print("delBtnTxt 本地坐标2: ", lx, ly)

输出:
 delBtnTxt  本地坐标:        57.799999237061 53.720001220703
 resetBtn  世界坐标:         336.79998779297 238.7200012207
 delBtnTxt  本地坐标2:       57.799987792969 53.720001220703

你可能感兴趣的:(cocos2dx-lua,cocos2d,游戏引擎)