2015-02-01 4 views
0

У меня, похоже, проблемы с Three.ObjectLoader. Я экспортирую сцену в формате 4.3 JSON. Эта сцена включает в себя геометрию, материалы и освещение. Сцена открывается в редакторе Three.js просто отлично, без ошибок.Ошибка Three.js с THREE.ObjectLoader

Я работаю над firefox с master.js r70. Вот ссылка на созданный JSON: https://gist.github.com/fraguada/d86637f7987096b361ea

В средстве просмотра я пытаюсь написать, я использую следующий код для загрузки:

var manager = new THREE.LoadingManager(); 
manager.onProgress = function (item, loaded, total) { 

    console.log(item, loaded, total); 

}; 

// instantiate a loader 

var loader = new THREE.ObjectLoader(manager); 

loader.load( 
    // resource URL coming from other file 
    Name, 
    // Function when resource is loaded 
    function (result) 
    { scene.add(result.scene); }, 
    // Function called when download progresses 
    function (xhr) 
    { console.log((xhr.loaded/xhr.total * 100) + '% loaded'); }, 
    // Function called when download errors 
    function (xhr) 
    { console.log('An error happened'); } 
); 

В консоли я вижу следующее:

THREE.WebGLRenderer 70 three.min.js (line 513) 
100% loaded content.js (line 117) 
THREE.Object3D.add: undefined is not an instance of THREE.Object3D. three.min.js (line 164) 
js/Test83.js 1 1 content.js (line 86) 

ошибка также появляется в unminified three.js в строке 7674

Эта проблема также возникает, если я создаю геометрию и другие объекты в редакторе Three.js и экспортировать его как сцену.

Проблема, кажется, здесь: scene.add(result.scene); Неправильно, если THREE.ObjectLoader может потреблять JSON из файла? В коде, который я отправляю, если я удалю scene.add(result.scene);, кажется, что файл загружается как минимум (данные загружаются, геометрия не визуализируется), так как ошибок не возникает. Если у меня есть сцены со многими сетками, прогресс будет выводиться на консоль (10% загружен, загружен на 20% и т. Д.).

Любые идеи были бы очень признательны.

+0

p.s. если я допрашиваю объект 'result', прежде чем пытаться выполнить команду' scene.add (result.scene); 'Я вижу все содержимое JSON из файла. Так что, похоже, все нормально. Я увижу, могу ли я отследить любые существенные неопределенные объекты, чтобы увидеть, влияет ли на них беспорядок. –

+0

Таким образом, result.scene является главным виновником, поскольку результат фактически может заменить существующую сцену. Если я сделаю это «scene = result», тогда я получу полный белый мир. Объекты есть, но у них, похоже, нет материалов (хотя материалы действительно появляются как часть их свойств). Если я пройду через детей результата, я смогу добавить сетки на сцену и получить их с плоским материалом по умолчанию. Поэтому я добиваюсь прогресса, просто кажется, что есть лучший способ, который я пропускаю, который принимает результаты и отображает их с помощью загрузчика объектов. –

ответ

0

Я думаю, вы должны просто сделать scene.add(result).

+0

Я думаю, что это сработает, если бы это был просто объект, но если я попытаюсь вставить 'scene.add (result.object)' в код из исходного сообщения выше, я получаю дополнительную ошибку, так как этот файл включает метаданные, и т. д. Я также получил ошибку, отмеченную выше: 'THREE.Object3D.add: undefined не является экземпляром THREE.Object3D. three.min.js (строка 164) ' –

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – DLeh

+0

@DLeh извините, но вы не знаете, о чем говорите. – mrdoob

2

После некоторого дополнительного рытья я понял, что мне нужно использовать THREE.XHRLoader для ввода json, а затем использовать THREE.ObjectLoader для анализа результатов. Нечто подобное должно работать:

var loaderObj = new THREE.ObjectLoader(); 
var loader = new THREE.XHRLoader(); 
      loader.load('js/data.json', function (text) { 
       text = "{ \"scene\" : " + text + " }"; 
       var json = JSON.parse(text); 
       var scene = loaderObj.parse(json.scene); 
      }, 
      // Function called when download progresses 
      function (xhr) 
      { console.log((xhr.loaded/xhr.total * 100) + '% loaded'); }, 
      // Function called when download errors 
      function (xhr) 
      { console.log('An error happened'); } ); 

Этот метод хорошо работает, и узнал от проверки кода, сгенерированного когда публикует сцену через редактор ThreeJS.

Смежные вопросы