`
7090
  • 浏览: 280332 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)cocos2d 坐标系使用

 
阅读更多
GL坐标系
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.parent convertToWorldSpace:[node position]]。几乎所有的游戏引擎都会使用本地坐标系而非世界坐标系来指定元素的位置,这样做的好处是当计算物体运动的时候使用同一本地坐标系的元素可以作为一个子系统独立计算,最后再加上坐标系的运动即可,这是物理研究中常用的思路。例如一个在行驶的车厢内上下跳动的人,我们只需要在每帧绘制的时候计算他在车厢坐标系中的位置,然后加上车的位置就可以计算出人在世界坐标系中的位置,如果使用单一的世界坐标系,人的运动轨迹就变复杂了。

锚点
每一个CCNode都有一个锚点(anchor point),锚点指定了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 = [[CCDirector sharedDirector] winSize];  
float imageHeight = player.contentSize.height;  
player.position = CGPointMake(screenSize.width / 2, imageHeight / 2);  

仿射变换
一般来说游戏中会大量使用旋转,缩放,平移等仿射变换( 所谓仿射变换是指在线性变换的基础上加上平移,平移不是线性变换)。2D计算机图形学中的仿射变换通常是通过和3x3齐次矩阵相乘来实现的。cocos2d中的仿射变换使用了Quartz 2D中的CGAffineTransform类来表示:
[cpp] view plaincopy
struct CGAffineTransform {  
   CGFloat a;  
   CGFloat b;  
   CGFloat c;  
   CGFloat d;  
   CGFloat tx;  
   CGFloat ty;  
};  
typedef struct CGAffineTransform CGAffineTransform;  

CGAffineTransform类表示的齐次矩阵如下,由于变换矩阵最后一列总是[0,0,1],所以被省略了:

由于cocos2d的绘制使用了OpenglES,因此CGAffineTransform只是用来表示2D仿射变换,最终还是要转化成OpenglES的4x4变换矩阵(Opengl是3D的世界,因此它接受的齐次矩阵是4x4的)。转换工作由CGAffineToGL(const CGAffineTransform *t, GLfloat *m)来完成,Opengl的变换矩阵以一维数组表示,它和CGAffineTransform的映射关系如下:

[plain] view plaincopy
| m[0] m[4] m[8]  m[12] |     | m11 m21 m31 m41 |     | a c 0 tx | 
| m[1] m[5] m[9]  m[13] |     | m12 m22 m32 m42 |     | b d 0 ty | 
| m[2] m[6] m[10] m[14] | <=> | m13 m23 m33 m43 | <=> | 0 0 1  0 | 
| m[3] m[7] m[11] m[15] |     | m14 m24 m34 m44 |     | 0 0 0  1 | 
PS关于3x3齐次矩阵:
对于2D平面上的点[x,y],2x2的变换矩阵(右乘)表示的是线性变换,不包含平移。这很容易理解:根据矩阵乘法的性质,零向量总是变换成零向量,因此任何能用矩阵乘法表达的变换都不包含平移。事实上,平移是矩阵加法,而不是矩阵乘法。齐次坐标系的引入是一种数学上的技巧,通过合并矩阵运算中的乘法和加法,使得变换矩阵可以处理平移。所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。2D向量[x,y]的齐次表示就是[x,y,h],h叫做齐次因子,可以是任意非零值,因此一个向量的齐次表示是不唯一的,比如齐次坐标[8,4,2]、[4,2,1]表示的都是2D点[4,2]。h=0通常可以理解为无穷远点,通过计算不难发现,[x,y,0]乘以3x3平移变换矩阵,平移无效。换句话说,h分量有开关3x3矩阵的平移部分的功能。这个现象是非常有用的,尽管数学表示上相同,从几何意义上来说向量和点是完全不同的: 向量只表示方向,没有位置,而点表示位置,[x,y]可以代表向量也可以代表点(当表示点的时候,其实指的是相对于原点的位移)。点可以平移但向量不可以,因此从几何意义上讲,[x,y,h],当h≠0时表示的是点,当h=0时表示的是向量。

原文:http://blog.csdn.net/ring0hx/article/details/6962401
分享到:
评论

相关推荐

    Cocos2d-x开发游戏的坐标系知识介绍

    在游戏开发中,坐标系是一个基础而重要的概念,尤其是在使用Cocos2d-x这类游戏引擎时。坐标系关系到游戏元素在屏幕上的显示位置,以及游戏逻辑中对元素位置的处理。本文将详细介绍在Cocos2d-x中使用到的三种坐标系:...

    将3D坐标转成2D坐标的方法2

    转换后的坐标会处于屏幕的左上角为原点的坐标系中,其中x和y值范围在0到1之间。如果需要将其转换为像素坐标,可以乘以屏幕的宽度和高度。但需要注意的是,Unity的屏幕y轴方向是反的,因此,屏幕坐标系统的y轴是从...

    Cocos2d-x学习笔记(三)—— 坐标系

    Cocos2d-x学习笔记(三)—— 坐标系

    cocos2d入门cocos2d入门

    5. **坐标系**:在OpenGL ES中,坐标系原点位于屏幕底部中央,Y轴向上,X轴向右。`anchorPoint`是精灵的锚点,用于指定旋转和缩放的中心点。 6. **Menu与MenuItem**:菜单用于展示游戏的交互元素,如按钮。MenuItem...

    cocos2d-x文字描边Demo

    `draw()`方法允许我们在屏幕坐标系上直接绘制,因此我们可以在此处利用OpenGL ES的顶点数组和着色器来实现描边效果。通常,我们会先绘制原文字,然后在周围加上一圈与设定颜色和宽度一致的线条,以达到描边的效果。 ...

    cocos2d的资料

    3. **关于cocoa和cocos2d的简单坐标系关系**:Cocos2d是基于Cocoa Touch构建的,因此了解Cocoa中的坐标系统对理解Cocos2d的布局至关重要。在Cocos2d中,坐标原点通常位于屏幕左上角,而Y轴向下。熟悉这个坐标系统有...

    cocos2d-x obb 旋转碰撞 矩形

    在游戏开发领域,cocos2d-x是一款广泛使用的2D游戏引擎,它基于C++,并且支持多种平台,包括iOS、Android、Windows等。在cocos2d-x中,对象的碰撞检测是游戏物理系统的重要组成部分,对于创建交互式游戏至关重要。本...

    Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系

    在Cocos2d-x游戏中,理解各种坐标系的概念至关重要,因为它们定义了游戏对象在屏幕上的位置和相互关系。下面我们将详细探讨世界坐标系、本地坐标系、OpenGL坐标系以及屏幕坐标系。 1. **世界坐标系 (World ...

    如何用cocos2d制作一款简单的iphone游戏

    3. **确定位置**:Cocos2d使用左下角作为坐标原点(0,0),与常见的左上角坐标系不同。若要将玩家精灵放置在屏幕左侧中央,则x坐标应为玩家精灵宽度的一半,而y坐标则为屏幕高度的一半。 #### 进阶知识点 - **动画...

    opengl es以及cocos 2d教程

    - **坐标系**:OpenGL ES使用右手坐标系,Z轴正方向朝向屏幕内部。 - **着色器**:程序片段,运行在GPU上,负责颜色计算和光照效果。 - **帧缓冲区**:用于存储最终图像的内存区域。 - **纹理**:在图像数据上...

    cocos2d-x面试题DOCX文档

    当CCSprite对象转换坐标系的时候,它所包含的CCSprite对象也会转换坐标系。sprites是CCNode的子类,所以他们也可以使用actions来转换坐标。 三、CCNode CCNode是场景、层、菜单、精灵等所有节点的父类,它是一个...

    知易 Cocos2D-iPhone 游戏开发教程002

    Cocos2D-iPhone使用的是屏幕坐标系,原点位于左下角,x轴向右,y轴向上。这种坐标系与传统的直角坐标系有所不同,因此在处理位置和布局时需要注意坐标方向。Cocos2D-iPhone还提供了`CCPoint`和`CGSize`等类型,用于...

    cocos2d-x 自学文档

    cocos2d-x 遵循引用计数的内存管理策略,使用CCObject类的release()方法来释放对象,当对象的引用计数为0时,对象会被自动删除。此外,cocos2d-x还提供了autorelease()方法,用于自动释放对象,避免内存泄露。 五、...

    Cocos2D-X开发学习笔记-渲染框架之摄像机类的使用示例

    1. **位置(Position)**:摄像机在世界坐标系中的位置,决定了观察点。 2. **旋转(Rotation)**:摄像机的旋转角度,可以改变观察的方向。 3. **缩放(Zoom)**:摄像机的缩放比例,可以影响视野的大小。 4. **...

    cocos2d-x-2.2.3安卓横竖屏自动切换

    在cocos2d-x中,可以使用`CCEGLView::sharedOpenGLView()-&gt;setDeviceOrientation()`方法。例如,可以监听设备方向变化,当检测到变化时,调用该方法切换屏幕方向。 3. **处理布局和资源** 当切换横竖屏时,游戏的...

    【Cocos2d-x游戏引擎开发笔记(13)】Tiled Map Editor(一)

    在这个系列的开发笔记中,我们将深入探讨如何使用Cocos2d-x与Tiled Map Editor结合,创建和管理游戏地图。Tiled Map Editor是一款强大的2D地图编辑器,支持多种格式的图层和对象,为游戏设计师提供了灵活的布局设计...

Global site tag (gtag.js) - Google Analytics