Three.js - 如何检查一个物体是否在相机的可见范围内

7

我正在努力找到最佳方法来检查Object3d是否对相机可见。

屏幕中央有一个球体。一些立方体随机添加在其表面上。我需要一种方法来检查哪些立方体对相机可见(在球体前半部分),哪些不可见(在球体后半部分)。

到目前为止,我发现的似乎是正确的方向,但我可能遗漏了与THREE.Raytracer类有关的内容。

这是我使用的代码的fiddle链接:jsfiddle。我已尽可能地使它清晰明了。

这个fiddle的这一部分可能包含有错误的代码:

var raycaster = new THREE.Raycaster();
var origin = camera.position, direction, intersects, rayGeometry = new THREE.Geometry(), g;
pointGroup.children.forEach(function(pointMesh) {
    direction = pointMesh.position.clone();
    // I THINK THIS CALCULATION MIGHT BE WRONG - BUT DON'T KNOW HOW TO CORRECT IT
    raycaster.set(origin, direction.sub(origin).normalize());
    // if the pointMesh's position is on the back half of the globe, the ray should intersect with globe first and the hit the point as second target - because the cube is hidden behind the bigger sphere object
    intersects = raycaster.intersectObject(pointMesh);
    // this is always empty - should contain objects that are located on the back of the sphere ...
    console.log(intersects);
}); 

锥台剔除在这个Stack Overflow问题中没有按照预期工作: post1

此外,post2post3解释得非常好,但并不完全适用于这种情况。

谢谢您的帮助!


这个问题有什么进展吗?我们正在尝试使用raycaster.intersectObjects(复数形式),但是没有任何效果,尽管当我们的相机物理碰到阻挡物时确实会给我们一个命中。而raycaster.intersectObject(单数形式)总是没有任何反应。 - Alien Life Form
在另一种情况下对我有效的方法是使用intersectObjects(toTest, true)的递归参数。我完全忽视了这个参数。 - hetsch
请参见以下链接:https://dev59.com/6V0a5IYBdhLWcg3w88vU - Martin
2个回答

4

您想了解遮挡剔除技术。视锥体剔除是有效的,但并不是您所描述的内容。视锥体剔除只是检查一个物体(或其边界框)是否在相机金字塔内。当您想要消除被视锥体内其他物体遮挡的物体时,需要执行遮挡剔除。但这并不是一项简单的任务。


感谢您提供宝贵的信息。直到现在,我从未听说过遮挡剔除,但它似乎是一种可行的方法。我需要深入研究一下。如果有人提出另一种解决方案,请稍等。 - hetsch

1
我刚刚解决了一个类似的问题,我试图检测世界空间中的一个点何时从相机视野中消失,并穿过场景中特定的物体。 我为此创建了一个jsfiddle(见下文)。 当红色“目标”通过任何三个“墙壁”之一时,将从“目标”到相机绘制蓝线。 希望这可以帮助你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接