Как получить доступ к атрибутам bufferGeometry из компонента A-Frame
Я пишу компонент, которому требуется доступ и изменение атрибутов позиции, нормального и ультрафиолетового излучения в модели, считываемой в A-Frame как актив. Я могу приблизиться к доступу к данным, но не могу добраться до них. С помощью:
document.querySelector('a-entity').object3D.children
кажется, дает мне массив, но попытка доступа к элементам дает мне объект с пустыми дочерними элементами и пустой геометрией.
Я предполагаю, что я пытаюсь получить доступ к данным не в ту дверь и пока:
console.log(document.querySelector('a-entity').object3D.children);
показывает мне размер массива =1 с заполненным элементом Object
console.log(document.querySelector('a-entity').object3D.children[0]);
дает мне элемент с пустым гео и т. д. Какой правильный механизм или синтаксис использовать, чтобы получить данные?
1 ответ
Здесь вам нужно знать два класса three.js: Geometry и BufferGeometry. У первого уже есть свойства для geometry.vertices
а также geometry.faces
(см. документацию там). Вершины - это массив объектов THREE.Vertex3, с которыми легко работать.
Если у вас есть BufferGeometry, то вместо этого у вас есть geometry.attributes.position
который не является массивом THREE.Vertex3, но вместо этого содержит плоский массив с плавающей точкой, например [x1, y1, z1, x2, y2, ...]
, Это более эффективно, но сложнее изменить вручную.
Если у вас есть BufferGeometry, но вы предпочитаете работать с Geometry, то вы можете выполнить преобразование любым из следующих способов:
var geometry = Geometry.fromBufferGeometry( mesh.geometry );
mesh.geometry = BufferGeometry.fromGeometry( geometry );
A-Frame-примечание, обычно вы получите ссылку на сетку, выполнив el.getObject3D('mesh')
, Для пользовательских моделей, которые могут быть вложенной группой, в этом случае:
el.object3D.traverse(function(node) {
if (node.geometry) { /* ... */ }
});
(three.js r84)