UI坐标系与OpenGL坐标系

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

OpenGL坐标是三维坐标,由于Cocos2d-x Lua 底层采用OpenGL渲染,因此默认坐标就是OpenGL坐标,只不过采用了两维(XY轴),不考虑Z轴,OpenGL的坐标原点在左下角

获得UI坐标
cc.p touchLocation = touch:getLocationInView()
UI坐标转换为OpenGL坐标
cc.p touchLocation2 = cc.Director:getInstance:convertToGL(touchLocation)

这样就转换为Cocos2d -x Lua的默认坐标了

世界坐标系和模型坐标系

什么是世界坐标系和模型坐标系?

类似于你向别人问路,有的人告诉你向东1000M,然后向北走500M,这就是世界坐标

而有的人告诉你向左走1000M,然后向右走500M 这是模型坐标,以你自己为参照物

有时候我们需要将他们互换,可以通过Node对象函数实现

convertToNodeSpace ( worldPoint )  --将世界坐标转化为模型坐标
convertToNodeSpaceAR ( worldPoint ) --将世界坐标转化为模型坐标。AR表示相对于锚点

convertTouchToNodeSpace ( touch )  --将世界坐标系中的触摸点转化为模型坐标
convertTouchToodeSpace ( touch ) --将世界坐标系中的触摸点转化为模型坐标。AR表示相对于锚点

concertToWorldSpace ( nodePoint ) --将模型坐标转化为世界坐标
convertToWorldSpaceAR ( nodePonit ) --将模型坐标转化为世界坐标。AR表示相对于锚点

世界坐标转换为模型坐标

 --[[
 	--创建层 添加背景颜色为白色
 	local layer = cc.Layer:create()
 	local bg = cc.LayerColor:create(cc.c3b(255,255,255))
 	layer:addChild(bg)
 	--创建一个Item
 	local closeItem = cc.MenuItemImage:create(
 		"CloseNormal.png","CloseSelected.png")
 	closeItem:setPosition(cc.p(size.width - closeItem:getContentSize().width/2,
 								closeItem:getContentSize().height/2))
 	local  menu = cc.Menu:create(closeItem)
 		menu:setPosition(cc.p(0,0))
 		layer:addChild(menu)
 	--创建一个Node
 	local node1 = cc.Sprite:create("node1.png")
 		node1:setPosition(cc.p(400,500))
 		node1:setAnchorPoint(cc.p(1.0,1.0))
 	layer:addChild(node1,0)
 	--创建一个Node2
 	local node2 = cc.Sprite:create("node2.png")
 		node2:setPosition(cc.p(200,300))
 		node2:setAnchorPoint(cc.p(0.5,0.5))
 	layer:addChild(node2,0)
 	--获取Node2 世界坐标系转换为相对于node1的模型坐标
 	local posX,posY = node2:getPosition()
 	local point1 = node1:convertToNodeSpace(cc.p(posX,posY))
 	local point3 = node1:convertToNodeSpaceAR(cc.p(posX,posY))
 	cclog("Node2 x:"..point1.x.." y:"..point1.y)
 	cclog("Node2AR x:"..point3.x.." y:"..point3.y)
 	return layer
 	--
 	--Node 2   x: 100 y:-100  不管node1锚点,则以node1的左下角为原点,相对于node2的锚点
 	--AR        X:-200  y:-200  以node1的锚点(1.0,1.0)为原点,相对于node2的锚点
 	--]]

模型坐标转化为世界坐标

 	local layer = cc.Layer:create()
 	--层背景
 	local bg = cc.LayerColor:create(cc.c3b(255,255,255))
 	layer:addChild(bg)
 	--Item
 	local loseItem = cc.MenuItemImage:create("CloseNormal.png","CloseSelected.png")
 	loseItem:setPosition(cc.p(size.width - loseItem:getContentSize().width/2,
 						loseItem:getContentSize().height/2))
 	local men = cc.Menu:create(loseItem)
 	men:setPosition(cc.p(0,0))
 	layer:addChild(men)

 	--创建node1 添加到layer
 	local node1 = cc.Sprite:create("node1.png")
 	node1:setPosition(cc.p(400,500))
 	layer:addChild(node1,0)

 	--创建node2 添加到node1
 	local node2 = cc.Sprite:create("node2.png")
 	node2:setPosition(cc.p(0,0))
 	node2:setAnchorPoint(cc.p(0,0))
 	node1:addChild(node2,0)  --添加到node1 这样node2:setPosition(cc.p(0.0,0.0))变成了相对于node1					   --的相对坐标了 

 	local posX,posY = node2:getPosition()--A点的位置
 	cclog(""..posX.."--"..posY)
 	local point1 = node1:convertToWorldSpace(cc.p(posX,posY))
 		--将Node2的坐标转化为世界坐标
 	local point3 = node1:convertToWorldSpaceAR(cc.p(posX,posY))
 		--将Node2的坐标转化为世界坐标,相对于锚点的位置
 	cclog("point X:" .. point1.x .. "  Y:" .. point1.y)
 	cclog("pointAR X:" .. point3.x .. "  Y:" .. point3.y)

 	return layer
 	--
 	--得到的结果是 point: x = 250 y = 450	就是node1的原点与坐标轴原点的相对值
 	--得到的结果是 pointAR: x = 400 y = 500   就是node1的锚点与坐标轴原点的相对值
 	--

