我正在尝试找出如何针对正在处理的某些交集逻辑扩展摄像机视锥。
简而言之,我需要弄清哪些对象不仅落在相机视锥内部,而且还落在相机视锥周围的特定缓冲区内。我能想到的最好方法是在运行相交检查之前以某种方式扩展摄像机视锥。
但是,我无法想到如何最好地实现这一目标。我也不确定是否有更好的选择来达到相同的结果。我想如果我能找到一个物体到最近的平截头体平面的距离,那也可以。
感谢所有帮助。
答案 0 :(得分:0)
重新阅读了我的问题后,我意识到我的第一个电话接听对象应该是研究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)