Three.js:为BufferGeometry设置索引/索引的正确方法?

Three.js:为BufferGeometry设置索引/索引的正确方法?,three.js,buffer-geometry,Three.js,Buffer Geometry,我正在尝试在缓冲几何体中设置每面UV索引 我从几何学开始。几何体的每个面都有一个对应于UV索引的面.materialIndex。我试图将其转换为缓冲几何体,然后将面.materialIndex映射到缓冲几何体 以下是我目前掌握的情况: // Convert geometry > buffergeometry const bufGeo = new BufferGeometry().fromGeometry( geometry ); // Get an array of all the or

我正在尝试在缓冲几何体中设置每面UV索引

我从几何学开始。几何体的每个面都有一个对应于UV索引的
面.materialIndex
。我试图将其转换为缓冲几何体,然后将
面.materialIndex
映射到
缓冲几何体

以下是我目前掌握的情况:

// Convert geometry > buffergeometry
const bufGeo = new BufferGeometry().fromGeometry( geometry );

// Get an array of all the original geometry's indices...
const faceIndices = geometry.faces.map( face => face.materialIndex );

// Build a new array with the indices...
const indices = new Uint16Array( faceIndices );

// Apply to the BufferGeometry
bufGeo.setIndex( new BufferAttribute( indices, 1 ) );
现在,这似乎撞到了我的网格,使其根本无法绘制。我做错了什么

顺便说一句,在引擎盖下,当一个几何体转换为BufferGeometry时,Three.js将其转换为中间格式,首先称为
DirectGeometry
。这用于复制索引,但是。目前,三家公司似乎在Geo>BufGeo转换中完全放弃了指数

我还尝试使用该提交中的代码(修改为使用setIndex):


但我也有同样的问题。生成的网格将被截断。

使用
setIndex
函数指定三角形索引,该索引引用缓冲几何体上的顶点属性缓冲区。在您的示例中,您将三角形索引数组设置为从每个面的
materialIndex
生成的数组

materialIndex对应于用于渲染三角形的材质,该材质来自材质数组,而不是UV索引。从:

materialIndex-(可选)与面关联的材质数组的索引

很可能每个面的
materialIndex
都为零,除非您做了一些更改,这可以解释为什么您的模型停止绘制(面上的顶点都是相同的)

这是你的问题:

//获取所有原始几何体索引的数组。。。
const faceindex=geometry.faces.map(face=>face.materialIndex);

还需要注意的是,通过这种方式生成数组,您将获得属性所需数量的1/3数组元素,因为每个面有3个顶点

可能的解决方案

  • 如果您希望使用不同的材质渲染每个面,就像
    materialIndex
    对应的那样,那么我将研究

  • 如果您想要为BufferGeometry实际生成自定义UV坐标,我将研究添加新UV属性的函数


希望有帮助

请停止将
webgl
标记添加到此问题。这个问题与WebGL无关。这完全是一个3.js的问题,永远不会!!(缓冲区是webgl非常重要的一部分)您是否找到了解决方案?我遇到了完全相同的问题,没有找到任何文档。一件似乎有效的事情是将索引设置为标准数组,并将其直接传递到setIndex(尽管这在任何文档中都没有,但在示例中就是这样做的)。但是,似乎无法更新阵列。
const indices = new Uint16Array( faceIndices.length * 3 );
bufGeo.addAttribute( 'index', new BufferAttribute( indices, 1 ).copyIndicesArray( faceIndices ) );