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

如何在Three.js中识别需添加阴影的表面以还原目标场景?

Three.js阴影设置问题解决方案

你的当前做法不正确——靠“排除名称含ConcreteBlock的物体”这种反向筛选太粗糙,Sketchfab模型的命名不一定严格对应物体实际功能,很容易漏判或误判。下面是更靠谱的思路和操作方法:

先明确阴影的核心逻辑

阴影分两种属性,得先理清每个物体的角色:

  • castShadow:物体是否会投射阴影(仅实体类物体需要,比如建筑、路灯、雕塑)
  • receiveShadow:物体是否会接收阴影(仅平面/表面类物体需要,比如地面、建筑外墙)

路面出现阴影的问题,就是你给路面开了castShadow——路面本身是地面,只需要接收阴影,不需要投射。

正确识别需要设置阴影的物体

  1. 先摸透模型结构
    用控制台打印所有子物体信息,快速理清层级和功能:

    model.traverse(obj => {
      if (obj.isMesh) {
        console.log(`名称:${obj.name},类型:${obj.type},位置Y:${obj.position.y}`);
      }
    });
    

    Sketchfab下载的GLTF模型通常会按组分类(比如Buildings、Ground、Props),找到这些组直接批量设置效率最高。

  2. 用正向筛选替代反向排除
    不要“排除某类物体”,而是“选中需要设置的物体”:

    • 建筑/实体类:给所有有体积的建筑、道具开castShadow = true,同时开receiveShadow = true(它们的墙面需要接收其他物体的阴影)
    • 地面/路面:只开receiveShadow = true,关闭castShadow(除非是凸起的路牙这类需要投射阴影的地面元素)
    • 细小装饰:比如栏杆、窗户网格,可以关闭castShadow,既提升性能又避免阴影噪点

修正后的代码示例

// 假设model是加载完成的GLTF模型实例
model.traverse(obj => {
  if (!obj.isMesh) return;

  // 先默认关闭所有阴影属性,再按需开启
  obj.castShadow = false;
  obj.receiveShadow = false;

  // 匹配建筑相关的网格(根据你打印的名称调整关键词)
  if (obj.name.match(/Building|Tower|House|Structure/)) {
    obj.castShadow = true;
    obj.receiveShadow = true;
  }

  // 匹配地面/路面
  if (obj.name.match(/Ground|Road|Pavement/)) {
    obj.receiveShadow = true;
    // 路牙等凸起地面元素可以单独开castShadow,这里默认关闭
  }

  // 匹配道具类(比如路灯、长椅)
  if (obj.name.match(/Prop|Bench|StreetLamp/)) {
    obj.castShadow = true;
  }
});

解决异常受影/阴影缺失的常见坑

  1. 检查阴影相机范围
    光源的阴影相机如果没覆盖到整个场景,远处的阴影会被裁剪,调整参数:
    const light = new THREE.DirectionalLight();
    light.shadow.mapSize.set(2048, 2048); // 提升阴影分辨率
    light.shadow.camera.near = 0.5;
    light.shadow.camera.far = 500;
    // 根据场景大小调整相机视锥体
    light.shadow.camera.left = -100;
    light.shadow.camera.right = 100;
    light.shadow.camera.top = 100;
    light.shadow.camera.bottom = -100;
    
  2. 修复法线问题
    有些模型的Mesh法线反转,导致阴影不显示,重新计算法线:
    obj.geometry.computeVertexNormals();
    
  3. 优化阴影类型
    用软阴影提升效果,减少噪点:
    renderer.shadowMap.type = THREE.PCFSoftShadowMap;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:25:13