首页 > 解决方案 > 扩展/缩放相机视锥体

问题描述

我正在尝试解决如何为我正在处理的一些交叉逻辑扩展相机平截头体。

简而言之,我需要计算出哪些物体不仅落入了相机平截头体内,而且还落入了相机平截头体周围的某个缓冲区内。我能想到的最好的方法是在运行交叉点检查之前以某种方式扩展相机平截头体。

但是,我想不出如何最好地实现这一目标。我也不确定是否有更好的选择来实现相同的结果。我想如果我能找到一个物体到最近的平截头体平面的距离,那也可以。

所有帮助表示赞赏。

标签: three.js

解决方案


重新阅读我的问题后,我意识到我的第一个停靠点应该是看看它是如何Frustum.intersectsBox()工作的。事实证明它拥有我需要的一切,并且通过引入一个buffer参数,我可以通过提供世界单位的缓冲区值来有效地扩展截锥体。

const frustumIntersect = (() => {
  const p = new THREE.Vector3()

  return (frustum, box, buffer = 0) => {
    const planes = frustum.planes

    for (let i = 0; i < 6; i ++) {

      const plane = planes[i]

      p.x = plane.normal.x > 0 ? box.max.x : box.min.x
      p.y = plane.normal.y > 0 ? box.max.y : box.min.y
      p.z = plane.normal.z > 0 ? box.max.z : box.min.z

      if (plane.distanceToPoint(p) < 0 - buffer) {
        return false
      }
    }

    return true
  }
})()

可以这样调用,以在截锥体周围的 200 个单位缓冲区内包含对象:

frustumIntersect(frustum, yourBox3, 200)

推荐阅读