坐标笔记

UI坐标

UI坐标就是Android和iOS等应用开发的时候使用的二维坐标系。它的原点是在左上角的。

UI坐标原点是在左上角,x轴向右为正,y轴向下为正。我们在Android和iOS等平台使用的视图、控件等都是遵守这个坐标系。然而在Cocos2d-x默认不是采用UI坐标,但是有的时候也会用到UI坐标,例如在触摸事件发生的时候,我们会获得一个触摸对象(Touch),触摸对象(Touch)提供了很多获得位置信息的函数,如下面代码所示:

CCPoint touchLocation = touch->getLocationInView();

使用getLocationInView()函数获得触摸点坐标事实上就是UI坐标,它的坐标原点在左上角,而不是Cocos2d-x默认坐标,我们可以采用下面的语句进行转换:

CCPoint touchLocation2 = CCDirector::sharedDirector()->convertToGL(touchLocation);

通过上面的语句就可以将触摸点位置从UI坐标转换为OpenGL坐标,OpenGL坐标就是Cocos2d-x默认坐标。

OpenGL坐标

OpenGL坐标是种三维坐标。由于Cocos2d-x底层采用OpenGL渲染,因此的默认坐标就是OpenGL坐标,只不过只采用两维(x和y轴)。如果不考虑z轴,OpenGL坐标的原点在左下角,x轴向右为正,y轴向上为正。

世界坐标和模型坐标

由于OpenGL坐标有可以分为:世界坐标和模型坐标,所以Cocos2d-x的坐标也有世界坐标和模型坐标。

有的时候我们需要将世界坐标与模型坐标互相转换。我们可以通过Node对象如下函数实现:

CCPoint convertToNodeSpace ( const CCPoint& worldPoint )。将世界坐标转换为模型坐标。

CCPoint convertToNodeSpaceAR ( const CCPoint& worldPoint )。将世界坐标转换为模型坐标。AR表示相对于锚点。

CCPoint convertTouchToNodeSpace ( CCTouch *touch )。将世界坐标中触摸点转换为模型坐标。

CCPoint convertTouchToNodeSpaceAR ( CCTouch *touch )。将世界坐标中触摸点转换为模型坐标。AR表示相对于锚点。

CCPoint convertToWorldSpace ( const CCPoint& worldPoint )。将模型坐标中触摸点转换为世界坐标。

CCPoint convertToWorldSpaceAR ( const CCPoint& worldPoint )。将模型坐标中触摸点转换为世界坐标。AR表示相对于锚点。

通过例子了解一下世界坐标与模型坐标互相转换。

1、世界坐标转换为模型坐标

在游戏场景中有两个Node对象,其中Node1的坐标是B(240, 160),大小是120 x 40像素。Node2的坐标是C(80, 80),大小也是120 x 40像素。这里的坐标事实上就是世界坐标,它的坐标原点是屏幕的左下角。

编写代码如下:

bool HelloWorld::init()
{
    bool bRet = false;
    do
    {

        CC_BREAK_IF(! CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)));

        CCSprite* pNode1 = CCSprite::create("node1.jpg");
        pNode1->setPosition(ccp(240, 160));
        pNode1->setAnchorPoint(ccp(1, 1));
        this->addChild(pNode1, 0);

        CCSprite* pNode2 = CCSprite::create("node2.jpg");
        pNode2->setPosition(ccp(80, 80));
        pNode2->setAnchorPoint(ccp(0.5, 0.5));
        this->addChild(pNode2, 0);

        CCPoint ponit1 = pNode1->convertToNodeSpace(pNode2->getPosition());
        CCPoint ponit2 = pNode1->convertToNodeSpaceAR(pNode2->getPosition());  

        CCLog("Node2 NodeSpace = (%f,%f)",ponit1.x,ponit1.y);
        CCLog("Node2 NodeSpaceAR = (%f,%f)",ponit2.x,ponit2.y);  

        bRet = true;
    } while (0);

    return bRet;
}

运行结果如下:

Node2 NodeSpace = (-40.000000,-40.000000)
Node2 NodeSpaceAR = (-160.000000,-80.000000)

Node2的世界坐标转换为相对于Node1的模型坐标,就是将Node1的左下角作为坐标原点(图中的A点),A点的世界坐标是(240-120,160-40),那么convertToNodeSpace函数就是C(80, 80)点坐标减去A(120,120)点坐标,结果是(-40,-40)。而convertToNodeSpaceAR函数要考虑锚点,因此坐标原点是B点,C(80, 80)点坐标减去B(240, 160)点坐标,结果是(-160, -80)。

2、模型坐标转换为世界坐标

在游戏场景中有两个Node对象,其中Node1的坐标是B(240, 160),大小是120 x 40像素。Node2是放置在Node1中的,它对于Node1的模型坐标是C(0, 0),大小60 x 20像素。

编写代码如下:

bool HelloWorld::init()
{
    bool bRet = false;
    do
    {

        CC_BREAK_IF(! CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)));

        CCSprite* pNode1 = CCSprite::create("node1.jpg");
        pNode1->setPosition(ccp(240, 160));
        pNode1->setAnchorPoint(ccp(1, 1));
        this->addChild(pNode1, 0);

        CCSprite* pNode2 = CCSprite::create("node2.jpg");
        pNode2->setPosition(ccp(0, 0));
        pNode2->setAnchorPoint(ccp(0, 0));
        pNode1->addChild(pNode2, 0);

        CCPoint ponit1 = pNode1->convertToWorldSpace(pNode2->getPosition());
        CCPoint ponit2 = pNode1->convertToWorldSpaceAR(pNode2->getPosition());  

        CCLog("Node2 WorldSpace = (%f,%f)",ponit1.x,ponit1.y);
        CCLog("Node2 WorldSpaceAR = (%f,%f)",ponit2.x,ponit2.y);  

        bRet = true;
    } while (0);

    return bRet;
}

