Three.js - 如何检查对象是否对相机可见

时间:2014-03-11 08:27:49

标签: javascript three.js

我很难弄清楚什么是检查相机眼睛是否可以看到Object3d的最佳方法。

我在屏幕中间有一个球体。一些立方体随机添加在其表面上。我需要的是一种方法来检查哪些立方体是可见的(在球体的前半部分)以及哪一个是不可见的(在球体的后半部分)用于相机的眼睛。

到目前为止我所发现的似乎是正确的方向 - 但我必须错过THREE.Raytracer类。

这是我正在使用的代码的小提琴:jsfiddle。我试图让它尽可能清楚。

小提琴的这一部分可能包含错误的代码:

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);
}); 

Frustum Culling无法按照此堆栈溢出问题中的说明进行操作:post1

post2和此post3正在解释这个话题非常好,但对于这种情况并不完全。

谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

您想要了解Occlusion Culling技术。 Frustum剔除工作正常,并不是你所描述的。 Frustum剔除只是检查一个物体(或其边界框)是否在相机金字塔内。除了Frustum Culling之外,还要执行遮挡剔除,特别是当您想要消除视锥体内其他对象遮挡的对象时。但这不是一件容易的事。

答案 1 :(得分:1)

我刚刚解决了一个类似的问题,我试图检测世界空间中的一个点何时从相机的视野中移出并在场景中的特定物体后面。我为它创建了一个jsfiddle,(见下文)。当红色“目标”经过三个“墙壁”中的任何一个后面时,从“目标”到相机的蓝线被画出。我希望这会有所帮助。