http://www.cocoachina.com/bbs/read.php?tid-198283-page-1.html
看了此贴,前半部分还是明白的,看了后面的例子后,完成搞晕了。
世界坐标 opGL 坐标 cocos2dx 坐标 三者什么区别,前面看着说不一样,后面看着是说一样的。 晕~~
http://www.cocoachina.com/bbs/read.php?tid-198283-page-1.html
看了此贴,前半部分还是明白的,看了后面的例子后,完成搞晕了。
世界坐标 opGL 坐标 cocos2dx 坐标 三者什么区别,前面看着说不一样,后面看着是说一样的。 晕~~
望指点一下,谢谢!! 新手学习中。
看不到图哦亲
就是下面这个图,上面没显示出来,就又传了一次在下面
auto *sprite1 = Sprite::create(“HelloWorld.png”);
sprite1->setPosition(ccp(20,40));
sprite1->setAnchorPoint(ccp(0,0));
this->addChild(sprite1); //此时添加到的是世界坐标系,也就是OpenGL坐标系
auto *sprite2 = Sprite::create("HelloWorld.png");
sprite2->setPosition(ccp(-5,-20));
sprite2->setAnchorPoint(ccp(1,1));
this->addChild(sprite2); //此时添加到的是世界坐标系,也就是OpenGL坐标系
//将 sprite2 这个节点的坐标ccp(-5,-20) 转换为 sprite1节点 下的本地(节点)坐标系统的 位置坐标
Point point1 = sprite1->convertToNodeSpace(sprite2->getPosition());
//将 sprite2 这个节点的坐标ccp(-5,-20) 转换为 sprite1节点 下的世界坐标系统的 位置坐标
Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
log("position = (%f,%f)",point1.x,point1.y);
log("position = (%f,%f)",point2.x,point2.y);
运行结果:
Cocos2d: position = (-25.000000,-60.000000)
Cocos2d: position = (15.000000,20.000000) //此处结果没有理解
Point point1 = sprite1->convertToNodeSpace(sprite2->getPosition()); 这个的意思是以1为坐标系原点,得到2相对于1的位置(你已经理解了对吧)
Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition());这个是通过1来得到2的绝对坐标,S1->convertToWorldSpace(S2)方法中, 通常S2是S1的子节点才有其真正意义。
你给的数据中,我们假设2就是1的子节点(虽然不是),1的坐标为(20,40) 2的坐标为(-5,-20)【既然我们做了假设,也可以理解为2在1里面的坐标是(-5,-20)】,因此,S1->convertToWorldSpace(S2)方法得到的点坐标为 (-5+20,-20+40)即(15,20)
楼上说的对
谢谢你的解答, 但我还是没有明白其中的道理, 这样的话第二种原点在哪里?
//将 sprite2 这个节点的坐标ccp(-5,-20) 转换为 sprite1节点 下的世界坐标系统的 位置坐标
Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
sprite1 和sprite2 不是在同一个世界坐标系吗?
Point point1 = sprite1->convertToNodeSpace(sprite2->getPosition()) 这个也有个问题, 这是将世界坐标转成本地坐标, 那传入的参数就应是世界坐标,sprite2->getPosition()可不是世界坐标 ???
其实你不需要纠结那么多什么本地坐标世界坐标的。其实底层就是计算方法不一样。
1、Point p1 = A->convertToNodeSpace(B);
p1的x,y计算 p1.x = B.x - A.x p1.y = B.y - A.y
2、Point p2 = A->convertToWorldSpace(B);
p2的x,y计算 p2.x =B.x + A.x p2.y = B.y + A.y
之所以分什么NodeSpace和WorldSpace是坐标的转换一般有以下两种情况:
1、对应于上述的1 : 求一个点相对于另一个点的位置(通常两个点在同一层,应该说两个点在同一层用convertToNodeSpace才有其真正意义,否则也可以用,不过就是简单的代入公式而已,没有多大意义)
2、对应于上述的2:加入A是父结点(在1层)B是A的子节点(在2层),如果想要获取B在1层的坐标,就要用到convertToWorldSpace(当然B不是A的子结点也没关系,只不过是简单的代入公式罢了)
我觉得我已经说得够明白了。。如果还是不懂的话可以看看源码哈
研究了一些资料,基本是明白了,你的解答也提供了很多帮助 。 谢谢。
我想主要讲的明白的有四篇文章 。
http://www.firedragonpzy.com.cn/index.php/archives/72
http://www.cnblogs.com/lyout/p/3292702.html
http://www.tuicool.com/articles/juEfei
http://www.cnblogs.com/patientAndPersist/p/3546256.html
有一段话很重要
本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。例如坐出租车的时候对驾驶员说“向左转”,我们使用的是车的物体坐标系,“前”、“后”、“左”、“右”只有在物体坐标系中才有意义。但如果我们说“向东开”,我们使用的就是世界坐标系了,无论是车内还是车外的人都知道应该向什么方向开。CCNode的position使用的就是父节点的本地坐标系,它和GL坐标系也是一致的,x轴向右,y轴向上,原点在父节点的左下角。