Я изучаю, как THREE создает SphereGeometry, и я вижу, что он использует функцию SphereBufferGeometry().THREE.js 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) * (ГВ + 1) формула vertexCount вызывает у меня проблемы при попытке исказить сферу, применяя случайные скаляры к каждой вершине. Если бы было только 14 «реальных» вершин, проблем не было бы. Но с 25 вершинами мне нужно знать, какие виртуальные вершины относятся к одной и той же реальной вершине, так что всем виртуальным вершинам может быть присвоено одно и то же скалярное значение. В противном случае между соседними треугольниками появляются пространственные промежутки.
Update
ответ знакомства WestLangley в.
Также обратите внимание, что индекс (4x4 размера) SphereBufferGeometry имеет 72 элемента, которые соответствуют 72 "виртуальным" вершинам. Каждый элемент указывает на соответствующие 1 (из 25) в-буферных вершин. Таким образом, при желании, индекс может использоваться (в коде) для чтения из SphereBufferGeometry и записывать все 72 "виртуальные" вершины (фактически все 72 * 3 = 216 координат вершин) в новый изначально пустой «плоский» пользовательский буфер ,
Ах спасибо, спасибо. Я вижу, что SphereBufferGeometry не содержит объектов «лицо» как таковых, должно ли оно быть «треугольниками» в вашем предложении 1? – steveOw
(1) Я думаю, что все в порядке, как написано, но я сделал другую поправку к ответу.(2) Если вам не нравятся UV, вы можете создать свою собственную сферическую буферную геометрию для своего приложения, которая не дублирует вершины. – WestLangley