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

three.js中ObjLoader加载的模型无法接收阴影问题求助

解决Three.js 0.91.0中OBJ模型无法接收阴影的问题

针对你在Three.js 0.91.0里遇到的OBJ加载模型能投射阴影到地面,但无法接收前方小平面阴影和自身阴影的问题,我整理了几个实用的排查方向和解决办法:

  • 确认小平面的阴影投射配置
    虽然你提到小平面能向地面投射阴影,但还是要检查两个关键细节:

    1. 小平面的castShadow属性是否确实设为true;
    2. 小平面不能使用MeshBasicMaterial——这种材质完全不参与光照和阴影计算,建议换成MeshStandardMaterial或MeshLambertMaterial这类支持光照的材质。
  • 调整方向光阴影相机参数
    当前的阴影相机参数可能没覆盖模型自身阴影的投射范围,或者分辨率不足:

    1. 把light.shadow.mapSize.width/height从512调高到1024甚至2048,更高的阴影贴图分辨率能显著提升阴影细节,包括自身阴影的显示效果;
    2. 尝试调小light.shadow.camera.near值(比如从1改成0.1),如果模型某些部分离相机太近,可能会被阴影相机裁剪掉;
    3. 别忘了在设置完阴影相机参数后调用light.shadow.camera.updateProjectionMatrix();——这个方法能让相机的新参数生效,很多开发者会漏掉这一步。
  • 修复OBJ模型的几何体法线问题
    部分OBJ导出的模型可能存在法线方向错误,即使设置了DoubleSide也会影响阴影接收。在setupmodel函数里遍历子Mesh时,加上法线计算的代码:

    function setupmodel(){ 
      femModel.traverse( function ( child ) { 
        if ( child instanceof THREE.Mesh ) { 
          child.castShadow = true; 
          child.receiveShadow = true;
          // 强制计算顶点法线,修复可能的法线错误
          child.geometry.computeVertexNormals();
        } 
      } ); 
    }
    
  • 替换已弃用的API
    在Three.js 0.91.0中,light.shadowDarkness已经被弃用了,如果你需要调整阴影暗度,可以通过修改材质的shadowSide或者使用light.shadow.radius来实现,旧API的存在虽然不会直接导致问题,但建议替换成当前版本支持的写法。

  • 检查场景层级和渲染范围
    你把模型加到了sceneRTTA中,要确保这个场景是被渲染器正确渲染的,并且模型和小平面都在方向光阴影相机的视锥体范围内(也就是你设置的left/right/top/bottom/near/far参数覆盖的区域)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:54:22