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
|