模型坐标转化为世界坐标有点跟书上介绍的不同,是我自己理解的,有误解的话欢迎指出

Cocos2d-x 核心概念 - 坐标系(UI.OpenGL.世界坐标系.模型坐标系)的更多相关文章

  1. Netty核心概念(8)之Netty线程模型

    1.前言 第7节初步学习了一下Java原本的线程池是如何工作的,以及Future的为什么能够达到其效果,这些知识对于理解本章有很大的帮助,不了解的可以先看上一节. Netty为什么会高效?回答就是良好 ...

  2. OpenGL中各种坐标系的理解[转]

    OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...

  3. cocos2d-x 屏幕坐标系和OPenGL坐标系转换

    转自:http://home.cnblogs.com/group/topic/57609.html cocos2d坐标系(OPenGL坐标系):以左下角为原点,x向右,y向上 屏幕坐标系(androi ...

  4. Redux 核心概念

    http://gaearon.github.io/redux/index.html ,文档在 http://rackt.github.io/redux/index.html .本文不是官方文档的翻译. ...

  5. TensorFlow.js之安装与核心概念

    TensorFlow.js是通过WebGL加速.基于浏览器的机器学习js框架.通过tensorflow.js,我们可以在浏览器中开发机器学习.运行现有的模型或者重新训练现有的模型. 一.安装     ...

  6. (转)Maven学习总结(四)——Maven核心概念

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...

  7. OpenGL中各种坐标系的理解

    转载:https://blog.csdn.net/meegomeego/article/details/8686816 OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系以屏幕中心为原 ...

  8. Ext JS 6学习文档–第2章–核心概念

    核心概念 在下一章我们会构建一个示例项目,而在这之前,你需要学习一些在 Ext JS 中的核心概念,这有助于你更容易理解示例项目.这一章我们将学习以下知识点: 类系统,创建和扩展类 事件 Ext JS ...

  9. Storm 学习之路(二)—— Storm核心概念详解

    一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的Storm流处理程序被称为Storm topology(拓扑).它是一个是由Spouts 和Bolts通过Stream连接起来的 ...

随机推荐

  1. MWeb 1.6 发布!Dark Mode、全文搜寻、发布到Wordpress、Evernote 等支持更新、编辑/预览视图模式等

    Dark Mode 使用 View - Dark Mode 或快捷键 CMD + Option + L 开启或关闭 Dark Mode.可以在设置中设置 Dark Mode 状态下编辑器所使用的样式, ...

  2. JOIN,WHERE判断和ORDERBY排序

    MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小. 如果重复代码只是 ...

  3. rhel 7.0, windows10双系统grub2设置

    因为在win10基础上装了rhel7,但是启动时却没有win10的启动项,下面的方法解决此问题. $ su #root登录 $ cd /boot/grub2 1. 简单执行grub2-mkconfig ...

  4. 添加系统右键菜单项 管理员取得所有权(W)(带盾牌)

    @color 0A @title 添加系统右键菜单项 管理员取得所有权(^&W)(带盾牌) by wjshan0808 @echo off echo * >nul reg add HKC ...

  5. 完美解决 nginx No input file specified.

    一次开发中遇到了这个问题:No input file specified nginx版本1.8 找遍网络都是说 fastcgi_param SCRIPT_FILENAME $document_root ...

  6. Array.prototype.slice.call(arguments)

    Array.prototype.slice.call(arguments)能够将具有length属性的对象转化为数组, 可以理解为将arguments转化成一个数组对象,让它具有slice方法 如: ...

  7. UVALive 7139 Rotation(矩阵前缀和)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  8. swift基础:第二部分:函数和闭包

    今天本来想利用上午的时间本来打算将swift基础部分学习完的,不巧的是,后台来和我讨论用户评价的接口,讨论过后,商讨出一种可行的方案,十几分钟时间过去了,我拿到将接口介入到已经完成的页面中,完美,终于 ...

  9. 夺命雷公狗-----React---25--小案例之react经典案例todos(单选框的修改)

    还是老样子,首先给li里面的单选框一个函数,然后通过props来对她进行处理 然后在ul里面对父组建进行传送 补充一下啊第一步,因为到时候要用到index属性,所以我们需要发送多一个index过来 然 ...

  10. 【转】Delphi+Halcon实战一:两行代码识别QR二维码

    Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...