convertToNodeSpaceAR不同屏幕结果不同

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组件被我删掉了,重新加上就没问题了

1赞

你的答案可能在这

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);
4赞

真正原因是你用错了: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直接问候他。
浪费了我一天事件。来社区查关键字坐标,都查不到!
最后才找到这里。日

1赞

同样在这里找到了答案。。。

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。