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

THREE.js使用ExtrudeGeometry拉伸2D图形时深度/高度不符合预期如何解决?

Three.js ExtrudeGeometry挤压深度异常问题解决方案

核心问题排查方向

  • 移除冗余冲突代码
    你提供的代码中存在一行无效逻辑:const califorGeo = new THREE.ShapeGeometry(californiaShape);,其中californiaShape变量未在当前片段中定义。如果你的实际运行环境中该变量为已声明的全局形状对象,会导致形状计算冲突,引发挤压参数失效,直接删除该行即可。
  • 修正形状顶点缠绕顺序
    Three.js的Shape对象默认要求顶点按逆时针顺序定义,你当前的顶点是顺时针排列,错误的缠绕顺序会导致挤压深度计算异常。可调整顶点顺序,或手动设置geoPointsShape.autoClose = true强制形状闭合。
  • 排查父节点缩放叠加
    若生成的calMesh挂载到了设置过Z轴缩放的Group或Object3D父节点下,父级缩放会叠加到网格尺寸上,导致显示深度远大于设定的0.1。可通过console.log(calMesh.getWorldScale(new THREE.Vector3()))打印世界坐标系下的缩放值校验。
  • 排除材质干扰
    如果你使用的globalMaterial配置了位移贴图、自定义着色器或特殊渲染模式,可能造成视觉厚度偏差,可先替换为普通MeshBasicMaterial测试定位问题。

修正后参考代码

const geoPoints = [];
// 调整为逆时针顶点顺序
geoPoints.push(new THREE.Vector2(1, 1));
geoPoints.push(new THREE.Vector2(1, -1));
geoPoints.push(new THREE.Vector2(-1, -1));
geoPoints.push(new THREE.Vector2(-1, 1));

const geoPointsShape = new THREE.Shape(geoPoints);
geoPointsShape.autoClose = true;

const extrudeSettings = {
  steps: 1,
  depth: 0.1,
  bevelEnabled: false,
};

const extrude = new THREE.ExtrudeGeometry(geoPointsShape, extrudeSettings);
// 临时用基础材质测试,排除材质影响
const testMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00, side: THREE.DoubleSide });
const calMesh = new THREE.Mesh(extrude, testMaterial);
// 直接挂载到根场景,避免父级缩放干扰
scene.add(calMesh);

异常效果参考

异常效果示意图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:36:03