有什么方法可以判断某个节点进入到摄像头视线了吗

如题,判断某个物体(节点)进入到了屏幕中,想实现一个物体进入屏幕后才加载另一个物体,反之离开屏幕后释放该物体。不知道射线检查能否实现

摄像头也有大小,不能写判断包围盒的方式吗?

包围盒有是否进入摄像机范围的判断方式?


很久之前有做过,3D1.2版本,思路是将摄像机坐标转换成世界坐标,通过世界坐标来和其他节点的世界坐标比较

摄像头有包围盒吗?没有可以加吗?

直接世界坐标转屏幕坐标,在可视范围内就是进入了

能不能用引擎自带的函数实现啊?

好像没有找到,你问下官方

谢谢提供的思路,晚些试一下

2.X camera组件有containsNode方法,3.X不清楚

问题没说清楚,是2d还是3d?

如果是3d,用世界坐标转屏幕坐标,再用引擎自带的碰撞检测类或者自己写判断,一共也就5行代码左右

3D的环境

https://gitee.com/yeshao2069/cocos-creator-how-to-use/blob/v3.0.0/Demo/ObjectIsInCameraView/assets/IsInViewTest.ts#L61-L78

用这种方式判断看看?

IsInView(worldPos: Vec3) {
    var cameraPos = this.mainCameraSelf.node.getWorldPosition();
    const viewPos = this.mainCameraSelf.worldToScreen(worldPos);
    Vec3.normalize(this.dir, worldPos.subtract(cameraPos));
    const forward = this.mainCameraSelf.node.forward;
    var dot = Vec3.dot(forward, this.dir); 

    const viewportRect = view.getViewportRect();
    
    //判断物体是否在相机前面
    if (dot > 0
        // 判断物体是否在视窗内
        && (viewPos.x <= viewportRect.width) && (viewPos.x >= 0)
        && (viewPos.y <= viewportRect.height) && (viewPos.y >= 0))
        return true;
    else
        return false;
}
1赞

你可能想要的是四叉树、八叉树。不过你要想和做得东西就多了。

如果是3d建议不要这么做,卡得很。我现在恨不得直接节点那些全部加载好。节点进入渲染操作特别耗时

感谢!可用

你这个方法不行我试过 有些情况转出来的坐标是错的

基本原理都是这样的,你说这个不行?我每次都是这么用的,也没出任何问题,请问你说说这个方法有哪些错误?

我之前用得时候物品在摄像机后面得时候转出来得坐标是错得 在前面得时候没有问题