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

Three.js中Blender模型纹理不匹配UV映射问题求助

解决Three.js中Blender导出模型纹理UV不匹配的问题

嘿,我来帮你排查这个纹理和UV映射不匹配的问题!结合你描述的情况,大概率是导出设置、加载逻辑或者坐标系差异导致的,下面分点给你解决方案:

1. 先检查Blender的导出设置

这是最容易忽略的环节:

  • 导出Three.js JSON时,一定要在导出面板里勾选UVs选项(默认可能没勾),如果没导出UV数据,Three.js根本没法把纹理正确贴到模型上。
  • 确认你的模型在Blender里的UV展开是正确的——虽然Blender里显示正常,但要检查有没有UV重叠、翻转,或者是不是用了多个UV通道但导出时没选对目标通道。

2. 排查加载代码的细节

你用的JSONLoader是Three.js的旧版加载器,先看看当前代码的问题:

  • 检查材质的纹理路径是否正确:Blender导出的材质会把纹理路径存在materials[0].map里,如果纹理文件的相对路径不对(比如JSON在json/文件夹,纹理却在根目录),Three.js找不到纹理就会显示异常。你可以在控制台打印console.log(materials[0]),看看map属性的url是不是正确的。
  • 处理UV坐标系翻转:Blender的UV坐标系Y轴是向上的,而Three.js默认是向下的,这会导致纹理上下颠倒。你可以手动修正:
var loader = new THREE.JSONLoader();
loader.load('json/Ship.json', function ( geometry, materials ) {
  // 修正纹理翻转问题
  if (materials[0].map) {
    materials[0].map.flipY = false;
  }
  ship = new THREE.Mesh(geometry, materials[0]);
  scene.add(ship);
} );

3. 推荐换用更稳定的现代加载器

JSONLoader已经被标记为废弃(deprecated),现在Three.js官方推荐用GLTFLoader,GLTF/GLB格式的兼容性更好,能避免很多导出加载的坑:

步骤:

  1. 在Blender中导出模型为GLB/GLTF格式:文件 -> 导出 -> glTF 2.0,导出时确保勾选包含纹理(如果纹理是嵌入的话)。
  2. 用GLTFLoader加载,示例代码:
// 先引入GLTFLoader
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';

const loader = new GLTFLoader();
loader.load('models/Ship.glb', function (gltf) {
  ship = gltf.scene;
  // 如果需要调整纹理翻转,也可以在这里处理
  ship.traverse((child) => {
    if (child.isMesh && child.material.map) {
      child.material.map.flipY = false;
    }
  });
  scene.add(ship);
}, undefined, function (error) {
  console.error('加载模型出错:', error);
});

先从检查Blender导出的UV选项开始试,这个是最常见的原因,如果还没解决再试后面的方法!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:40:02