2016-05-13 3 views
0

Je veux charger les fichiers collada d'une exportation. Les fichiers sont exportés de telle sorte que le fichier "base" référence un autre fichier collada avec la géométrie réelle.Comment charger les fichiers COLLADA référencés dans ThreeJs

Le fichier de base ressemble à ce que:

<?xml version="1.0" encoding="utf-8"?> 
<COLLADA version="1.5.0" xmlns="http://www.collada.org/2008/03/COLLADASchema"> 
    <asset> 
    <contributor> 
     <author>ACME</author> 
    </contributor> 
    <created>2016-04-27T14:53:24</created> 
    <modified>2016-04-27T14:53:24</modified> 
    <unit meter="0.001" name="mm" /> 
    <up_axis>Z_UP</up_axis> 
    </asset> 
    <library_visual_scenes id="libvisualscenes"> 
    <visual_scene id="libvisualscenes.scene"> 
     <node id="38760" name="Part1_CATPart"> 
     <matrix>-1.000000 0.000000 0.000000 -399.679153 0.000000 0.000000 -1.000000 671.000000 0.000000 -1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000</matrix> 
     <instance_node url="Part1_CATPart_799.dae#acme_frame_self_origin" /> 
     </node> 
    </visual_scene> 
    </library_visual_scenes> 
    <scene> 
    <instance_visual_scene url="#libvisualscenes.scene" /> 
    </scene> 
</COLLADA> 

Part1_CATPart est référencé dans le Collada ci-dessus. J'ai essayé l'approche naïve et chargé cette collada en utilisant le ColladaLoader2.js, mais cela a conduit à l'erreur ColladaLoader2.js:175 Uncaught TypeError: Cannot read property 'build' of undefined. Chargement Part1_CATPart fonctionne directement. Cependant, cette manière ne prend pas en compte la matrice du fichier de base.

Existe-t-il une méthode pour que trois collsLoader2 récupèrent les fichiers référencés?

Répondre

0

Je crois que l'URL est analysée here on line 2326 dans la méthode d'analyse. Normalement, l'URL pointe intentionnellement vers un autre noeud. Vous pouvez obtenir l'URL dans la clause if comme celui-ci:

if (iNode) 
    this.nodes.push((new Node()).parse(iNode)) ; 
}else{ 
    url = url.split("#")[0] 
    console.log(url); 
} 

Ensuite, vous pouvez utiliser le url pour charger le modèle de l'enfant et de l'ajouter à la scène dans un rappel onload:

var loader = new THREE.ColladaLoader(); 
var result = loader.load(url); 
var scene = result.scene; 

var name, model, children = scene.children; 
var onLoad = function(result){ 
    // process the result of each child model and add to parent scene 
}; 
var onProgress = function(){}; 
loader.load(url, onLoad, onProgress); 

Here is a fiddle with a demo

Le violon ne sort que l'URL. Le charger correctement je laisse à vous.

+0

Le fichier est référencé avec '' et non avec le nom des noeuds. – Akkumulator

+0

@Akkumulator J'ai mis à jour ma réponse – Wilt

+0

Merci, cela m'a fait penser dans la bonne direction. – Akkumulator