【发布时间】:2016-07-10 19:44:54
【问题描述】:
我正在研究 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 个“真实”顶点呢?
编辑
实际上,(wS+1)*(hS+1) vertexCount 公式在尝试通过对每个顶点应用随机标量来使球体变形时给我带来了问题。如果只有 14 个“真实”顶点,就没有问题。但是对于 25 个顶点,我需要知道哪些虚拟顶点与同一个真实顶点相关,以便可以为所有虚拟顶点分配相同的标量值。否则一些相邻三角形之间会出现空间间隙。
更新
查看 WestLangley 的回答。
还要注意,(4x4 大小)SphereBufferGeometry 的索引有 72 个元素,对应于 72 个“虚拟”顶点。每个元素都指向相应的 1 个(共 25 个)缓冲区内顶点。因此,如果需要,可以使用索引(在代码中)从 SphereBufferGeometry 读取并将所有 72 个“虚拟”顶点(实际上所有 72*3 = 216 个顶点位置坐标)写入一个新的初始为空的“平面”自定义缓冲区.
【问题讨论】: