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

更新GLTF模型纹理时如何保留UV映射?

解决GLTF模型替换纹理后UV映射失效的问题

首先明确:UV映射数据存储在模型的**几何体(BufferGeometry)**中,替换纹理本身不会删除UV。你遇到的“UV失效”大概率是新纹理的配置或材质更新逻辑有问题,按以下步骤排查修复:

  • 检查新纹理的UV适配设置
    GLTF模型的UV通常是针对原纹理设计的,新纹理需要匹配对应的包裹和重复规则:

    // 示例:设置纹理重复(如果原模型UV是重复布局)
    newTexture.wrapS = THREE.RepeatWrapping;
    newTexture.wrapT = THREE.RepeatWrapping;
    // 按需设置重复次数,和原纹理一致
    newTexture.repeat.set(1, 1);
    // 关键:GLTF纹理默认不翻转Y轴,Three.js加载普通纹理默认翻转,需统一
    newTexture.flipY = false;
    
  • 替换纹理后强制更新材质
    直接修改material.map后,需要告诉Three.js材质已变更,否则渲染器可能不会更新:

    model.traverse(child => {
        if (child instanceof THREE.Mesh) {
            child.material.map = newTexture;
            // 必须添加这行,强制材质更新
            child.material.needsUpdate = true;
        }
    })
    
  • 排查纹理加载状态
    确保新纹理完全加载完成后再赋值给材质,否则可能出现异常显示。可以用TextureLoader的加载回调:

    const loader = new THREE.TextureLoader();
    loader.load('new-texture.png', (newTexture) => {
        // 先配置纹理参数
        newTexture.flipY = false;
        newTexture.wrapS = THREE.RepeatWrapping;
        newTexture.wrapT = THREE.RepeatWrapping;
        // 再替换并更新材质
        model.traverse(child => {
            if (child instanceof THREE.Mesh) {
                child.material.map = newTexture;
                child.material.needsUpdate = true;
            }
        });
    });
    

内容的提问来源于stack exchange,提问作者Michaël

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:10:25