【发布时间】:2016-08-13 05:52:14
【问题描述】:
我有一个复杂的 3D 场景,我需要根据 3D 坐标在其上显示 HTML 元素。 (我只是在顶部覆盖一个div 标记并用CSS 定位它。)但是,当3D 坐标被模型遮挡(或用另一个措辞表达)时,我还需要部分隐藏它(例如,使其透明)方式,当它在相机中不可见时)。这些模型可能有数十万张面孔,我需要一种方法来确定它是否被遮挡,并且速度足以每秒运行多次。
目前,我正在使用 Three.js 的内置光线追踪器,代码如下:
// pos = vector with (normalized) x, y coordinates on canvas
// dir = vector from camera to target point
const raycaster = new THREE.Raycaster();
const d = dir.length(); // distance to point
let intersects = false;
raycaster.setFromCamera(pos, camera);
const intersections = raycaster.intersectObject(modelObject, true);
if (intersections.length > 0 && intersections[0].distance < d)
intersects = true;
// if ray intersects at a point closer than d, then the target point is obscured
// otherwise it is visible
但是,在这些复杂模型上,这非常很慢(帧速率从 50 fps 下降到 8 fps)。我一直在寻找更好的方法来做到这一点,但到目前为止,我还没有找到在这种情况下效果很好的方法。
有没有更好、更有效的方法来确定一个点是否被场景中的模型可见或遮挡?
【问题讨论】:
-
你能用
THREE.Sprite代替HTML元素吗? -
@WestLangley 我需要动态生成和交互(可点击)的元素;这可以用精灵做得相当好吗?
-
我不明白为什么不这样做。重用你的精灵。创建一个池。如果您超过了池中可用的数量,请在池中添加一个。
-
你的场景是静态的还是动态的?如果场景是静态的,如果您事先准备好空间网格,您可以尝试使用基于 cpu 的光线测试。可能有一个库。可能是一些物理库。
-
@WacławJasper 我的场景大部分时间都是静态的。如果我对您的理解正确,那几乎就是我现在正在做的事情(请参阅问题中的代码),而且在大型模型上速度太慢了。
标签: javascript three.js webgl raytracing