如何在Three.js中访问Face3的Vector3并修改符合条件的顶点颜色
解决Three.js中按顶点Y值修改顶点颜色的问题
首先得纠正你一开始对Face3顶点的理解:Face3的a、b、c属性存储的是顶点在geometry.vertices数组中的索引值,不是顶点对象本身。所以你之前尝试的face1.a[1]、face1.a.y这些写法肯定会报错——你是在给一个数字(索引)读属性,自然读不到。你后来通过vertices[face.a]获取顶点对象的方式是完全正确的。
接下来解决顶点颜色不生效的问题,核心是Three.js的材质默认不会启用顶点颜色渲染,再加上你代码里的小逻辑问题,导致颜色没显示出来,具体修正步骤如下:
1. 给材质开启顶点颜色支持
默认情况下,Three.js的材质会忽略顶点的颜色设置,你需要显式开启这个选项。不管你用的是MeshBasicMaterial还是MeshPhongMaterial这类带光照的材质,都要加上vertexColors配置:
// 示例:创建支持顶点颜色的基础材质 const material = new THREE.MeshBasicMaterial({ vertexColors: THREE.VertexColors, // 关键:启用顶点颜色渲染 // 其他材质属性(比如透明度、线框等)按需添加 });
2. 修正颜色设置的逻辑并标记更新
你之前的代码用了else if,这会导致同一个面里只有第一个符合Y值条件的顶点被修改,其他符合条件的会被跳过。改成三个独立的if判断,才能保证所有符合条件的顶点都被染色。另外,设置完颜色后必须告诉Three.js几何体的颜色数据需要更新:
const faces = geometry.faces; const vertices = geometry.vertices; const colorPink = new THREE.Color(0xff69b4); // 确保是Three.js的Color对象 for (let i = 0; i < faces.length; i++) { const face = faces[i]; const vertexA = vertices[face.a]; const vertexB = vertices[face.b]; const vertexC = vertices[face.c]; // 用独立if,避免漏改多个符合条件的顶点 if (vertexA.y > 3.1) { vertexA.color = colorPink; } if (vertexB.y > 3.1) { vertexB.color = colorPink; } if (vertexC.y > 3.1) { vertexC.color = colorPink; } } // 关键:通知Three.js更新颜色数据 geometry.colorsNeedUpdate = true;
额外说明(可选)
如果你用的是Three.js推荐的BufferGeometry(性能优于旧版Geometry),顶点颜色的处理方式会略有不同:需要创建一个颜色属性缓冲区,直接修改对应位置的颜色值后标记缓冲区更新。不过从你的代码来看,你用的是旧版Geometry,上面的方案完全适用。
内容的提问来源于stack exchange,提问作者glaemart
相关产品推荐
相关产品推荐

