我正在尝试在BufferGeometry中设置每面UV索引。
我从几何开始。我几何图形的每个面都有一个与紫外线指数相对应的face.materialIndex
。我试图将其转换为BufferGeometry,然后将face.materialIndex
映射到BufferGeometry
。
这是我到目前为止的内容:
// 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会将其以一种中间格式放置,该格式首先称为
DirectGeometry
。这曾经用于复制索引,但it was removed for reasons unknown in this commit by Mr Doob。现在,三个似乎完全在“地理位置> BufGeo”转换中放弃了索引。我也尝试使用该提交中的代码(修改为使用setIndex):
const indices = new Uint16Array( faceIndices.length * 3 );
bufGeo.addAttribute( 'index', new BufferAttribute( indices, 1 ).copyIndicesArray( faceIndices ) );
但是我有同样的问题。生成的网格被破坏。
最佳答案
setIndex
函数用于指定三角形索引,这些三角形索引引用BufferGeometry上的顶点属性缓冲区。在您的示例中,您将三角形索引数组设置为从每个面的materialIndex
生成的数组。
materialIndex对应于使用一系列材料而不是UV索引渲染该三角形的材料。从Face3 documentation:
materialIndex —(可选)与面相关联的一系列材料的索引。
除非您进行了某些更改以将materialIndex
设置为零,否则每个面的// Get an array of all the original geometry's indices...const faceIndices = geometry.faces.map( face => face.materialIndex );
极有可能是零,这可以解释为什么模型停止绘制(面的顶点都相同)。
这行是你的问题:materialIndex
还可能需要特别注意的是,通过这种方式生成一个数组,您将获得属性所需的1/3个数组元素,因为每个面有3个顶点。
可能的解决方案
如果您想用不同的材质渲染每个面,如所对应,那么我会考虑groups for BufferGeometry
如果要为BufferGeometry实际生成自定义UV坐标,则可以查看BufferAttributes和BufferGeometry.addAttribute函数以添加新的UV属性。
希望有帮助!