CocosCreator3.x屏幕坐标转世界坐标怎么实现,按引擎给的接口得不到正确结果

案例:
1,创建一个游戏场景,在场景(0,0,0)位置创建一个平面做为地面,主摄像头位置为(0,10,0),角度(-90,0,0),也就是摄像机在空中10米俯瞰地面。

2,创建一个全屏幕UI节点,监听点击事件。

3,现在想要点击屏幕,然后把屏幕坐标位置转换为3d场景的地面平面的位置。

所以按引擎案例实现功能,以屏幕中心(0,0)位置做测试。
var wpos = mainCamera.screenToWorld(new Vec3(0, 0 ,10)); //z轴填10,是因为摄像头在天空10米处
console(wpos.x, wpos.y, wpos.z) //把位置输出
//期望得到世界坐标为(0,0,0)
//结果输出为:(x: -1.3312, y: 8.7029, z: 0.7488)
输出的结果轴位置 在8米处,离地面还很高

我是因为有个功能需要把屏幕上某个UI的位置转换为摄像头前方某个距离的场景3d世界坐标,目前摄像头的screenToWorld函数无法把UI位置转换为3d世界坐标。

Unity 屏幕坐标转换3d世界坐标很容易实现
Vector3 wpos = Camera.main.ScreenToWorldPoint(new Vector3(屏幕坐标x, 屏幕坐标y, 3d摄像头前方距离);
//
Creator3.x太难实现了

screenToWorld是让你把屏幕坐标系的坐标传进去它帮你转换为世界坐标你传的0,0,10是camera在世界坐标系中的坐标

image 如果你0,0是想说屏幕中心的话要传实际屏幕尺寸的一半才是屏幕中心

https://mp.weixin.qq.com/s/F8a8v1teU_JAYkiy2cL2XA

你看下这个里面

知道0,0是左上角,但是我真的传中间位置也无法转换成自己想要的时间坐标啊,主要是算出的前方距离不对。

你可以实现一下功能。

摄像头位置(0,0,0),角度(0,0,0),屏幕分辨率(1920,1080),屏幕中心位置(960,540)。
现在要把屏幕中心的位置转换为摄像头前方10米的3d世界坐标位置,按当前摄像头的位置和角度,摄像头朝向-z轴,屏幕正前方10米的位置应该是(0,0,-10)才对;

但是用这个方法转换mainCamera.screenToWorld(new Vec3(960, 540 ,10));根本得不到结果

你这个案例是用射线算的,当然可以。

但是我的例子是需要通过屏幕坐标获得屏幕任意摄像头横截面的深度的世界坐标,而射线是基于碰撞器的,用于检测射线碰撞的碰撞器只能放在指定的距离,无法得到任意距离位置的世界坐标,所以用不了射线。只能借助摄像头的screenToWorld方法转换。

但是cocos的这个screenToWorld函数又算不对结果,而且没有使用教程。

好像确实有问题

我这样worldToScreen然后screenToWorld得出来的世界坐标和原始值都不一样

你也验证出不对了,看来这个屏幕坐标转世界坐标接口真的是bug。
@jare 可以看一下这个 camera.screenToWorld 接口转换坐标不正确问题

测出问题原因了
所有的位置转换,3d 转 2d 或者 2d 转 3d 都不能在start函数里转换,要在start之后延迟一帧才可以,比如在update函数里转换,那样就能拿到正确结果。这个真是大坑,cocoscreator3.x出来这么久了都没人发现这个坑。

1赞

论坛不是早就有人提到这个问题了吗,Start里面会有一些初始化,你这个里面转换是可能有问题

楼主有解决吗?我也正在做,用3D相机的screenToWorld去将屏幕的坐标点转世界坐标点,根本就不对的

相机视图投影矩阵还没更新,先调用一下camera._camera.update()然后再调用worldtoscreen,

图片 这个文章里说的就是···这个不对