this.node.convertToNodeSpaceAR(event.getLocation());
点击屏幕中心点只有一种屏幕是(0, 0),不同屏幕不同值,这个是什么原因导致的,怎么解决?
这个方法是将世界坐标转换为节点坐标,你每次的event.getLocation()取到的值是一样的吗?
不同屏幕中心点的世界坐标值不一样,但转换成节点坐标应该都是(0,0)才对,不知道什么原因,对了现在用UITransform的convertToNodeSpaceAR转换的
怎么会都是(0,0)呢,convertToNodeSpaceAR其实是将一个世界坐标系的点转换为局部坐标系(以节点锚点为坐标原点)中的点。
比如我放一个圆在屏幕中心点,然后点击屏幕中心点,把点击获取的世界坐标值转成这个圆(节点)的局部坐标系值
如果圆的坐标=屏幕中心点坐标,把中心点坐标传进去确实会变为(0,0)。
我现在用的是960 x 640屏幕分辨率,只有用这种屏幕才正常
这么神奇吗,我一直没遇到过
3.0不知道,我用2.4遇到过这样的问题,原因是canvas节点上的widget组件被我删掉了,重新加上就没问题了
你的答案可能在这
touch 获得的 getLocation() 的坐标 的 坐标系 是 摄像机坐标系…
不是世界坐标
不要问我怎么知道…
请去问候 文档编写人员…为啥不在 getLocation() 处写明
https://docs.cocos.com/creator/manual/zh/render/camera.html
坐标转换
一个常见的问题是,当摄像机被移动、旋转或者缩放后,这时候用点击事件获取到的坐标去测试节点的坐标,这样往往是获取不到正确结果的。
因为这时候获取到的点击坐标是屏幕坐标系下的坐标了,我们需要将这个坐标转换到世界坐标系下,才能继续与节点的世界坐标进行运算。
下面是一些坐标系转换的函数
// 将一个屏幕坐标系下的点转换到世界坐标系下
camera.getScreenToWorldPoint(point, out);
// 将一个世界坐标系下的点转换到屏幕坐标系下
camera.getWorldToScreenPoint(point, out);
// 获取屏幕坐标系到世界坐标系的矩阵,只适用于 2D 摄像机并且 alignWithScreen 为 true 的情况
camera.getScreenToWorldMatrix2D(out);
// 获取世界坐标系到屏幕坐标系的矩阵,只适用于 2D 摄像机并且 alignWithScreen 为 true 的情况
camera.getWorldToScreenMatrix2D(out);
真正原因是你用错了:this.node.convertToNodeSpaceAR(event.getLocation());
请把this.node改为你的目标节点的父节点
下面给出我自己封装 好的常用的2个函数:
//改变节点的位置,使他跟随触摸点的位置
function nodeFollowsTheTouchPoint(node, touchEvent) {
// cc.log("event.target:",event.target)
// cc.log("event.currentTouch._point:",event.currentTouch._point)
//全局的触摸点为event.currentTouch._point可以获取到,下面2种方式都可以
// node.position = node.parent.convertToNodeSpaceAR(touchEvent.currentTouch._point);
node.position = node.parent.convertToNodeSpaceAR(touchEvent.getLocation());
}
function transformOtherNodePos2localNode(otherNode, localNode) {
//先转成世界坐标,再将世界坐标转成节点局部坐标
var otherNodeWorldPosition = otherNode.parent.convertToWorldSpaceAR(otherNode.position);
cc.log("otherNodeWorldPosition:", otherNodeWorldPosition);
var newPosition = localNode.parent.convertToNodeSpaceAR(otherNodeWorldPosition);
// cc.Vec2(otherNodeWorldPosition.x, otherNodeWorldPosition.y + 17)
cc.log("newPosition:", newPosition);
return newPosition
}
你的答案可能在这
一般来说,这个返回值是给 this.node 的 children 使用的,不是给 this.node 用的,
想要给 this.node 使用,就用this.node.parent.convertToNodeSpaceAR(event.getLocation());
现在就是在parent里使用的转换,转换结果给children使用
那还可能你的 node 的世界坐标在不同的屏幕下位置不一致,这样不同的屏幕 node 坐标系的原点也不一样,只有 node 的世界坐标在屏幕中心,点击中心才会是(0,0)
谢谢,是camera的原因,改变了camera的位置导致的
谢谢,是这个原因导致的
我tn直接问候他。
浪费了我一天事件。来社区查关键字坐标,都查不到!
最后才找到这里。日
同样在这里找到了答案。。。
该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。