Three.js中BufferGeometry索引的立方体UV映射问题
解决Three.js BufferGeometry立方体UV映射异常的问题
嘿,这个坑我之前踩过!核心问题出在你复用顶点的同时也复用了UV数据——BufferGeometry里的顶点位置、UV这些属性是一一对应的,而立方体的同一个顶点在不同面上需要的UV坐标根本不一样啊!
问题本质拆解
立方体的8个顶点每个都会被3个面共享,但比如顶部面的某个顶点,它的UV应该对应纹理的顶部区域;而正面的同一个顶点,UV得对应纹理的正面区域。你现在把顶点去重成8个,UV也跟着共用一套,自然就会出现部分面UV错乱的情况。
具体解决方案
- 放弃顶点复用(最直接有效):
不要跳过重复的顶点,每个面保留自己独立的4个顶点。也就是说,创建模板面时就给它配置好正确的UV,旋转复制这个面的时候,直接完整复制它的顶点位置和UV数据。最终你的BufferGeometry会有24个顶点(6个面×4个顶点),每个顶点对应专属的UV,这样映射出来的纹理就完全正常了。 - 如果坚持要复用顶点(性能优化场景):
这种情况下你需要使用额外的UV属性(比如uv2)或者通过自定义着色器来根据面的法线动态计算UV,但这种方法复杂度高,对于立方体这种简单几何体完全没必要,反而会增加代码维护成本。
补充提醒
你之前用索引构建几何体,索引的作用是复用顶点来减少绘制调用,但前提是顶点的所有属性(位置、法线、UV等)在复用场景下都是一致的。显然立方体的UV不满足这个条件,所以必须拆分顶点。
内容的提问来源于stack exchange,提问作者Hoxer
相关产品推荐
相关产品推荐

