关于坐标系

http://www.cocoachina.com/bbs/read.php?tid-198283-page-1.html

看了此贴,前半部分还是明白的,看了后面的例子后,完成搞晕了。

世界坐标 opGL 坐标 cocos2dx 坐标 三者什么区别,前面看着说不一样,后面看着是说一样的。 晕~~

望指点一下,谢谢!! 新手学习中。

看不到图哦亲

就是下面这个图,上面没显示出来,就又传了一次在下面

1赞

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的子结点也没关系,只不过是简单的代入公式罢了)

我觉得我已经说得够明白了。。如果还是不懂的话可以看看源码哈:5:

研究了一些资料,基本是明白了,你的解答也提供了很多帮助 。 谢谢。

我想主要讲的明白的有四篇文章 。

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轴向上,原点在父节点的左下角。

1赞