2016-03-23 3 views
1

Я изучаю, как 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 координат вершин) в новый изначально пустой «плоский» пользовательский буфер ,

ответ

3

SphereBufferGeometryBufferGeometry, который является «индексированным» - вершины могут быть разделены между лицами.

Причина, по которой необходимы дополнительные вершины из-за швов.

На стороне сферы есть шов, и на обоих северных и южных полюсах есть шов.

Дублирующие вершины необходимы вдоль каждого шва, потому что УФ варьируются вдоль швов.

Каждая вершина может иметь любое количество атрибутов, но если две вершины в одном и том же месте имеют по меньшей мере один атрибут, отличный от другого, то вершины должны быть дублированы.

three.js r.75

+0

Ах спасибо, спасибо. Я вижу, что SphereBufferGeometry не содержит объектов «лицо» как таковых, должно ли оно быть «треугольниками» в вашем предложении 1? – steveOw

+1

(1) Я думаю, что все в порядке, как написано, но я сделал другую поправку к ответу.(2) Если вам не нравятся UV, вы можете создать свою собственную сферическую буферную геометрию для своего приложения, которая не дублирует вершины. – WestLangley

Смежные вопросы