OpenGL坐标分为世界坐标和模型坐标。
此外,关于世界坐标系和本地坐标系的相互转换,在Node中定义了以下几个常用的坐标变换的相关方法。
– 世界坐标->本地坐标
convertToNodeSpace(const Point& worldPoint) const;
- 本地坐标->世界坐标
convertToWorldSpace(const Point& nodePoint) const;
– 以锚点为原点,世界坐标->本地坐标
convertToNodeSpaceAR(const Point& worldPoint) const;
– 以锚点为原点,本地坐标->世界坐标
convertToWorldSpaceAR(const Point& nodePoint) const;
–将世界坐标中触摸点转换为模型坐标。
convertTouchToNodeSpace(touch) 将世界坐标中触摸点转换为模型坐标。
convertTouchToNodeSpaceAR(Touch) 相对于锚点。
使用案例
将 sprite1 这个节点的坐标转换为sprite节点下的本地(节点)坐标系统的位置坐标。
使用convertToNodeSpace()时,无论锚点的位置设置在哪,都是以转换目标左下角为计算坐标,然后以被转换目标减去这个计算坐标。
使用convertToNodeSpaceAR()时,才会使用转换目标的锚点进行计算。然后才以被转换目标减去转换目标。将 sprite 这个节点的坐标转换为 sprite1节点下的世界坐标系统的位置坐标。
local pos=sprite1:convertToWorldSpaceAR(cc.p(sprite:getPositionX(),sprite:getPositionY()))转换为世界坐标,需要先做一步假设。将被转换点(sprite)添加到目标点(sprite1)中(sprite1:addChild(sprite)),如果已经是了,就不需要添加了。然后将sprite的坐标等价转换为在sprite1内的坐标。
converToWorldSpace: 以左下角为原点,等价转换 sprite在sprite1内的坐标,再以世界坐标为原点,计算世界坐标。
converToWorldSpaceAR: 以目标点的锚点为原点,等价转换 sprite在sprite1内的坐标,再以世界坐标为原点,计算世界坐标。等价转换意为:
原本操作: layer:addChild(sprite): setPosition(10,20);
准换后操作:sprite1:addChild(sprite): setPosition(10,20);
这些操作都是cocos2dx内部操作,不需要自己实现的。
使用转换坐标方法时,需要注意以下几点:
- 坐标的相互转换时,方法的参数是点坐标,cc.p(x,y)
- 参数不是被转换的精灵对象,也不是x,y轴的坐标,需要使用 cc.p()包装x,y的坐标。
- 返回值是一个表。而不是返回x,y的值。
--TestScene.lua内容如下。main.lua内容请寻找《cocos2dx-lua基础内容之 使用调度器》
size=cc.Director:getInstance():getVisibleSize()
local testScene=class("Test",
function()
return cc.Scene:create()
end
)
--初始化
function testScene:ctor()
end
function testScene:create()
local scene=testScene.new() --创建场景。
local layer=testScene:createLayer() --创建层。
scene:addChild(layer) --将层添加到场景中
return scene --返回场景
end
function testScene:createLayer()
local layer=cc.Layer:create() --创建场景
local sprite=cc.Sprite:create("HelloWorld.png") --创建精灵
local sprite1=cc.Sprite:create("HelloWorld.png")
sprite1:setPosition(cc.p(size.width/2+100,size.height/2+100))
sprite:setPosition(cc.p(size.width/2,size.height/2)) --设置位置
layer:addChild(sprite) --将精灵添加到层中
layer:addChild(sprite1)
----被转换精灵坐标以及目标精灵坐标
print("sprite1.x="..sprite1:getPositionX(),"sprite1.y="..sprite1:getPositionY())
print("sprite.x="..sprite:getPositionX(),"sprite.y="..sprite:getPositionY())
--下面是计算以(0.5,0.5)为锚点时,sprite的左下角坐标x,y的值。
print("real.x="..sprite:getPositionX()-sprite:getContentSize().width/2,
"real.y="..sprite:getPositionY()-sprite:getContentSize().height/2 )
--转换为世界坐标(基于锚点)
--local pos=sprite:convertToWorldSpaceAR(cc.p(sprite1:getPositionX(),sprite1:getPositionY()))
--转换为本地坐标
local pos=sprite:convertToNodeSpace(cc.p(sprite1:getPositionX(),sprite1:getPositionY()))
print("pos.x="..pos.x,"pos.y="..pos.y)
return layer --返回层。
end
return testScene
当使用convertToNodeSpace()时,输出结果如下所示:
前面两行输出的是sprite,sprite1的x,y轴坐标。
第三行输出的是sprite左下角的x,y轴坐标。
从之前的说明中,我们知道使用convertToNodeSpace()时,以转换目标左下角为计算坐标,用被转换目标(上面的例子是:sprite1)减去计算坐标(上面的例子是:sprite)。
sprite1的坐标就是(740,460)
sprite的左下角坐标也计算出来了,也就是上面的real.x,real.y的坐标(542.5,225)。
然后对应的坐标相减,得出的就是转换后的坐标(197.5,235)。
与pos.x和pos.y得出的值正好相同。