关于Camera.worldToScreen的问题

我需要做一个血条跟随角色的功能,所以需要血条每帧根据目标角色位置来更新自身在canvas上的位置,经过查询API后我找到了Camera.worldToScreen方法,但是调用后的结果却和预想的不同,首先我先附上官方文档的描述
方法
为了消除歧义,这里的世界空间坐标,就是下面的世界坐标系下的坐标对吧?
世界坐标
然后我调用代码和印出的结果如下:
import { _decorator, Camera, Component, Node, Vec3 } from ‘cc’;

const { ccclass, property } = _decorator;

@ccclass(‘RoleUIArea’)

export class RoleUIArea extends Component {

@property(Camera)

tragetCamera:Camera;

@property(Node)

traget:Node;

start() {

    let posFromScreen = new Vec3();

    let worldPos = new Vec3(0,0,0);//{...this.traget.position};

   

    posFromScreen= this.tragetCamera.worldToScreen(worldPos);

   

    console.log("tragetCamera:",this.tragetCamera);

    console.log("worldToScreen posFromScreen:",posFromScreen);

    this.node.setPosition(posFromScreen);

}

update(deltaTime: number) {

   

}

}
印出
结果
这个结果很明显是不对的, 这个球体的世界坐标就是(0,0,0)但它并不在屏幕中心(设计分辨率1280x720)
球体
位置
而且不论相机如何移动,结果始终一样.
所以结果上来说,这个方法更像是"将视口坐标转屏幕坐标"而非是从世界坐标,是我哪里调用错了吗?还是对于哪些概念理解错了,请指正,谢谢大家

我的tragetCamera指定的是MainCamera,不是UI Camera
相机设置如下:
相机

顶一下。。。

顶一下。。。

这个方法这么冷门吗?

@jare 这个方法确实非常奇怪,我的测试与理解都跟楼主相同,官方能解释解释吗?
unity中的camera.WorldToScreenPoint是完全符合预期的

1赞

确实有问题,调试了一下第一次调用的时候相机的视图投影矩阵是个单位矩阵明显不对,应该是相机矩阵没更新所以调用之前调用一下camera._camera.update()然后再调用worldtoscreen就符合预期了,小问题小问题

2d的情况下还是错的。
3d的情况确实对了,但屏幕坐标原点测出来是左下角,而非文档中的左上角

应该是注释写错了 :rofl:, 还有2d的情况下错的是怎么个情况

文档不是有一个https://docs.cocos.com/creator/3.2/manual/zh/ui-system/components/editor/ui-coordinate-tracker.html?h=%E8%A1%80%E6%9D%A1 么,这样就能实现血条跟随角色啊

image
这是我的测试结果

140812
542010
这么大的值是什么鬼