如何将面添加到索引的THREE.BufferGeometry中?

时间:2016-04-19 22:08:22

标签: javascript three.js

假设我已经从名为THREE.BufferGeometry的{​​{1}}生成THREE.Geometry,如此:

oldGeom

希望我有正确的索引。此时,如何使用索引添加面部?我打算循环遍历// using WebGLRenderer var geometry = new THREE.BufferGeometry(); var indices = new Uint16Array(oldGeom.vertices.length); var vertices = new Float32Array(oldGeom.vertices.length * 3); for (var i = 0; i < oldGeom.vertices.length; i++) { indices[i] = i; vertices[i * 3 + 0] = oldGeom.vertices[i].x; vertices[i * 3 + 1] = oldGeom.vertices[i].y; vertices[i * 3 + 2] = oldGeom.vertices[i].z; } geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3)); geometry.setIndex(new THREE.BufferAttribute(indices, 1)); 的面孔,将它们全部添加到此处,但我找不到任何关于此的文档。谢谢!

this question类似,但带有索引几何。

1 个答案:

答案 0 :(得分:4)

来自the documentation for BufferGeometry:

  

index(itemSize:3)

     

允许在多个三角形中重复使用顶点;这被称为使用“索引三角形”,并且与几何中的工作方式大致相同:每个三角形与三个顶点的索引相关联。因此,该属性存储每个三角形面的每个顶点的索引。如果未设置此属性,则渲染器会假定每三个连续位置代表一个三角形。

“索引三角形”的工作方式是“位置”是一个数字数组,每个连续的3个数字组代表一个顶点(x,y,z)。 “Index”是一个数字数组,其中每个连续的3个数字代表一个面,通过引用“position”数组中顶点的 indices

你可能有一个像这样的顶点数组:

var vertices = [0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0];

您可以将此数组视为XYZ坐标集,如下所示:

var vertices = [
    0, 0, 0, // vertex index 0
    1, 0, 0, // vertex index 1
    1, 1, 0, // vertex index 2
    0, 1, 0  // vertex index 3
];

现在,如果你有一个像这样的索引数组:

var indices = [0, 1, 2, 1, 2, 3];

它代表两个三角形:

var indices = [
    0, 1, 2, // face with vertices at indices 0, 1, 2
    1, 2, 3  // face with vertices at indices 1, 2, 3
];

因此,三角形#1的顶点位于XYZ(0,0,0),(1,0,0),(1,1,0),而三角形#2的顶点位于XYZ(1,0,0), (1,1,0),(0,1,0)。

另一方面,您可以使用索引定义顶点而不使用。索引的强大之处在于它允许您重复使用数组中定义的顶点,而不是每次出现在三角形中时冗余地列出它们。如果您有一个数组vertices,那么非常简单,数组中的每组9个数字都是一个三角形(三组连续的顶点,每个顶点都有三个连续的XYZ值)。

回到原来的问题,如果你想为BufferedGeometry添加三角形,我会看到两个基本选项:

  1. 将三角形添加到原始oldGeom对象,然后将其转换。向几何体添加三角形比使用BufferGeometry要容易得多。请记住,BufferGeometry的重点在于它不应该改变!您还可以利用.fromGeometry(),因为新面孔已在oldGeom中定义。
  2. 创建一个大于原始索引所需的indices数组,并在那里手动定义三角形。如果您要定义顶点数组中不存在的新顶点,那么您也必须在那里添加它们。对接是多么痛苦。