convertToNodeSpaceAR bug

版本: Cocos Creator 3.1.0
浏览器: Chrome 91.0.4472.77

在Chrome下改变显示分辨率,convertToNodeSpaceAR返回不同的值

测试过程如下:
这个是touch的target节点
Snipaste_2021-06-04_11-12-58

在touch节点放一个子节点,Label做标记,位置{x:140,y:-100}

在console log convertToNodeSpaceAR的结果:

let self = this

        this.touchNode.on("touch-start", function(event:any){

            console.log(self.touchNode.getComponent(UITransform)?.convertToNodeSpaceAR(v3(event.touch._point.x, event.touch._point.y)))

        })

在默认分辨率下,点击*的位置,console log的位置是正确的 {x:140,y:-96.86}

修改分辨率为Huawei P10,然后刷新浏览器,重新点击*的位置,console log的位置出现了很大变化 {x:-131.15, y:-696.69}

测试工程:
testconvertpos.zip (25.4 KB)

缩放浏览器窗口,也会出现这个bug

参数传 event.touch.getUILocation() 试试,比如:
event.touch._point.x ->> event.touch.getUILocation().x

1赞

用了getUILocation就正常了

1赞

正解,getUILocation搞定;
暂时还没想getUILocation和getLocation的区别

当监听全局鼠标/触摸事件的时候,所获取到的触点是基于屏幕区域(设备显示分辨率)左下角计算的。而 UI 节点监听获取到的触点,是将全局事件获取到的触点,转换到适配后的 UI 可视区域左下角计算出的点,这两个点是不一样的。全局触点比较适用于直接点击屏幕去操控 3D 节点的行为,而不需要为场景添加 UI 节点去做鼠标/触摸事件的监听。