BufferGeometry - Руководство по Вердж3Д - Софт Эйт Софт
Description: Узнайте как использовать BufferGeometry в интерактивных 3Д-веб-приложениях сделанных на Вердж3Д

# BufferGeometry

Эффективное представление геометрии меша, линий или точек. Включает позиции вершин, индексы граней, нормали, цвета, UV и пользовательские атрибуты в буферах, снижая затраты на передачу всех этих данных в GPU.

Для чтения и редактирования данных в атрибутах BufferGeometry смотрите документацию BufferAttribute.

## Пример

`const geometry = new v3d.BufferGeometry(); // создаём квадрат; дублируем левый верхний и правый нижний угол вершин, // поскольку каждая вершина должна появляться для каждого треугольника по одному разу const vertices = new Float32Array([ -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0 ]); // itemSize = 3, поскольку на каждую вершину приходится 3 значения (компонента) geometry.setAttribute('position', new v3d.BufferAttribute(vertices, 3)); const material = new v3d.MeshBasicMaterial({ color: 0xff0000 }); const mesh = new v3d.Mesh(geometry, material);`

## Конструктор

### BufferGeometry()

Создает новый BufferGeometry. Также устанавливает несколько свойств в значение по умолчанию.

## Свойства

### # .attributes : Object

Эта хэш-таблица имеет в качестве id имя устанавливаемого атрибута, а в качестве value — устанавливаемый buffer. Вместо прямого доступа к этому свойству, для доступа к атрибутам геометрии используйте .setAttribute и .getAttribute.

### # .boundingBox : Box3

Ограничивающий бокс для BufferGeometry, рассчитывается с помощью метода .computeBoundingBox(). По умолчанию `null`.

### # .boundingSphere : Sphere

Ограничивающая сфера для BufferGeometry, рассчитывается с помощью метода .computeBoundingSphere(). По умолчанию `null`.

### # .drawRange : Object

Определяет часть геометрии для отрисовки. Его не следует задавать напрямую, вместо этого используйте .setDrawRange. По умолчанию:

`{ start: 0, count: Infinity }`

Для неиндексированной BufferGeometry, count — это количество вершин для рендеринга. Для индексированной BufferGeometry, count — это количество индексов для рендеринга.

### # .groups : Array

Разделяет геометрию на группы, каждая из которых будет отрисована в отдельном WebGL-вызове. Это позволяет использовать массив материалов вместе с геометрией.

Каждая группа является объектом вида:

`{ start: Integer, count: Integer, materialIndex: Integer }`

где `start` указывает первый элемент в вызове отрисовки — первая вершина для неиндексированной геометрии, либо индекс первого треугольника. `count` указывает, сколько вершин (или индексов) будет включено, а `materialIndex` указывает индекс в используемом массиве материалов.

Используйте .addGroup для добавления групп, а не изменяйте этот массив напрямую.

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

### # .id : Integer

Уникальный номер для данного экземпляра BufferGeometry.

### # .index : BufferAttribute

Позволяет повторно использовать вершины в нескольких треугольниках; это называется использованием "индексированных треугольников". Поскольку каждый треугольник связан с индексами трех вершин, данный атрибут хранит индекс каждой вершины для каждой треугольной грани.

Если этот атрибут не установлен, то renderer предполагает, что все три смежные позиции представляют собой один треугольник.

По умолчанию `null`.

### # .isBufferGeometry : Boolean

Флаг, указывающий, что данный объект является экземпляром BufferGeometry. Только для чтения.

### # .morphAttributes : Object

Хэш-таблица BufferAttribute-атрибутов, содержащих сведения о морф таргетах. Внимание: после создания геометрии, данные морф таргетов не могут быть изменены. Вам потребуется вызвать метод .dispose() и создать новый экзепляр BufferGeometry.

### # .morphTargetsRelative : Boolean

Используется для управления поведением цели морфа; если установлено значение `true`, данные цели морфа обрабатываются как относительные смещения, а не как абсолютные позиции/нормали. По умолчанию `false`.

### # .name : String

Необязательное имя для данного экземпляра BufferGeometry. По умолчанию это пустая строка.

### # .userData : Object

Объект, который можно использовать для хранения пользовательских данных о BufferGeometry. Он не должен содержать ссылки на функции, так как они не будут клонироваться.

### # .uuid : String

UUID данного экземпляра. Он присваивается автоматически и не подлежит редактированию.

## Методы

Методы базового класса EventDispatcher также могут использоваться в данном классе.

### # .addGroup(start : Integer, count : Integer, materialIndex : Integer)

