ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。
Posted porter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。相关的知识,希望对你有一定的参考价值。
convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。
重点说明:基于... 不一定要是真实的, convertToWorldSpace 的结果也只是一个新的位置, 这个位置一般都没有什么实际意义的,大部分都是用在碰撞检测 ,一个虚拟的新位置(主要用在子弹和敌人不在同一层的情况,把子弹和敌人转换到同一节点下的本地坐标系进行位置比较,方便进行碰撞检测)
为什么官方文档,在这个文档描叙的时候,写的是基于当前节点下的坐标系.... 中文还是值得深入的推敲的。 不是必须是。 只是如果不是当前节点的子节点,用这个方法算出来的新节点,没有什么实际意义。
http://www.cocos.com/docs/native/v3/coordinate-system/zh.html
--- 这篇文章看了 10来篇,比以前的老版本清晰老不少,但是还有几个没有将透彻的地方,多推敲一下,就会有疑问的地方
1 this->addChild(sprite1); //此时添加到的是世界坐标系,也就是OpenGL坐标系 ---这个描述很关键 2 3 this->addChild(sprite2); //此时添加到的是世界坐标系,也就是OpenGL坐标系 4 // 把世界坐标转换到当前节点的本地坐标系中 5 Point convertToNodeSpace(const Point& worldPoint) const; 6 7 // 把基于当前节点的本地坐标系下的坐标转换到世界坐标系中 8 Point convertToWorldSpace(const Point& nodePoint) const;
现在的推敲点在于 convertToWorldSpace 方法的参数描叙:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。 但是实际的例子他们又不是父子关系。
所以在理解: Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition()); 这句话的意识的时候,sprite2->getPosition() 实际获取的是父节点的本地坐标(父节点也是顶节点,所以也是世界坐标)。
官方文档给的解释:让人很疑惑
其中:Point point1 = sprite1->convertToNodeSpace(sprite2->getPosition());
相当于sprite2
这个节点添加到(实际没有添加,只是这样理解)sprite1
这个节点上,那么就需要使用sprite1
这个节点的节点坐标系统,这个节点的节点坐标系统的原点在(20,40),而sprite1
的坐标是(-5,-20),那么经过变换之后,sprite1
的坐标就是(-25,-60)。
其中:Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
此时的变换是将sprite2
的坐标转换到sprite1
的世界坐标系下,而其中世界坐标系是没有变化的,始终都是和OpenGL等同,只不过sprite2
在变换的时候将sprite1
作为了”参照“而已。所以变换之后sprite2
的坐标为:(15,20)。
我的解释理解,让我自己豁然开朗:
其中:Point point2 = sprite1->convertToWorldSpace(sprite2->getPosition());
相当于sprite2
这个节点添加到(实际没有添加,只是这样理解)sprite1
这个节点上(-5,-20),就是新虚拟节点node2_(-5,-20)这个新位置是 sprite1 本地坐标系下的相对位置 ,所以 node2_ 在世界坐标的位置就是:(20-5,40-20)=(15,20)。 这样理解起来,非常直观明了。---和参数说明也对应起来了。
解释的比较好的文章:
https://www.tuicool.com/articles/6ZBJZz
以上是关于ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。的主要内容,如果未能解决你的问题,请参考以下文章