我正在开发一个three.js场景,在这个场景中能够确定在给定时间内相机可见的所有面(在所有几何体中)的子集将是非常有益的。
我知道可以通过执行以下操作来确定相机是否可以看到顶点:
camera.updateMatrix();
camera.updateMatrixWorld();
var frustum = new THREE.Frustum();
frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));
// The 3d point to check
var pos = new THREE.Vector3(x, y, z);
if (frustum.containsPoint(pos)) {
// Do something crazy...
}
我的几何体有成千上万的2d平面,都坐在一个更大的平面上,我想确定相机经常看到的一组脸部(每次相机缩放过去时)某些超平面,如果可能的话。)
我知道可以scene.children[childIndex].visible
查看网格是否可见,但我在网格上有很多面,并且想要确定哪些面是可见的。 (除非用户疯狂缩放,否则我的所有网格都会被渲染)。我也知道可以适应this approach:
var frustum = new THREE.Frustum();
var cameraViewProjectionMatrix = new THREE.Matrix4();
// every time the camera or objects change position (or every frame)
camera.updateMatrixWorld(); // make sure the camera matrix is updated
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
cameraViewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
frustum.setFromMatrix( cameraViewProjectionMatrix );
console.log( frustum.intersectsBox( meshes[0].geometry.vertices[0] ) );
是否有一个快捷方式可以找到给定时间内相机可见的所有面部的集合?在我的情况下,我可以预先计算每个平面的几何平均值,然后使用上面的代码来确定哪些面是可见的,但在这种情况下是否有比O(n)更好的东西?
我非常感谢其他人可以就这个问题提出的任何想法!
优于O(n)?
给定一个排序的整数数组,我相信可以确定在~O(log(n))中上下界之间排列的那些整数的子集。每个面的几何平均值是3d点,因此似乎可以用3 * O(log(n))确定平截头体内的点集,即优于O(n)复杂度。
优于O(log(n))
在一些预计算之后的近似值优于O(log(n))。假设我们只处理1D(那么我们可以推广到3D)。量化每个轴的空间,然后创建具有以下结构的哈希表。对于量化空间中的每个单元,使用该单位存储排序数组中第一个点的索引位置+ - 错误值。然后给出上限和下限,将每个舍入到最近的量化单位,并查找这些键的值以识别跨度内的索引位置范围。这将返回一个列表。重复其他两个维度并采用集合交集。 [平截头体提供每个维度的上限和下限。]