5

我正在尝试在 BufferGeometry 中设置每个面的 UV 指数。

我从几何开始。我的几何图形的每个面都有一个face.materialIndex对应的 UV 指数。我正在尝试将其转换为 BufferGeometry,然后将其映射face.materialIndexBufferGeometry.

这是我到目前为止所拥有的:

// 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 ) );

现在这似乎破坏了我的网格并使它根本不绘制。我究竟做错了什么?

顺便说一句,在引擎盖下,当 Geometry 转换为 BufferGeometry 时,Three.js 将其置于首先称为 a 的中间格式DirectGeometry。这用于复制索引,但由于 Doob 先生在此提交中未知的原因而将其删除。现在 Three 似乎在 Geo > BufGeo 转换中完全放弃了索引。

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

const indices = new Uint16Array( faceIndices.length * 3 );
bufGeo.addAttribute( 'index', new BufferAttribute( indices, 1 ).copyIndicesArray( faceIndices ) );

但我有同样的问题。生成的网格被破坏。

4

1 回答 1

1

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

materialIndex 对应于从材质数组中渲染该三角形的材质,而不是 UV 索引。从Face3 文档

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

materialIndex除非您对它进行了更改,否则每个面很可能为零,这可以解释为什么您的模型停止绘制(面上的顶点都是相同的)。

这条线是你的问题:

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

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

可能的解决方案

希望有帮助!

于 2018-05-24T07:25:12.677 回答