UI坐标系与OpenGL坐标系
UI坐标就是Android和IOS等应用开发时候使用的二维坐标系,原点在左上角
OpenGL坐标是三维坐标,由于Cocos2d-x Lua 底层采用OpenGL渲染,因此默认坐标就是OpenGL坐标,只不过采用了两维(XY轴),不考虑Z轴,OpenGL的坐标原点在左下角
获得UI坐标 cc.p touchLocation = touch:getLocationInView() UI坐标转换为OpenGL坐标 cc.p touchLocation2 = cc.Director:getInstance:convertToGL(touchLocation) 这样就转换为Cocos2d -x Lua的默认坐标了
世界坐标系和模型坐标系
什么是世界坐标系和模型坐标系?
类似于你向别人问路,有的人告诉你向东1000M,然后向北走500M,这就是世界坐标
而有的人告诉你向左走1000M,然后向右走500M 这是模型坐标,以你自己为参照物
有时候我们需要将他们互换,可以通过Node对象函数实现
convertToNodeSpace ( worldPoint ) --将世界坐标转化为模型坐标 convertToNodeSpaceAR ( worldPoint ) --将世界坐标转化为模型坐标。AR表示相对于锚点 convertTouchToNodeSpace ( touch ) --将世界坐标系中的触摸点转化为模型坐标 convertTouchToodeSpace ( touch ) --将世界坐标系中的触摸点转化为模型坐标。AR表示相对于锚点 concertToWorldSpace ( nodePoint ) --将模型坐标转化为世界坐标 convertToWorldSpaceAR ( nodePonit ) --将模型坐标转化为世界坐标。AR表示相对于锚点
世界坐标转换为模型坐标
--[[ --创建层 添加背景颜色为白色 local layer = cc.Layer:create() local bg = cc.LayerColor:create(cc.c3b(255,255,255)) layer:addChild(bg) --创建一个Item local closeItem = cc.MenuItemImage:create( "CloseNormal.png","CloseSelected.png") closeItem:setPosition(cc.p(size.width - closeItem:getContentSize().width/2, closeItem:getContentSize().height/2)) local menu = cc.Menu:create(closeItem) menu:setPosition(cc.p(0,0)) layer:addChild(menu) --创建一个Node local node1 = cc.Sprite:create("node1.png") node1:setPosition(cc.p(400,500)) node1:setAnchorPoint(cc.p(1.0,1.0)) layer:addChild(node1,0) --创建一个Node2 local node2 = cc.Sprite:create("node2.png") node2:setPosition(cc.p(200,300)) node2:setAnchorPoint(cc.p(0.5,0.5)) layer:addChild(node2,0) --获取Node2 世界坐标系转换为相对于node1的模型坐标 local posX,posY = node2:getPosition() local point1 = node1:convertToNodeSpace(cc.p(posX,posY)) local point3 = node1:convertToNodeSpaceAR(cc.p(posX,posY)) cclog("Node2 x:"..point1.x.." y:"..point1.y) cclog("Node2AR x:"..point3.x.." y:"..point3.y) return layer -- --Node 2 x: 100 y:-100 不管node1锚点,则以node1的左下角为原点,相对于node2的锚点 --AR X:-200 y:-200 以node1的锚点(1.0,1.0)为原点,相对于node2的锚点 --]]
模型坐标转化为世界坐标
local layer = cc.Layer:create() --层背景 local bg = cc.LayerColor:create(cc.c3b(255,255,255)) layer:addChild(bg) --Item local loseItem = cc.MenuItemImage:create("CloseNormal.png","CloseSelected.png") loseItem:setPosition(cc.p(size.width - loseItem:getContentSize().width/2, loseItem:getContentSize().height/2)) local men = cc.Menu:create(loseItem) men:setPosition(cc.p(0,0)) layer:addChild(men) --创建node1 添加到layer local node1 = cc.Sprite:create("node1.png") node1:setPosition(cc.p(400,500)) layer:addChild(node1,0) --创建node2 添加到node1 local node2 = cc.Sprite:create("node2.png") node2:setPosition(cc.p(0,0)) node2:setAnchorPoint(cc.p(0,0)) node1:addChild(node2,0) --添加到node1 这样node2:setPosition(cc.p(0.0,0.0))变成了相对于node1 --的相对坐标了 local posX,posY = node2:getPosition()--A点的位置 cclog(""..posX.."--"..posY) local point1 = node1:convertToWorldSpace(cc.p(posX,posY)) --将Node2的坐标转化为世界坐标 local point3 = node1:convertToWorldSpaceAR(cc.p(posX,posY)) --将Node2的坐标转化为世界坐标,相对于锚点的位置 cclog("point X:" .. point1.x .. " Y:" .. point1.y) cclog("pointAR X:" .. point3.x .. " Y:" .. point3.y) return layer -- --得到的结果是 point: x = 250 y = 450 就是node1的原点与坐标轴原点的相对值 --得到的结果是 pointAR: x = 400 y = 500 就是node1的锚点与坐标轴原点的相对值 --
模型坐标转化为世界坐标有点跟书上介绍的不同,是我自己理解的,有误解的话欢迎指出