运行结果如下:

Node2 WorldSpace = (120.000000,120.000000)
Node2 WorldSpaceAR = (240.000000,160.000000)

Node2的模型坐标转换为相对于Node1的世界坐标,就是将Node1的左下角作为坐标原点(图中的A点),A世界坐标是(240-120,160-40),那么convertToWorldSpace函数就是C(0,0)点坐标加上A(120,120)点坐标,结果是(120,120)。而convertToWorldSpaceAR函数要考虑锚点,因此坐标原点是B点,C(0,0)点坐标加上B(240,160)点坐标,结果是(240,160)。

时间: 2024-10-13 06:15:16

坐标笔记的相关文章

Maven学习笔记之——坐标和依赖(上)

Maven学习笔记之--坐标和依赖(上) 1.    Maven坐标概念 Maven通过构件的坐标来在Maven仓库中定位到具体的构件.Maven的坐标元素包括groupId.artifactId.versiion.packaging.classifier.Maven内置了一个中央仓库地址.需要时Maven会根据坐标到其中下载.具体关于中央仓库的介绍在后面. 2.    Maven坐标详解 比如下面一组坐标: <groupId>org.andy.items</groupId> &l

Maven学习笔记之——坐标和依赖(中)

Maven学习笔记之--坐标和依赖(中) 1.    传递性依赖 1.1    何为传递性依赖 项目中经常有引入一个jar包还要引入其他与其相关的jar包.自己搜的话要注意很多.比如版本问题等.而Maven会解析解析各个直接依赖的POM.将哪些必要的间接依赖以传递依赖的形式引入到项目中. 依赖范围不仅可以控制依赖与三种classpath关系.还对传递依赖产生影响. 假设A依赖B,B依赖C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖.第一直接依赖的范围和第二直接依赖

Maven学习笔记之——坐标和依赖(下)

Maven学习笔记之--坐标和依赖(下) 1.    最佳实践 归纳Maven依赖使用的常用技巧.方便用来避免和处理很多常见问题. 1.1.     排除依赖 传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理.但是有些时候这种特性也会带来问题.例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目.这时候需要排除掉该SNAPSH

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第四步---编辑器(3)--坐标保存&amp;加载文件操作

/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别完全照搬代码:第二可以说明是学习笔记---好人 **3.这里用cocos2d-x 3.0版本重写,很多地方不同,但是从重写过程中也很好的学习了cocos2d-x */ ***每一步对应的所有代码以及用到的资源都会打包在最后给出 ***为避免代码过多,每一步的代码都做了标记--一看就晓得是第几步实现的避免出错改不回去(难不成还用Git

Maven学习笔记(四):坐标与依赖

Maven坐标详解: Maven定义了这样一组规则:世界上任何一个构件都可以使用Maven坐标唯一标识,Maven坐标的元素包括groupId.artifactId.version.packaging.classifier.我们只需要提供正确的坐标元素,Maven就能找到对应的构件.比如当需要使用Java5平台上的TestNG的5.8版本时,就告诉Maven:"groupId=org.testng; artifactId=testng; version=5.8; classifer=jdk15,

【cocos2d-x学习笔记】ZOder、tag、场景切换、精灵的各种创建方式、三个特殊层、坐标体系

ZOder: 1.是描述渲染顺序的值,每个CCNode都有ZOder,默认是0. 2.ZOder越大则越后面绘制.如果ZOder值相同,那么看arrival(全局变量每次加一)顺序,先加入的节点先绘制,ZOder只在相同父节点的节点直接进行比较 tag:是一个节点的身份证,方便通过getChildByTag来获取节点对象,它的意义在于减少成员变量 TAG只在相同父节点的节点之间有效 TAG在相同父节点的儿子之间不能相同,相同情况cocos不报错,getChildByTag可能会获取到不是你想要的

精通D3.js学习笔记(2)比例尺和坐标

1.线性比例尺 d3.scale.linear()   创建一个线性比例尺 .domain([0,500]) 定义域 .range([0,1000]) 值域 linear(x)  输入定义域 返回 值域 linear.invert(y) 输入值域,返回定义域 linear.domain([numbers]) 设定或获取定义域 linear.range([values])设定或获取值域 linear.rangeRound([valuses]) 四舍五入,结果是整数 linear.clamp([bo

Maven学习笔记之坐标

作为依赖管理工具,Maven定义了坐标用于唯一标识构件在仓库中的位置,构成了依赖管理的底层基础. Maven构件的坐标包括: groupId定义隶属实际项目的名称,一般是隶属组织或公司域名的倒序加上实际项目名称: artifactId定义模块的名称,一般是实际项目名称加上子模块名称.一个模块可能包含多个子模块,便于模块化管理: version定义模块的版本,主要包括稳定版本和SNAPSHOT版本: packaging定义模块的打包方式,常用的打包方式包括: - jar是普通模块的打包方式,即不在

Three.js 学习笔记(1)--坐标体系和旋转

前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library. The library provides <canvas>, <svg>, CSS3D and WebGL renderers.(该项目的目标是创建一个易于使用,轻量级的3D库.该库提供了<canvas>,<svg>,CSS3D和WebGL渲染器.) 示例