Cocos2dx个人笔记之坐标系

来源:互联网 发布:淘宝自己的评价不见了 编辑:程序博客网 时间:2024/05/20 04:46

首先要了解几个概念性的东西:

OpenGL坐标系

Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系。GL坐标系原点在屏幕左下角,x轴向右,y轴向上。
屏幕坐标系
ios的Quarze2D使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下。ios的屏幕触摸事件CCTouch传入的位置信息使用的 是该坐标系。因此在cocos2d中对触摸事件做出响应前需要首先把触摸点转化到GL坐标系。可以使用CCDirector的convertToGL来完成这一转化。
世界坐标系
世界坐标系也叫做绝对坐标系,我们能够用世界坐标系来描述其他坐标系的位置,cocos2d中的元素是有父子关系的层级结构,我们通过CCNode的position设定元素的位置使用的 是相对 与其父节点的本地坐标系而非世界坐标系。最后在绘制屏幕的时候cocos2d会把这些元素的本地坐标映射成世界坐标系坐标。世界坐标系和GL坐标系一致, 原点在屏幕左下角,x轴向右,y轴向上。
本地坐标系(节点坐标系)
本地坐标系也叫做物体坐标系,是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系,当物体移动或改变方向时,和该物体关联的坐标系将随之移 动或改变方向。CCNode的position使用的就是父节点的本地坐标 系,它和GL坐标系也是一致的,x轴向右,y轴向上,原点在父节点的左下角。如果父节点是场景树中的顶层节点,那么它使用的本地坐标系就和世界坐标系重合 了。几 乎所有的游戏引擎都会使用本地坐标系而非世界坐标系来指定元素的位置,这样做的好处是当计算物体运动的时候使用同一本地坐标系的元素可以作为一个子系统独 立计算,最后再加上坐标系的运动即可。
锚点

每一个CCNode都有一个锚点(anchorpoint),锚点指定了texture上和所在节点原点(也就是position所表示的点)重合 的点的位 置,因此只有在节点使用了texture的情况下,锚点才有意义。锚点的默认值是(0.5,0.5),它表示的并不是一个像素点,而是一个乘数因子。 (0.5, 0.5)表示锚点位于texture长度乘以0.5和宽度乘以0.5的地方,即texture的中心。改变锚点的值并不会改变节点的位置 (position),虽然可能看起来节点的图像位置发生了变化。

以下是世界坐标系与节点坐标系转换的四个重要方法:

//把世界坐标转换到当前节点的本地坐标系中,不考虑锚点,以当前父节点的左下角的坐标为标准

CCPoint convertToNodeSpace(const CCPoint& worldPoint);
//把基于当前节点的本地坐标系下的坐标转换到世界坐标系中,不考虑锚点,以当前父节点的左下角的坐标为标准

CCPoint convertToWorldSpace(const CCPoint& nodePoint);

//把世界坐标转换到当前节点的本地坐标系中,基准坐标基于坐标锚点

CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);

////把基于当前节点的本地坐标系下的坐标转换到世界坐标系中,基准坐标基于坐标锚点

CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);

0 0
原创粉丝点击