Добавляет группу к этой геометрии; подробности см. в свойстве groups.

### # .applyMatrix4(matrix : Matrix4)

Запекает матричное преобразование непосредственно в геометрию.

### # .applyQuaternion(quaternion : Quaternion) → this

Запекает кватернион поворота непосредственно в геометрию.

### # .center() → BufferGeometry

Центрирует геометрию на основе ограничивающего бокса.

### # .clearGroups()

Очищает все группы.

### # .clone() → BufferGeometry

Создает клон текущей BufferGeometry.

### # .computeBoundingBox()

Вычисляет граничную область геометрии, обновляя атрибут .boundingBox. Граничные поля не вычисляются по умолчанию. Они должны быть вычислены явно, иначе они `null`.

### # .computeBoundingSphere()

Вычисляет граничную сферу геометрии, обновляя атрибут .boundingSphere. Граничные сферы не вычисляются по умолчанию. Их нужно вычислить явно, иначе они будут `null`.

### # .computeTangents()

Calculates and adds a tangent attribute to this geometry.

The computation is only supported for indexed geometries and if position, normal, and uv attributes are defined.

### # .computeVertexNormals()

Вычисляет нормали вершин путем усреднения нормалей граней.

### # .copy(bufferGeometry : BufferGeometry) → BufferGeometry

Копирует другую BufferGeometry в текущую BufferGeometry.

### # .deleteAttribute(name : String) → BufferAttribute

Удаляет атрибут BufferAttribute с указанным именем.

### # .dispose()

Удаляет объект из памяти. Вы должны вызвать этот вызов, когда вы хотите удалить BufferGeometry во время работы приложения.

### # .getAttribute(name : String) → BufferAttribute

Возвращает атрибут BufferAttribute с указанным именем.

### # .getIndex() → BufferAttribute

Возвращает буфер .index.

### # .hasAttribute(name : String) → Boolean

Возвращает `true`, если атрибут с указанным именем существует.

### # .lookAt(vector : Vector3) → BufferGeometry

vector — вектор в мировой системе координат, вдоль которого нужно посмотреть.

Поворачивает геометрию лицом к точке в пространстве. Обычно это выполняется однократно, а не в в процессе рендеринга. Используйте Object3D.lookAt для простого ориентирования мешей в реальном времени.

### # .normalizeNormals()

Каждый нормальный вектор в геометрии будет иметь величину 1. Это исправляет освещение на поверхностях геометрии.

### # .rotateX(radians : Float) → BufferGeometry

Поворачивает геометрию вокруг оси X. Обычно это делается однократно, а не в процессе рендеринга. Используйте Object3D.rotation для простого вращения мешей в реальном времени.

### # .rotateY(radians : Float) → BufferGeometry

Поворачивает геометрию вокруг оси Y. Обычно это делается однократно, а не в процессе рендеринга. Используйте Object3D.rotation для простого вращения мешей в реальном времени.

### # .rotateZ(radians : Float) → BufferGeometry

Поворачивает геометрию вокруг оси Z. Обычно это делается однократно, а не в процессе рендеринга. Используйте Object3D.rotation для простого вращения мешей в реальном времени.

### # .scale(x : Float, y : Float, z : Float) → BufferGeometry

Масштабирование геометрических данных. Обычно это делается однократно, а не в процессе рендеринга. Используйте Object3D.scale для простого масштабирования мешей в реальном времени.

### # .setAttribute(name : String, attribute : BufferAttribute) → BufferGeometry

Устанавливает атрибут для данной геометрии. Используйте это свойство вместо свойства attributes, так как для ускорения итерации по атрибутам ведется внутренняя хэш-таблица .attributes.

### # .setDrawRange(start : Integer, count : Integer)

Устанавливает свойство .drawRange. Для неиндексированной BufferGeometry, count - это количество вершин для отрисовки. Для индексированной BufferGeometry, count — это количество индексов для рендеринга.

### # .setFromPoints(points : Array) → BufferGeometry

Устанавливает атрибуты для этой BufferGeometry из массива точек.

### # .setIndex(index : BufferAttribute) → BufferGeometry

Устанавливает буфер .index.

### # .toNonIndexed() → BufferGeometry

Возвращает неиндексную версию индексированной BufferGeometry.

### # .translate(x : Float, y : Float, z : Float) → BufferGeometry

Перемещает геометрию. Обычно это делается однократно, а не в процессе рендеринга. Используйте Object3D.position для простого перемещения меша в реальном времени.

## Исходный файл

О том как получить исходный код этого модуля читайте тут.