Skip to content

这篇文章将演示如何给 gltf 的网格模型 Mesh 更换颜色贴图.map

加载颜色贴图.map

注意单独加载的纹理贴图的.encoding 和 webgl 渲染器的.outputEncoding 保持一致

js
const texLoader = new THREE.TextureLoader();
const texture = texLoader.load('./黑色.png'); // 加载手机mesh另一个颜色贴图
texture.encoding = THREE.sRGBEncoding; // 和渲染器.outputEncoding一样值

更换 gltf 颜色贴图

执行 mesh.material.map = texture;新的纹理对象 Texture 赋值给.material.map 就可以更换材质贴图

js
loader.load('../手机模型.glb', function (gltf) {
  const mesh = gltf.scene.children[0]; // 获取Mesh
  mesh.material.map = texture; // 更换不同风格的颜色贴图
});

注意:如果你直接给 gltf 模型材质设置.map 属性更换贴图,会出现纹理贴图错位的问题,这主要和纹理对象 Texture 的翻转属性.flipY 有关

纹理对象 Texture 翻转属性.flipY 的默认值

.flipY 表示是否翻转纹理贴图在 Mesh 上的显示位置

纹理对象 Texture 翻转属性.flipY 默认值是 true

js
// 纹理对象texture.flipY默认值
console.log('texture.flipY', texture.flipY); // true

gltf 的贴图翻转属性.flipY 的默认值

gltf 的贴图翻转属性.flipY 默认值是 false

js
loader.load('../手机模型.glb', function (gltf) {
  const mesh = gltf.scene.children[0]; //获取Mesh
  console.log('.flipY', mesh.material.map.flipY); // false
});

如果更换单独加载的纹理贴图,比如颜色贴图.map,注意把纹理贴图.flipY 的值设置给 gltf 中纹理的值 false

js
//是否翻转纹理贴图
texture.flipY = false;

效果

完整代码

js
import * as THREE from 'three';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';

const group = new THREE.Group();

// 1.实例化一个加载器
const loader = new GLTFLoader();

const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('./黑色.png');
texture.flipY = false; //是否翻转纹理贴图

// 2.加载gltf模型
loader.load('./手机模型.glb', (gltf) => {
  group.add(gltf.scene);

  gltf.scene.children[0].material.map = texture;
  console.log(gltf);
});

export default group;

上次更新于: