Как загрузить ссылочные файлы COLLADA в ThreeJs

Я хочу загрузить файлы collada из экспорта. Файлы экспортируются таким образом, что "базовый" файл ссылается на другой файл collada с фактической геометрией.

Базовый файл выглядит так:

<?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 указан в колладе выше. Я попробовал наивный подход и загрузил эту колладу, используя ColladaLoader2.js, но это привело к ошибке ColladaLoader2.js:175 Uncaught TypeError: Cannot read property 'build' of undefined, Загрузка Part1_CATPart напрямую работает. Однако этот способ не учитывает матрицу базового файла.

Есть ли способ заставить trijs` colladaLoader2 извлекать указанные файлы?

1 ответ

Я полагаю, что URL анализируется здесь в строке 2326 в методе разбора. Обычно URL-адрес указывает на другой узел намеренно. Вы можете получить URL в предложении if следующим образом:

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

Тогда вы могли бы использовать url загрузить дочернюю модель и добавить ее на сцену в 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 );

Вот скрипка с демо

Скрипка выводит только URL. Загружая его правильно, я оставляю до вас.

Другие вопросы по тегам