You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Three.js Frustum使用示例:仅渲染相机视锥内的大量看台

Three.js 视锥体裁剪大量看台模型实现方案

核心逻辑

利用Three.js内置的Frustum类,结合模型的包围盒/包围球做碰撞检测,只渲染相机视锥范围内的看台对象,避免无效渲染提升性能。

具体步骤

  • 预计算包围体:加载完所有看台模型后,对每个看台Mesh执行computeBoundingBox()或computeBoundingSphere(),提前生成包围结构(静态模型只需计算一次)。
  • 实时更新视锥体:每帧从相机的投影矩阵与视图矩阵生成当前视锥体,确保检测范围和相机视角同步。
  • 遍历检测并控制可见性:遍历所有看台,通过视锥体与包围体的相交判断,设置模型的visible属性,仅保留视锥内的模型为可见状态。

性能优化建议

  • 优先使用boundingSphere:球体相交检测的计算量远小于包围盒,精度满足需求的情况下优先选择。
  • 分组检测:将10000+个看台按空间区域分组,先检测组的大包围体,若整个组不在视锥内则直接跳过组内所有对象,大幅减少检测次数。
  • 避免重复计算:静态看台的包围体只需在初始化时计算一次,动态变化的看台才需要在更新后重新计算。

代码示例

// 初始化:存储所有看台并预计算包围球
const stands = []; // 你的所有看台Mesh数组
stands.forEach(stand => {
  stand.computeBoundingSphere();
});

// 渲染循环内处理视锥检测
const frustum = new THREE.Frustum();
const projMatrix = new THREE.Matrix4();

function animate() {
  requestAnimationFrame(animate);

  // 更新视锥体
  projMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
  frustum.setFromProjectionMatrix(projMatrix);

  // 批量设置可见性
  stands.forEach(stand => {
    stand.visible = frustum.intersectsSphere(stand.boundingSphere);
  });

  renderer.render(scene, camera);
}
animate();

注意事项

  • 若看台存在位置移动或形变,需在每次更新后重新计算包围体。
  • 手动修改相机参数后,记得调用camera.updateMatrixWorld()确保矩阵数据最新,避免视锥体计算错误。

内容的提问来源于stack exchange,提问作者Akbar Bobomurodov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:17:02