关于creator3d世界坐标转屏幕坐标的疑惑,也不敢确定是不是bug

现在用到把世界坐标转换成平面坐标。

设置项目分辨率为1920 * 1080

点击场景把场景位置转换成screen坐标所以用到以下方法

var touchWorldPos = …//点击的世界坐标。(当然也可以随便用一个场景物体位置做为参照的世界坐标)
var outPos = new Vec3();
camera.worldToScreen(touchWorldPos,outPos);

输出outPos 发现。
点击左下角outPos输出(0,0)
点击右上角outPos输出(960,540)

疑惑的是右上角世界坐标转换成平面坐标,正好是项目分辨率的一半,说明世界坐标转换成屏幕坐标刚好是屏幕坐标的一半。为什么要这样做,开发者也不能直接用这样的值,要用也是把输出的屏幕位置 * 2 才是正确的屏幕坐标。官方引擎组给个解释啊,为什么不能直接转换成正确的屏幕坐标

所以目前正确使用世界坐标转屏幕坐标的用法是这样

var touchWorldPos = …//点击的世界坐标
var outPos = new Vec3();
camera.worldToScreen(touchWorldPos,outPos);
outPos = outPos.multiplyScalar(2); //乘以2才能得出正确的转换坐标。但是感觉这样设定是多此一举。camera直接把正式坐标转换出来不就好了吗。

收购德州源码 单款德州即可ca
要求:
带h5版本 后台带代理系统 类似wepoker 或者功夫扑克 (kungfu.poker)
有俱乐部+开房+控制+运营级最好+Q1157000460 带上演示站 测试账号联系

我没有看明白你这里所谓的点击的世界坐标到底是什么坐标,如果是点击的,按理来说本来就是屏幕点了,为什么又要转换呢?

简单说吧,
1,3d场景里放一个很大的平面Plane,位置为(0,0,0),角度(0,0,0),缩放(100,100,100),平面加上碰撞器.
2,调整摄像机(任何角度和位置都行,只要能看得全平面)。位置(0,10,0),角度(-72,0,0)
3,点击屏幕发射射线,射线检测点击到的平面位置,然后把这个位置转化成screen坐标,用camera.worldToScreen转换,转换得到的屏幕坐标正好是真实屏幕坐标的一半

其实换种说法就是
把摄像机随便设置位置和角度,然后把一个3d对象分别放到摄像机视野的左下角和右上角,然后把该物体位置转换成屏幕坐标,得到的屏幕坐标是真实屏幕坐标的一半。取左下角和右上角只是做验证屏幕转化坐标的值是什么

再看不懂,就举一个给3d角色做血条(UI做的血统)跟随的例子,需要这样做。
var rolePos = player.node.worldPosition;
var outPos = new Vec3();
camera.worldToScreen(rolePos,outPos);
outPos = outPos.multiplyScalar(2); //outPos * 2后得到真实的屏幕坐标,再减去分辨率宽高的一半,得到Canvas下的UI坐标,血条坐标取这个值就可以跟随了。

把摄像机设置位置(0,10,0),角度垂直向下,项目分辨率为1920 * 1080.
检测摄像机视野中心位置转换屏幕坐标,转换结果应该是屏幕中心坐标的位置,正确值应该是(1920 / 2,1080 / 2)。

unity 的世界坐标转屏幕坐标是正确的
camera.WorldToScreenPoint(new Vector3(0,0,0)); 结果 为 (960,540)

creator3d的屏幕坐标正好是分辨率的一半
var outPos = new Vec3();
camera.worldToScreen(new Vec3(0,0,0),outPos); 结果 为 (480,270)

这个是检测摄像机中心点的情况。检测左下角和右上角不好理解的话,用这个做检测

血条跟随可以这么做,我也是看的官方的案例

多谢,我才知道还有其它的3d坐标转换ui坐标的方式。
不过总感觉 这个转换屏幕坐标的方法是错误的 camera.worldToScreen;和别的引擎如unity,laya对比就知道了,别的引擎是针对真实分辨率转,creator3d根据真实分辨率的1 / 2 转