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

求助:为Three.js自定义形状设置纹理

给自定义Three.js形状设置纹理的解决方案

步骤1:加载纹理并配置属性

首先用THREE.TextureLoader加载纹理图片,同时设置适配属性确保纹理正确贴合形状:

// 加载纹理
const textureLoader = new THREE.TextureLoader();
const flapTexture = textureLoader.load('你的纹理图片本地路径/在线地址');

// 配置纹理属性
flapTexture.wrapS = THREE.ClampToEdgeWrapping; // 防止纹理边缘重复拉伸
flapTexture.wrapT = THREE.ClampToEdgeWrapping;
flapTexture.minFilter = THREE.LinearFilter; // 优化缩放后的显示清晰度
flapTexture.magFilter = THREE.LinearFilter;

步骤2:修正ShapeGeometry的UV坐标

ShapeGeometry默认生成的UV是0-1的标准化范围,但你的自定义形状实际宽200、高100,需要手动调整UV让纹理和形状精准匹配:

// 获取形状的边界尺寸
const boundingBox = new THREE.Box3().setFromBufferAttribute(flapGeometry.getAttribute('position'));
const width = boundingBox.max.x - boundingBox.min.x;
const height = boundingBox.max.y - boundingBox.min.y;

// 生成自定义UV数组
const uvArray = [];
const positions = flapGeometry.getAttribute('position').array;

for (let i = 0; i < positions.length; i += 3) {
  const x = positions[i];
  const y = positions[i + 1];
  // 将形状坐标映射到0-1的UV范围,v轴反向是因为Three.js纹理Y轴默认朝下
  const u = x / width;
  const v = 1 - (y / height);
  uvArray.push(u, v);
}

// 更新几何体的UV属性
flapGeometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvArray, 2));

步骤3:创建材质并生成网格

用带纹理的材质创建网格,添加到场景中:

// 创建纹理材质,DoubleSide确保形状正反两面都显示纹理
const flapMaterial = new THREE.MeshBasicMaterial({
  map: flapTexture,
  side: THREE.DoubleSide
});

// 生成网格并添加到场景
const flapMesh = new THREE.Mesh(flapGeometry, flapMaterial);
scene.add(flapMesh);

额外注意事项

  • 如果纹理图片尺寸不是2的幂次(如256×256、512×512),需要添加flapTexture.generateMipmaps = false避免渲染异常;
  • 若纹理显示方向错误,可通过flapTexture.flipY = false调整Y轴方向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:30:22