THREE.js SphereBufferGeometry - 为什么这么多顶点?

时间:2016-03-23 13:27:29

标签: three.js geometry

我正在研究THREE如何构建一个SphereGeometry,我发现它使用了SphereBufferGeometry()函数。

我试图理解为什么它会创建它所做的顶点数量。例如,如果我指定球体有4个宽度段和4个高度段,则THREE将定义25个顶点。

草图表明"球体"应该有4 + 8 + 8 + 4 = 24个独立的三角形,如果每个三角形有3个非共享顶点,我们总共得到72"虚拟"顶点。但是如果我们在多个三角形之间共享每个顶点,那么将有1 + 4 + 4 + 4 + 1 = 14"真实"顶点。

在代码中有这一行: -

var vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) );

因此,这将解释顶点数(4 + 1)*(4 + 1)= 25的来源。此数字(vertexCount)还确定创建的位置,法线和UV的数量。但为什么需要这么多(25)个顶点呢?由于THREE正在使用索引来跨多个三角形共享顶点,那么为什么不创建14" real"顶点?

修改

实际上,(wS + 1)*(hS + 1)vertexCount公式在尝试通过对每个顶点应用随机标量来变形球体时会出现问题。如果只有14"真实"顶点就没问题了。但是对于25个顶点,我需要知道哪些虚拟顶点与同一个真实顶点相关,以便可以为所有虚拟顶点分配相同的标量值。否则,在一些相邻的三角形之间会出现空间间隙。

更新

见WestLangley的回答。

另请注意,(4x4大小)SphereBufferGeometry的索引有72个元素,对应于72"虚拟"顶点。每个元素指向相应的1个(25个中)缓冲区内顶点。因此,如果需要,可以使用索引(在代码中)从SphereBufferGeometry读取并写入所有72"虚拟"顶点(实际上所有72 * 3 = 216个顶点位置坐标)到一个新的最初空的"平面"自定义缓冲区

1 个答案:

答案 0 :(得分:4)

SphereBufferGeometry BufferGeometry是"已编入索引" - 顶点可以在面之间共享。

需要额外顶点的原因是因为接缝。

球体侧面有一个接缝,北极和南极都有一个接缝。

沿着每个接缝需要重复的顶点,因为UV沿着接缝变化。

每个顶点可以包含任意数量的属性,但如果同一位置的两个顶点至少有一个不同的属性,则顶点必须重复。

three.js r.75