2017-08-15 1 views
6

Je me demandais s'il existait un moyen d'obtenir la boîte englobante pour les modèles insérés via 3dio.js, ou de calculer autrement leurs points centraux? Je cherche à les centrer sur l'origine.Obtention de la boîte englobante ou des centres de modèles

Les images ci-dessous montrent deux modèles relatifs à l'origine de la scène indiquée par la boîte rouge.

3D-Model_1

3D-Model_2

Répondre

6

Vous pouvez accéder à l'objet Three.js de l'entité 3d.io comme ceci:

var threeElem = document.getElementById("custom-id").components['io3d-data3d'].data3dView.threeParent 

Ensuite, vous pouvez utiliser la boîte englobante natif de Three.js :

var bbox = new THREE.Box3().setFromObject(threeElem) 

Comme cela vous obtenez les limites min/max qui ch vous pouvez utiliser pour déterminer l'origine.

J'espère que cela répond à votre question. Faites le moi savoir!

Edit: pour les meubles, il serait probablement

var threeElem = document.getElementById("custom-id").components['io3d-furniture'].data3dView.threeParent 
+1

fonctionne très bien grâce, juste un peu faute de frappe. 'Data3dView' devrait être' data3dView'. C'est ce que j'avais essayé à l'origine mais cela n'a pas fonctionné car le modèle n'était pas encore chargé. Cela a été résolu en écoutant l'événement 'model-loaded'. Je vais ajouter ma solution comme réponse ci-dessous pour référence pour d'autres. –

+0

merci beaucoup. J'ai corrigé la faute de frappe dans ma réponse :) –

4

Sur la base de la réponse de Madlaina. Je devais assurer que le modèle a été chargé avant

addModelToScene(type) { 

    let scene = document.querySelector('a-scene'); 
    let model = document.createElement('a-entity'); 
    model.setAttribute('io3d-data3d', getModelKey(type))  

    model.addEventListener('model-loaded',() => { 
     // Access the three.js object of the 3d.io 
     let threeElem = model.components['io3d-data3d'].data3dView.threeParent 

     // create the bounding box 
     let bbox = new THREE.Box3().setFromObject(threeElem) 

     // Calculate the center-point offsets from the max and min points 
     const offsetX = (bbox.max.x + bbox.min.x)/2 
     const offsetY = (bbox.max.y + bbox.min.y)/2 
     const offsetZ = (bbox.max.z + bbox.min.z)/2 

     // apply the offset 
     model.setAttribute('position', {x:-offsetX,y:-offsetY, z:-offsetZ}) 
    }); 

    scene.appendChild(model);  

} 

Le résultat: Centered 3D-Model

+0

cool! content que ça marche! et je vais certainement l'utiliser dans mes propres projets –