文档章节

世界坐标系,本地坐标系,opengl坐标系,屏幕坐标系

_子墨
 _子墨
发布于 2014/12/02 02:50
字数 1158
阅读 652
收藏 0
bool HelloWorld::init()
{
    bool bRet = false;
    do
    {

        CC_BREAK_IF(! CCLayer::init());
		//opengl的坐标系和世界坐标系相同,都是以屏幕左下角为原点,向右为x轴的增加方向,向上为y轴的增加方向
		//这里的世界指的是游戏世界
		//屏幕坐标系是以左上角为原点,是我们熟悉的
     //本地坐标系也叫节点坐标系,世界坐标系是相对于整体而言的,而本地坐标系是相对于父节点而言的,理解这点很重要

		//CCDirector::sharedDirector()->convertToGL() 转换到OPENGL坐标系
		//CCDirector::sharedDirector()->convertToUI() 转换到屏幕坐标系
		//CCNode::convertToWorldSpace()	把本地坐标系转换到世界坐标系
		//CCNode::convertToNodeSpace()	把世界坐标系转换到本地坐标系

		//sprite1、sprite2的图片大小是100,100
		CCSprite * sprite1 = CCSprite::create("image1.png");
		sprite1->setPosition(ccp(100,100));

		//将sprite2添加到sprite1节点中,这时候是以sprite1的左下角为原点,虽然sprite1的锚点是在它图片的中间
		CCSprite * sprite2 = CCSprite::create("image2.png");
		//setPosition中设置的坐标是sprite2的本地坐标
		sprite2->setPosition(ccp(100,100));
		sprite1->addChild(sprite2);

		//getPosition中获得的坐标也是sprite2的本地坐标
		CCPoint point = sprite2->getPosition();
		CCLog("point.x=%f,point.y=%f",point.x,point.y);

		//获得sprite2的opengl坐标系,屏幕坐标系,世界坐标系,本地坐标系

		//convertToWorldSpace的传入参数是sprite2的节点坐标系(本地坐标),也就是setPosition中传入的参数,而convertToNodeSpace的传入参数是sprite2的世界坐标系,看清谁是调用者,传入的参数又是什么
		CCPoint worldSpace = sprite1->convertToWorldSpace(point);
		CCPoint nodeSpace = sprite1->convertToNodeSpace(worldSpace);

		//以下俩个函数完成同样的功能,只不过这次的sprite2的坐标是基于sprite1的锚点的,而不是左下角了,所以我们传入了ccp(50,50)
		CCPoint worldSpaceAR = sprite1->convertToWorldSpaceAR(ccp(50,50));
		CCPoint nodeSpaceAR = sprite1->convertToNodeSpaceAR(worldSpaceAR);

		//convertToUI中传入的是opengl坐标系,因为opengl坐标和世界坐标系是相同的,所以我们传入世界坐标
		CCPoint ui = CCDirector::sharedDirector()->convertToUI(worldSpace);
		CCPoint opengl = CCDirector::sharedDirector()->convertToGL(ui);

		CCLog("opengl.x=%f,opengl.y=%f",opengl.x,opengl.y);
		CCLog("ui.x=%f,ui.y=%f",ui.x,ui.y);
		CCLog("worldspace.x=%f,worldspace.y=%f",worldSpace.x,worldSpace.y);
		CCLog("nodeSpace.x=%f,nodeSpace.y=%f",nodeSpace.x,nodeSpace.y);
		CCLog("worldspaceAR.x=%f,worldspaceAR.y=%f",worldSpaceAR.x,worldSpaceAR.y);
		CCLog("nodeSpaceAR.x=%f,nodeSpaceAR.y=%f",nodeSpaceAR.x,nodeSpaceAR.y);

		this->addChild(sprite1);

        bRet = true;
    } while (0);

    return bRet;
}

补充:

1.屏幕坐标系 原点在左上角,X轴向右,Y轴向下。
2.GL坐标系 原点在左下角,X轴向右,Y轴向上。
3.世界坐标系 指相对于整个屏幕的坐标系,(0,0)就是屏幕的左下角,(320,480)就是屏幕的右上角。
4.本地坐标系 相对于父对象的坐标。

