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

three.js中大尺寸RingGeometry特定角度部分区域无法渲染如何解决

问题原因

你遇到的环局部消失的问题核心有两个:

  1. 你当前使用的正射相机视锥体的水平/垂直可见范围过小:你设置的ZOOM = 300,换算后可见的左右上下范围只有约±6~±10个单位,而你的环半径达到了51,超出范围的部分会被相机直接裁剪,只有旋转到部分区域落在视锥体内时才可见,尺寸改小后没有超出范围就恢复正常。
  2. 你使用的RingGeometry是纯平面几何体,当相机视角和环平面接近平行时,平面的厚度为0,也会出现局部甚至整体不可见的情况。

修复方案

方案一:调整正射相机参数(必改)

把原来的相机参数替换为按视口比例+足够大的可见范围计算的配置,保证能容纳大尺寸的环:

// 替换原来的相机初始化代码
const viewSize = 120; // 该值要大于环的最大半径,预留足够的旋转余量
const aspect = window.innerWidth / window.innerHeight;
const camera = new THREE.OrthographicCamera(
    -aspect * viewSize, 
    aspect * viewSize, 
    viewSize, 
    -viewSize, 
    1, 
    1000
);

如果需要保留原有的缩放逻辑,只需要同步减小ZOOM的值即可,比如把ZOOM改为30,可见范围就会放大10倍,足够容纳半径51的环。

方案二:替换为3D圆环几何体(可选,体验更好)

把平面的RingGeometry换成有厚度的TorusGeometry,就算视角和环面平行也能看到环的厚度,不会消失:

// 替换原来的环初始化代码
// 第一个参数是环的中心半径,第二个是管的厚度,后两个是分段数
const ringGeometry = new THREE.TorusGeometry(50.5, 0.5, 16, 64);
const ringMaterial = new THREE.MeshBasicMaterial( { color: 0x808080 } );
const ring = new THREE.Mesh( ringGeometry, ringMaterial );
// 如果需要环水平放置,就加一行旋转
ring.rotation.x = Math.PI / 2;
scene.add( ring );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:27:02