Объекты, содержащие модели GLTF, сложны, так как содержат много моделей внутри контейнера gltf. Вы не можете использовать setAttribute для моделей внутри GLTF, как вы можете использовать с другими примитивами. Вместо этого вы должны относиться к ним как к моделям THREEjs. Это означает, что вам нужно создать собственный компонент, который будет «проходить» через gltf, находить модели и сохранять ссылки на них переменных, а затем вы сможете изменять параметры этих моделей на уровне THREEjs. Например,
AFRAME.registerComponent('treeman', {
init: function(){
let el = this.el;
let self = this;
self.trees = [];
el.addEventListener("model-loaded", e =>{
let tree3D = el.getObject3D('mesh'); // get the THREEjs group
if (!tree3D){return;}
console.log('tree3D', tree3D); // log the THREEjs group so you can look
at all of its contents and parameters.
tree3D.traverse(function(node){ // this is how you loop through
(traverse) the models
if (node.isMesh){
console.log(node);
self.trees.push(node);
if(node.name == "Trunk_A"){
self.treeMat = node.material; // store a reference to the
material you want to modify later
}
node.material.map = null; // removes the texture so we can see
color clearly
}
});
});
Позже вы сможете получить доступ к этому компоненту с помощью функций прослушивателя событий и выполнять какие-либо действия с материалами. как это
el.addEventListener('changecolor', e =>{
let colorp = e.detail.color;
let colorHex = Number(colorp.replace('#', '0x'));
let color3D = new THREE.Color(colorHex);
self.treeMat.color = color3D;
});
Обратите внимание, что мы должны поместить цвет в структуры данных, которые нужны ТРИ, как объект цвета. Все это большая работа по сравнению с простотой Aframe, но у вас гораздо больше контроля, и вы можете точно видеть, что происходит под капотом.
сбой здесь .