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
plain
copy

  1. CGSize screenSize = [[CCDirector sharedDirector] winSize];
  2. float imageHeight = player.contentSize.height;
  3. player.position = CGPointMake(screenSize.width / 2, imageHeight / 2);

仿射变换

一般来说游戏中会大量使用旋转,缩放,平移等仿射变换( 所谓仿射变换是指在线性变换的基础上加上平移。平移不是线性变换)。2D计算机图形学中的仿射变换一般是通过和3x3齐次矩阵相乘来实现的。cocos2d中的仿射变换使用了Quartz 2D中的CGAffineTransform类来表示:

  1. struct CGAffineTransform {
  2. CGFloat a;
  3. CGFloat b;
  4. CGFloat c;
  5. CGFloat d;
  6. CGFloat tx;
  7. CGFloat ty;
  8. };
  9. 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
plain
copy

  1. | m[0] m[4] m[8]  m[12] |     | m11 m21 m31 m41 |     | a c 0 tx |
  2. | m[1] m[5] m[9]  m[13] |     | m12 m22 m32 m42 |     | b d 0 ty |
  3. | m[2] m[6] m[10] m[14] | <=> | m13 m23 m33 m43 | <=> | 0 0 1  0 |
  4. | m[3] m[7] m[11] m[15] |     | m14 m24 m34 m44 |     | 0 0 0  1 |

PS关于3x3齐次矩阵: 

对于2D平面上的点[x,y]。2x2的变换矩阵(右乘)表示的是线性变换,不包括平移。这非常easy理解:依据矩阵乘法的性质。零向量总是变换成零向量,因此不论什么能用矩阵乘法表达的变换都不包括平移。其实,平移是矩阵加法。而不是矩阵乘法。齐次坐标系的引入是一种数学上的技巧。通过合并矩阵运算中的乘法和加法,使得变换矩阵能够处理平移。所谓齐次坐标就是将一个原本是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时表示的是向量。

cocos2dx坐标系介绍的更多相关文章

  1. Cocos2d-x坐标系介绍

    在图形图像和游戏应用开发中坐标系是非常重要的,我们在Android和iOS等平台应用开发的时候使用的二维坐标系它的原点是在左上角的.而在Cocos2d-x坐标系中它原点是在左下角的,而且Cocos2d ...

  2. 二、Cocos2dx概念介绍(游戏开发中不同的坐标系,cocos2dx锚点)

    注:ccp是cocos2dx中的一个宏定义,#define ccp(__X__,__Y__)CCPointMake((float)__X__, (float)__Y__),在此文章中表示坐标信息 1. ...

  3. 开源地图编辑器 MarbleMap,支持Cocos2d-x坐标系

    由9秒社团开发并维护的MarbleMap是支持Cocos2d-x坐标系和as3坐标系的地图编辑器,功能完善高效.这里详细介绍一下它的使用方法! 一.功能简述 由9秒社团开发并维护的MarbleMap是 ...

  4. cocos2dx坐标系

    原文转载:http://blog.csdn.net/ejet_shen/article/details/17327223 cocos2dx坐标系 支持下面几种坐标系: 1.屏幕坐标系 原点在左上角,X ...

  5. 深入理解 cocos2d-x 坐标系

    首先对于初学的,带大家认识 cocos2d-x 中坐标系的几个概念,参考 http://blog.csdn.net/tskyfree/article/details/8292544.其他的往下看. 弄 ...

  6. 《转载》深入理解 cocos2d-x 坐标系

    原文地址:http://www.cnblogs.com/lyout/p/3292702.html. 首先我们添加两个测试精灵(宽:27,高:40)到场景里面: CCSprite *sprite1 = ...

  7. cocos2d-x坐标系

    在cocos2d-x在,有几种不同的坐标系. 因为有好几个坐标系着一定的差异,他们需要明白,能力更精确的绘制各种图形画面上. 1.屏幕坐标系 只windows通过绘制图形上基本都知道.相应的坐标系统: ...

  8. cocos2d-x坐标系详解

    cocos2d-x官方文档 笛卡尔坐标系 不同坐标系简介 笛卡尔坐标系 你可能上学的时候就已经知道“笛卡尔坐标系”了,它在几何课本里经常用到.如果你已经忘得差不多了,下面这些图片可以很快唤起你的记忆: ...

  9. cocos2d-x 坐标系

    OPenGL坐标系:原点为屏幕左下角 屏幕坐标系:原点在屏幕左上角

随机推荐

  1. [转]TCP(HTTP)长连接和短连接区别和怎样维护长连接

    原文链接 一.HTTP协议和TCP协议 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题, ...

  2. capacity <<= 1

    import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.prefs.B ...

  3. C# 如何调试安装包

    在需要调试的地方插入如下代码即可启动调试:  System.Diagnostics.Debugger.Launch();

  4. 信号的捕捉与sigaction函数

    一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SI ...

  5. Python 字典 pop() 方法

    描述 Python 字典 pop() 方法删除给定键所对应的键/值对,并返回被删除的值.给定键如果不在字典中,则必须设置一个default值,否则会报错,此时返回的就是default值. 语法 pop ...

  6. Python 列表 reverse() 方法

    描述 Python 列表 reverse() 方法对列表中的元素进行反向排序. 语法 reverse() 方法语法: L.reverse() 参数 无. 返回值 该方法没有返回值,但是会对列表的元素进 ...

  7. linux中init.d文件夹的说明

    一.简单说明 /etc/init.d 是 /etc/rc.d/init.d 的软链接(soft link).可以通过 ll 命令查看. ls -ld /etc/init.d lrwxrwxrwx. r ...

  8. Clojure 的 Enlive 库尝试

    Enlive 是一个 Clojure 下的 html 模板引擎.其特别之处在于,它既没有发明任何 html 内嵌的模板 DSL 语法:也不会混杂代码和表现. 一切的一切,都是按下列模型定义的次序执行的 ...

  9. git使用(二)----创建版本库

    创建版本库(操作都是在linux环境下) 什么是版本库呢?版本库又名仓库,英文名repository,其实就是一个目录,可以进行增删查改 创建一个目录,这里在根目录下创建一个git_home目录mkd ...

  10. 【Android】12.2 利用Intent启动和关闭Activity

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法 ...