【问题标题】:Three.js - How to check if an object is visible to the cameraThree.js - 如何检查对象是否对相机可见
【发布时间】:2014-04-14 17:37:20
【问题描述】:

我很难找出检查 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 也很好地解释了这个话题,但不完全适合这种情况。

感谢您的帮助!

【问题讨论】:

  • 运气好吗?我们现在正在尝试,并且使用 raycaster.intersectObjects(复数)无济于事,尽管当我们的相机物理撞到阻挡物体时它确实给了我们一个打击。 Raycaster.intersectObject(单数)总是给我们什么。
  • 在另一种情况下对我有用的是使用 intersectObjects(toTest, true) 的递归参数。我完全忽略了这个参数。

标签: javascript three.js


【解决方案1】:

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

【讨论】:

  • 感谢您提供宝贵的信息。到目前为止,我从未听说过遮挡剔除,但这似乎是一种方法。不得不深挖。如果有人提出其他解决方案,请等待。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2016-03-12
    • 2023-04-05
    相关资源
    最近更新 更多