本帖子已过去太久远了,不再提供回复功能。Cocos-2d 坐标系及其坐标转换 - CSDN博客
Cocos-2d 坐标系及其坐标转换
Cocos-2d中,涉及到4种坐标系:
GL坐标系Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系。GL坐标系原点在屏幕左下角,x轴向右,y轴向上。
屏幕坐标系苹果的Quarze2D使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下。ios的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。可以使用CCDirector的convertToGL来完成这一转化。
世界坐标系也叫做绝对坐标系。世界坐标系和GL坐标系一致,原点在屏幕左下角。
(cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。)
本地坐标系本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。比如用cocos2d-x创建了个矩形colorLayer:CCRect(10,10,100,100),这是的本地坐标系为以(10,10)为坐标原点,x轴向右,y轴向上。如果创建了一个CCSprite,锚点为(0.5,0.5),位置为(100,100),size为(40,40),这时的本地坐标系为以(80,80)为坐标原点,x轴向右,y轴向上。
Cocos-2d中,坐标系转换:
CCPoint&convertToNodeSpace(const
CCPoint& worldPoint);
CCPoint convertToWorldSpace(const CCPoint& nodePoint);
CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);
CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);
1.CCPoint&convertToNodeSpace(const
CCPoint& worldPoint);
CGPoint nodeSpace = [spriteParentconvertToNodeSpace:orignPosition];
将orignPosition转换为相对于spriteParent的本地坐标
convertToWorldSpace(const CCPoint& nodePoint);
CGPoint wordeSpace = [spriteParentconvertToWorldSpace:orignPosition];
将orignPosition转换为相对于spriteParent的世界坐标
convertToNodeSpaceAR(const CCPoint& worldPoint);
CGPoint nodeSpaceAR = [spriteParentconvertToWorldSpace:orignPosition];
将spriteParent的坐标系原点设置在spriteParent的锚点位置
orignPosition转换为相对于spriteParent的本地坐标
convertToWorldSpaceAR(const CCPoint& nodePoint);
CGPoint wordeSpaceAR = [spriteParentconvertToWorldSpace:orignPosition];
将spriteParent的坐标系原点设置在spriteParent的锚点位置
orignPosition转换为相对于spriteParent的世界坐标
本文已收录于以下专栏:
相关文章推荐
我们以红色矩形为父节点,绿色矩形为子节点,把红色矩形添加到一个layer中。
Size vSize = Director::getInstance()-&getVisibleSize();
convertToNodeSpace和convertToWorldSpace这两个的使用方法
我们加三个sprite,r0,r1,r2,
r0的父节点是layer, 父节点下坐标(0,0,100,...
在cocos2d-x,提供现成的两个用于坐标转换的函数,convertToNodeSpace和convertToWorldSpace
convertToNodeSpace:将世界坐标转换为本地坐标
cocos2d-x是基于openGLES的,所以遵循openGL的坐标系,也就是说是以屏幕的左下角为坐标原点,如下图:
屏幕坐标系一般是以左下角为坐标原点,如下图所示:
这篇博文将介绍一下在cocos2dx中的一些坐标系统概念:
(1)OpenGL坐标系
Cocos2D-x以OpenGL和OpenGL ES为基础,所以自然支持OpenGL坐标...
1.convertToNodeSpace
node1-&convertToNodeSpace
在cocos2dx中,坐标系和锚点是非常重要的基础。
在cocos2dx中,坐标原点位于画面的左下角,X轴水平向右递增,Y轴垂直向上递增。使用这种坐标系的原因,是因为cocos2dx是基于OpenG...
这一篇我们来谈谈关于坐标系统的转换问题。
在上一篇中我们知道了本地坐标与世界坐标的区别,还了解了关于cocos2dx的坐标系问题。
原本地址:http://www.cocos2d-x.org/docs/manual/framework/native/v3/coordinate-system/zh
Cocos2d-x坐标系和Ope...
Cocos2d-x坐标系介绍
在图形图像和游戏应用开发中坐标系是非常重要的,我们在Android和iOS等平台应用开发的时候使用的二维坐标系它的原点是在左上角的。而在Cocos2d-x坐标系中它原点是...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)中国领先的IT技术网站
51CTO旗下网站
Cocos2d-x坐标研究
苹果的Quarze2D使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下。ios的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标 系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。可以使用CCDirector的convertToGL来完成这一转化。
作者:佚名来源:blog.163| 15:49
Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系。GL坐标系原点在屏幕左下角,x轴向右,y轴向上。
屏幕坐标系
苹果的Quarze2D使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下。ios的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标 系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。可以使用CCDirector的convertToGL来完成这一转化。
世界坐标系
世界坐标系也叫做绝对坐标系,是游戏开发中的概念,它建立了描述其他坐标系所需要的参考框架。我们能够用世界坐标系来描述其他坐标系的位置,而不能用更大的,外部的坐标系来描述世界坐标系。cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的是相对 与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。世界坐标系和GL坐标系一致, 原点在屏幕左下角,x轴向右,y轴向上。
本地坐标系
本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变方向。例如坐出租车的时候对驾驶员说&向左转&,我们使用的是车的物体坐标系,&前&、&后&、&左&、&右&只有在物体坐标系中才有意义。但如果我们说 &向东开&,我们使用的就是世界坐标系了,无论是车内还是车外的人都知道应该向什么方向开。CCNode的position使用的就是父节点的本地坐标 系,它和GL坐标系也是一致的,x轴向右,y轴向上,原点在父节点的左下角。如果父节点是场景树中的顶层节点,那么它使用的本地坐标系就和世界坐标系重合了。在CCNode对象中有几个方便的函数可以做坐标转换:convertToWorldSpace方法可以把基于当前节点的本地坐标系下的坐标转换到世 界坐标系中。convertToNodeSpace方法可以把世界坐标转换到当前节点的本地坐标系中。注意这些方法转换的是基于当前节点的坐标,而一个节 点的position所使用的坐标是基于它父节点的本地坐标,因此我们要把node的位置转换到世界坐标系中应该调用父节点的 convertToWorldSpace函数 node-&getParent()-&convertToWorldSpace(node-&getPosition)。几 乎所有的游戏引擎都会使用本地坐标系而非世界坐标系来指定元素的位置,这样做的好处是当计算物体运动的时候使用同一本地坐标系的元素可以作为一个子系统独 立计算,最后再加上坐标系的运动即可,这是物理研究中常用的思路。例如一个在行驶的车厢内上下跳动的人,我们只需要在每帧绘制的时候计算他在车厢坐标系中 的位置,然后加上车的位置就可以计算出人在世界坐标系中的位置,如果使用单一的世界坐标系,人的运动轨迹就变复杂了。
每一个CCNode都有一个锚点(anchorpoint),锚点指定了texture上和所在节点原点(也就是position所表示的点)重合的点的位 置,因此只有在节点使用了texture的情况下,锚点才有意义。锚点的默认值是(0.5,0.5),它表示的并不是一个像素点,而是一个乘数因子。 (0.5,&0.5)表示锚点位于texture长度乘以0.5和宽度乘以0.5的地方,即texture的中心。改变锚点的值并不会改变节点的位置 (position),虽然可能看起来节点的图像位置发生了变化,其实变化的只是texture相对于position的位置,相当于你在移动节点里面的 texture,而非节点本身。如果把锚点设置成(0,0),texture的左下角就会和节点的position点重合,这可能使得元素定位更为方便, 但会影响到元素的缩放和旋转等一系列变换,所以不推荐这么做。因此在锚点为默认值(0.5,0.5)的情况下要把一个精灵放置到屏幕底部中央,应该如下设 置position:
[plain]&view&plaincopy&CGSize&screenSize&=&[[CCDirectorsharedDirector]&winSize];&float&imageHeight&=&player.contentSize.&player.position&=&CGPointMake(screenSize.width&/&2,imageHeight&/&2);&
今天晚上,对cocos2d-x里面的四个表示坐标的方法进行了一下研究,特意做了下笔记,如下:
CCPoint&convertToNodeSpace(const&CCPoint&&worldPoint);
CCPoint&convertToWorldSpace(const&CCPoint&&nodePoint);
CCPoint&convertToNodeSpaceAR(const&CCPoint&&worldPoint);
CCPoint&convertToWorldSpaceAR(const&CCPoint&&nodePoint);
在理解这个之前,要多世界坐标和本地坐标有一定的理解,
GL坐标系Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系。GL坐标系原点在屏幕左下角,x轴向右,y轴向上。
屏幕坐标系苹果的Quarze2D使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下。ios的屏幕触摸事件CCTouch传入的位置信息使用的是该坐标 系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。可以使用CCDirector的convertToGL来完成这一转化。
世界坐标系也叫做绝对坐标系,cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的是相对与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。世界坐标系和GL坐标系一致,原点在屏幕左下角,
本地坐标系本 地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移动或改变 方向。比如用cocos2d-x创建了个矩形colorLayer:CCRect(10,10,100,100),这是的本地坐标系为以(10,10)为 坐标原点,x轴向右,y轴向上。如果创建了一个CCSprite,锚点为(0.5,0.5),位置为(100,100),size为(40,40),这时的本地坐标系为以(80,80)为坐标原点,x轴向右,y轴向上。总之,本地坐标系原点为node的左下角坐标
接下来,convertToNodeSpace:调用CCPoint&point&=&node1-&convertToNodeSpace(node2-&getPosition());
将node2的坐标转化成相对于node1的本地坐标
比如坐标如上图所示,node1的锚点为(0,0),node2的锚点为(1,1),转化之后,node的坐标变成了(-25,-60)
下页为您接续带来Cocos2d-x个人研究
而convertToWorldSpace:调用CCPoint&point&=&node1-&convertToWorldSpace(node2-&getPosition());
是将node的坐标转化成相对于node1的世界坐标,如上图所示:首先将node1的坐标当做世界坐标,然后让node2的坐标位置重置成相对于node1的世界坐标,也就是(15,20)
convertToNodeSpaceAR,就是把node1的坐标系原点设置在锚点的位置,这里的锚点是(0,0)所以转化之后的坐标系位置和上面的convertToNodeSpace一样,结果也是一样的,convertToWorldSpaceAR同理
CCSprite&*sprite1&=&CCSprite::spriteWithFile(&CloseNormal.png&);
sprite1-&setPosition(ccp(20,40));
sprite1-&setAnchorPoint(ccp(0,0));
this-&addChild(sprite1);
CCSprite&*sprite2&=&CCSprite::spriteWithFile(&CloseNormal.png&);
sprite2-&setPosition(ccp(-5,-20));
sprite2-&setAnchorPoint(ccp(1,1));
this-&addChild(sprite2);
CCPoint&point1&=&sprite1-&convertToNodeSpace(sprite2-&getPosition());
CCPoint&point2&=&sprite1-&convertToWorldSpace(sprite2-&getPosition());
CCPoint&point3&=&sprite1-&convertToNodeSpaceAR(sprite2-&getPosition());
CCPoint&point4&=&sprite1-&convertToWorldSpaceAR(sprite2-&getPosition());
CCLog(&position&=&(%f,%f)&,point1.x,point1.y);
CCLog(&position&=&(%f,%f)&,point2.x,point2.y);
CCLog(&position&=&(%f,%f)&,point3.x,point3.y);
CCLog(&position&=&(%f,%f)&,point4.x,point4.y);
运行结果:
position&=&(-25..000000)
position&=&(15..000000)
position&=&(-25..000000)
position&=&(15..000000)
和预算的一样
这里在将sprite1的锚点设置成(0.5,0.5),对convertToNodeSpaceAR和convertToWorldSpaceAR进行了进一步的测试
sprite1-&setAnchorPoint(ccp(0.5,0.5));
sprite1-&setPosition(ccp(100,100));
CCPoint&point5&=&sprite1-&convertToNodeSpaceAR(sprite2-&getPosition());
CCPoint&point6&=&sprite1-&convertToWorldSpaceAR(sprite2-&getPosition());
CCLog(&position&=&(%f,%f)&,point5.x,point5.y);
CCLog(&position&=&(%f,%f)&,point6.x,point5.y);
运算结果:
size&=&(40..000000)
position&=&(-105.0.000000)
position&=&(95..000000)
分析:重置的sprite1的坐标为(100,100),锚点为(0.5,0.5)所以对于convertToNodeSpaceAR和convertToWorldSpaceAR这两个方法的坐标系为原点(100,100),所以用convertToNodeSpaceAR转化之后的坐标为(-105,-120)用convertToWorldSpaceAR化之后的坐标为(95,80),和运算结果一样
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
关注聚焦聚焦关注头条
24H热文一周话题本月最赞
讲师:41546人学习过
讲师:108833人学习过
讲师:305263人学习过
精选博文论坛热帖下载排行
本书根据教育部考试中心2004年最新发布的《全国计算机等级考试大纲》编写,针对计算机等级考试三级网络技术各方面的考点进行讲解和训练。本...
订阅51CTO邮刊