cocos2dx : 世界坐标和模型坐标.

cocos2dx坐标系分为两块,一块是ui坐标,另外一块是世界坐标,也就是OpenGL的坐标.OpenGl是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库.OpenGL坐标是coco2dx的默认坐标.ui坐标就是以左上角为原点建立的坐标系,OpenGL坐标是以左下角为原点建立的三维坐标系.

一.ui坐标系和OpenGL坐标系的相互转换.在导演类中封装了两个坐标系的转换方法.
//ui坐标转化为OpenGL坐标.
1.Director::getInstance()->convertToGL(const Vec2 &point);
//OpenGL坐标转化为ui坐标.
2.Director::getInstance()->convertToUI(const Vec2 &ponit);

二.锚点和位置.
在cocos2dx中,位置是根据锚点和坐标位置两个因素来确定的,对于坐标大家都应该很清楚,主要就是锚点的问题了,首先锚点一定在精灵的身上,相对于矩形来说,锚点的大小范围是0-1左右都可取到.当锚点为0时,也就是锚点在矩形的左下角的点上,锚点为0.5时,在矩形的正中间,锚点为1时,在矩形的右上角的点上,下面做了个测试,可以很明显的看出结果.
    //设置锚点为左下角.结果左下角的位置为200,200
    auto sp1 = Sprite::create("HelloWorld.png");
    sp1->setPosition(Vec2(200,200));
    sp1->setAnchorPoint(Vec2(0,0));
    this->addChild(sp1,0);
    //没有设置锚点,因为默认锚点是0.5,0.5,也就是中心.结果中心的位置为200,200
    auto sp2 = Sprite::create("HelloWorld.png");
    sp2->setPosition(Vec2(200, 200));
    this->addChild(sp2, 1);
    //设置锚点在右上角.结果右上角的位置为200,200
    auto sp3 = Sprite::create("HelloWorld.png");
    sp3->setPosition(Vec2(200, 200));
    sp3->setAnchorPoint(Vec2(1, 1));
    this->addChild(sp3, 2);

    auto label1 = Label::createWithSystemFont("0,0","",20);
    label1->setPosition(300,300);
    this->addChild(label1,4);

    auto label2 = Label::createWithSystemFont("0.5,0.5", "", 20);
    label2->setPosition(200, 200);
    this->addChild(label2, 4);

    auto label3 = Label::createWithSystemFont("1,1", "", 20);
    label3->setPosition(100, 100);
    this->addChild(label3, 4);
继承Node的锚点默认都为0.5,0.5,锚点和坐标共同作用位置,即是把当前锚点的位置放置在指定坐标上!

这里写图片描述

三.OpenGL坐标的转换.
看下图,有两个精灵,且宽和高都为300,10.求Node1相对于Node2的位置.这里要搞清楚一个问题,我们把Node1中的(400,500)这个点相对于Node2的位置,那到底是Node2的哪个位置呢?一般默认是Node2左下角的这个点,当然也可以指定是Node2的锚点位置.

这里写图片描述

//在Node类中也封装了坐标的转换方法:
//以调用该方法的Node对象的左下角为原点建立坐标系,返回参数点的坐标在该坐标系下的相对坐标.
1.Vec2 convertToNodeSpace(const Vec2 &point);
Vec2 basePos = sp2->convertToNodeSpace(sp1->getPosition()); //这里是Vec2(350,250).
//以调用该方法的Node对象的锚点所在位置为原点建立坐标系,返回参数点的坐标在该坐标系下的相对坐标.
2.Vec2 convertToNodeSpaceAR(const Vec2 &point);
Vec2 baseARPos = sp2->convertToNodeSpaceAR(sp1->getPosition()); //这里是Vec2(200,200)
//把触摸点的坐标转化为模型坐标.只在触摸事件中用到...省略了touch->getLocation()这个方法..
3.Vec2 convertTouchToNodeSpace(Touch *touch)
//把触摸点的坐标转化为模型坐标.(锚点)
4.Vec2 convertTouchToNodeSpaceAR(Touch *touch)
//把模型坐标转化为世界坐标.
5.Vec2 convertToWorldSpace(const Vec2 &point);
//把相对于锚点的相对坐标转化为世界坐标.
6.Vec2 convertToWorldSpaceAR(const Vec2 &point);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值