A-Frame getObject3D ('mesh') возвращает неопределенное значение с несколькими попытками - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь получить ограничивающую рамку для obj-модели в A-рамке. Я ссылаюсь на эти две полезные ссылки, которые я нашел в stackoverflow: Как получить информацию о ограничительной рамке из трехмерного объекта в рамке? Есть ли способ получить ограничивающую рамку из объекта Three.js Object3D? Но после того, как я попробовал с этим кодом ниже,

AFRAME.registerComponent('bounding-box', {
            init: function(){
                var el = this.el;
                var obj = el.getObject3D('mesh');
                console.log(obj);
                var bbox = new THREE.Box3().setFromObject(obj);
                console.log(bbox.min, bbox.max);    
            }
        })

Я получил "undefined" от console.log(obj);, а затем попробовал метод, упомянутый в ссылке выше,

AFRAME.registerComponent('bounding-box', {
    init: function(){
        var el = this.el;
        console.log(el);
        el.setAttribute('obj-model', {obj: 'obj5/1026/1026outside.obj'});
        var obj = el.getObject3D('mesh');
        console.log(obj);
        var bbox = new THREE.Box3().setFromObject(obj);
        console.log(bbox.min, bbox.max);    
    }
})

Но все равно без удачи. Только если я поместил код чуть выше закрывающего тега, иногда он работает и регистрирует правильную информацию ограничительной рамки.

<script>
    var el = document.querySelector('#b-model');
    console.log(el);
    var obj = el.getObject3D('mesh');
    console.log(obj);

    var bbox = new THREE.Box3().setFromObject(obj);
    console.log(bbox.min, bbox.max);    
</script>
</body>

Я думаю, что это связано с последовательностью загрузки, но я не понимаю обсуждения в этом посте: Как загрузить 3D-объект во время выполнения в рамке? Как я уже пробовал выше, этот метод не работает. Или, может быть, я неправильно использовал el.setAttribute? Я также заметил, что Феликс сказал, что использование three.objLoader может решить проблему, и я тоже пытался, но все еще безуспешно. Теоретически я знаю, что причина регистрации компонента заключается в том, что он выполняется только после инициализации присоединенного объекта. Так что я очень смущен здесь. Может кто-нибудь дать мне знать, как это сделать, зарегистрировав компонент, а не свободный JavaScript в конце? Заранее спасибо!

1 Ответ

0 голосов
/ 12 ноября 2018

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

Если вы ожидаете события model-loaded:

modelElement.addEventListener('model-loaded', (e) => {
  var obj = modelElement.getObject3D('mesh');
  var bbox = new THREE.Box3().setFromObject(obj);
  console.log(bbox)
})

Должно работать нормально.Проверьте это на этом сбое или на этой скрипке с моделью gltf.

...