Подтвердить что ты не робот

Three.js - Что такое PlaneBufferGeometry

Что такое PlaneBufferGeometry точно и как она отличается от PlaneGeometry? (R69)

4b9b3361

Ответ 1

PlaneBufferGeometry - альтернатива с низкой памятью для PlaneGeometry. сам объект отличается многими способами. например, вершины расположены в PlaneBufferGeometry, расположены в PlaneBufferGeometry.attributes.position вместо PlaneGeometry.vertices

вы можете быстро взглянуть в консоли браузера, чтобы выяснить больше различий, но, насколько я понимаю, поскольку вершины обычно расположены на равномерном расстоянии (X и Y) друг от друга, только высота (Z) должна быть задана для размещения вершины.

Ответ 2

Основные различия между Geometry и BufferGeometry.

Геометрия - это "удобная для пользователя", объектно-ориентированная структура данных, в то время как BufferGeometry - это структура данных, которая более точно отображает, как данные используются в шейдерной программе. BufferGeometry работает быстрее и требует меньше памяти, но Geometry в некоторых отношениях более гибок, и некоторые операции можно выполнять с большей легкостью.

У меня очень мало опыта работы с Geometry, так как я обнаружил, что BufferGeometry выполняет свою работу в большинстве случаев. Полезно изучить фактические структуры данных, которые используются шейдерами, и работать с ними.

В случае PlaneBufferGeometry вы можете получить доступ к позициям вершин следующим образом:

let pos = geometry.getAttribute("position");
let pa = pos.array;

Затем установите значения z следующим образом:

var hVerts = geometry.heightSegments + 1;
var wVerts = geometry.widthSegments + 1;
for (let j = 0; j < hVerts; j++) {
    for (let i = 0; i < wVerts; i++) {
                            //+0 is x, +1 is y.
        pa[3*(j*wVerts+i)+2] = Math.random();
    }
}
pos.needsUpdate = true;
geometry.computeVertexNormals();

Случайность - это всего лишь пример. Вы также можете (например, другой) построить функцию x, y, если вы let x = pa[3*(j*wVerts+i)]; и let y = pa[3*(j*wVerts+i)+1]; во внутренней петле. Для небольшого выигрыша в производительности в случае PlaneBufferGeometry, let y = (0.5-j/(hVerts-1))*geometry.height взамен let y = (0.5-j/(hVerts-1))*geometry.height во внешнем цикле.

geometry.computeVertexNormals(); Рекомендуется, если ваш материал использует нормали, и вы не рассчитали более точные аналитические анализы. Если вы не поставите или не вычислите нормали, материал будет использовать нормали плоскости по умолчанию, которые все указывают прямо из исходной плоскости.

Обратите внимание, что количество вершин в измерении на один больше, чем количество сегментов в одном измерении.

Также обратите внимание, что (нелогично) значения y перевернуты относительно индексов j: vertices.push( x, - y, 0 ); (источник)