[obj.parent convertToWorldSpace:[obj position]];  //获得obj的世界坐标
[obj.parent convertToNodeSpace:[obj position]];  //获得obj的本地坐标
[[CCDirector sharedDirector] convertToGL:*****(0,0)];  //获得GL坐标
[[CCDirector sharedDirector] convertToUI:*****(0,0)];  //获得屏幕坐标

  在调用任何需要设置位置的函数,或从函数获取位置信息前,必须要明确这个函数使用哪个坐标系。比如调用CCNode类的setPosition函数,它使用的就是GL坐标系。比如在处理触摸事件时CCTouch对象中的坐标就是屏幕坐标系。
  另一个重要的坐标系就是和Node相关的本地坐标系。这个结构和一般做3D用的场景树的概念是一样的。所以从Node拿到的位置是该节点的本地坐标,需要通过特定的函数才能把本地坐标转换为世界坐标。而且这里的坐标都用的是GL坐标系。在CCNode对象中有几个方便的函数可以做坐标转换。convertToWorldSpace方法可以把基于当前node的本地坐标系下的坐标转换到世界坐标系中。convertToNodeSpace方法可以把世界坐标转换到当前node的本地坐标系中。
  另一个关键的问题就是在cocos2d里面就是各种对象的大小问题。因为在cocos2d里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候就必须根据情况明确指定获取对象原始大小,还是缩放后的大小。当然cocos2d里提供了对应的函数来完成这些操作。
  getContentSize 函数用来获得节点原始的大小。
  boundingBox 函数用来获得经过缩放和旋转之后的外框盒大小。

      pTouch对象中的坐标是屏幕坐标系,所以必须转换到GL坐标系,再转换到父节点的本地坐标下。好在convertTouchToNodeSpace这个函数一次完成了这两个转换,可以参考该库的源码,其中有具体的计算过程。

本文转载自:http://www.zaojiahua.com/coordinate-system.html

下一篇: VS2012使用技巧
_子墨
粉丝 48
博文 157
码字总数 141425
作品 0
深圳
iOS工程师
私信 提问
Cocos2d-x-v3坐标体系

Cocos2d-x坐标体系 cocos2d引擎是一款非常优秀的扩平台的游戏开发引擎,在apple游戏榜上,有很多排名靠前的游戏都是由他创造出来的,他也有一套十分方便的坐标体系。 一、UI坐标体系 UI坐标体...

珲少
2015/08/03
317
0
Cocos2d-X学习笔记 坐标系统

Cocos2d-X开发中有2个重要的坐标系,屏幕坐标系和openGL坐标系。 一、屏幕坐标系 最常见的计算机图形系统坐标系,X轴向右,Y轴向下,坐标原点在屏幕的左上角。如下图: 二、openGL坐标系 如下...

林苏勃
2012/08/31
14
0
实验5 OpenGL变换综合练习

1.实验目的: 理解掌握OpenGL程序的投影变换,能正确使用投影变换函数,实现正投影与透视投影。 2.实验内容: (1)使用图a中的尺寸绘制小桌,三维效果图见图b。要求绘制小桌各部件时只能使...

小青_1989
2014/04/08
238
0
3D坐标系、矩阵变换、视景体与裁剪

背景 当前3D图形界主要有两个:微软的Direct 3D以及某组织的OpenGL。曾经一度OpenGL几乎占据所有3D图形领域,这在巨人微软面前简直就是屌丝逆袭。曾几何时微软搞IDE borland公式倒闭了,后来...

乐观的vc
2013/04/14
6.6K
0
android 3D游戏开发-glPushMatrix() glPopMatrix()

1 、 在opengl中,函数glTranslatef的作用就是移动坐标原点。对应的3个参数对应着3个坐标轴。就是使绘图坐标系相对世界坐标系沿x,y,z轴移动x,y,z个单位。 如果你调用一次glTranslatef(1.0f,0...

长平狐
2012/08/29
410
0

没有更多内容

加载失败,请刷新页面

加载更多

如何制作省市级别上钻下取的在线疫情地图

目前大多数省级尺度的疫情地图,不能精细的表达各个城市的疫情差异和发展事态。纯粹市级维度的地图由于全国市比较多,很难快速查看自己所在省市的疫情分布情况。我们制作一个省市下钻上取的疫...

空间数据可视化
今天
113
0
用Markdown编程之虚转实

没变成机器码之前,撒都是虚的。而要变成机器码必须有长度。有长度后必然是结构划分。之后就是逻辑正确。而逻辑正确可以看成正确的值。 由此,基础行为有:长度的比对转换、结构的解析、值的...

dwcz
今天
80
0
ASP之ADODB.Stream

ASP 其实很强,真的,很强... 但是,也很难,难就难在没有文档啊~~~ 因为 ASP 经常会用到很多服务器对象,本文记录下在 ASP 中的 Stream(流)操作。 ADODB.Stream 未完待续,敬请期待......

AioDiage
今天
71
0
从源码看世界:Springboot整合Mybatis后到底做了什么

在Mybatis一次数据库操作过程的文章中,我展示了使用Mybatis操作数据库的demo,但实际使用时并不会这里写代码,因为一般都会使用springboot了,那现在我们一起来看看Springboot整合Mybatis之...

壞天空_囝仔
今天
46
0
【自用】 Flutter GestureDetector 给控件添加监听事件

Dart GestureDetector( child: Text("xxxx"), onTap: () => _onXxxxCall(index), ) PS:自用的 不做解释 作者:一个吃货帅锅...

Tensor丨思悟
今天
67
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部