Загрузка нескольких объектов в Three.js из Blender

У меня есть довольно сложная фигура (одетая девушка), которая в Blender разбита на разные объекты и загружена в Three.js с помощью загрузчика JSON (с небольшим хаком, который я сделал, который использует заархивированные файлы вместо просто файлов JSON, так как там много вершин).

Поскольку я хочу динамически изменять стиль платья с веб-страницы, мне было интересно, как я могу показать/скрыть различные части (например, рукава) в сцене.

Я пытался пройти THREE.Mesh, но детей нет.

Когда я экспортирую из Blender с помощью экспортера JSON, я не вижу ничего, относящегося к именам объектов в JSON. Структура потеряна?


person aledalgrande    schedule 29.10.2013    source источник
comment
Я видел этот вопрос и заметил, что у вас есть openctm для работы с Blender. Мне было интересно, не могли бы вы ответить на мой вопрос: stackoverflow.com/questions/23073947/. Мне кажется, что скрипты openctm не работают с Blender 2.7.   -  person acarlon    schedule 15.04.2014
comment
Аналогичная проблема, получил один model.js и не могу разделить сетки после его загрузки... например, у меня есть 5 объектов в одном файле, но я не могу получить к ним доступ по отдельности: myobject.children item1 не может решить это   -  person joshua    schedule 08.08.2014


Ответы (2)


Если вы используете меши, содержащие много вершин, я бы посоветовал вам использовать загрузчик openCTM webGL вместо взлома zip. Вот ссылка на загрузчик: http://threejs.org/examples/webgl_loader_ctm.html
Этот инструмент сжатия сетки использует метод сжатия LZMA и может уменьшить размер ваших файлов на 93%...

Что касается JSONLoader, использование массива может помочь:

var meshes = [];
...
var loader = new THREE.JSONLoader();
var onGeometry = function(geom)
{
    var mesh = new THREE.SceneUtils.createMultiMaterialObject(geom, [material]);
    meshes.push( mesh );
    ...
    scene.add(mesh);
};

loader.load("yourfile.js", onGeometry);

Надеюсь это поможет

person ThisIsSparta    schedule 31.10.2013
comment
Эй, Qt, спасибо, но я пытался понять, как загрузить из одного файла все объекты, как они есть в Blender. Количество объектов, которые мне нужно будет загрузить, 1) создаст беспорядок в моем коде и 2) будет иметь большие накладные расходы при загрузке. - person aledalgrande; 01.11.2013
comment
Да, я сделал это. В конце концов я сделал, как вы предложили, я изменил свой рабочий процесс, чтобы иметь меньше сеток. И с помощью OpenCTM. Спасибо! - person aledalgrande; 01.11.2013
comment
Рад слышать. Удачи вашему проекту. - person ThisIsSparta; 02.11.2013
comment
Я не думаю, что это действительно отвечает на вопрос. Что, если yourfile.js включает в себя несколько мешей? - person kevzettler; 17.01.2015
comment
Что ж, этот массив определенно не работает @r72 при загрузке файла json, в котором экспортирована сцена, содержащая несколько сеток. - person Starwave; 28.04.2016

Можно загрузить целую сцену с несколькими сетками из файла json, экспортированного из Blender, и обрабатывать их по отдельности!

Вы можете проследить весь процесс экспорта всей сцены из Blender и правильный способ обработки экспортированных сеток в моем ответе на этот сообщение.

Таким образом, вы можете получить различные сетки и управлять ими по отдельности, используя метод getObjectByName. Но важно знать, что загруженный объект больше не является геометрией. Сейчас он помечен типом Scene, и с ним нужно обращаться по-другому.

Код загрузки должен выглядеть так:

    loader = new THREE.JSONLoader();
    loader.load( "obj/Books.json", function ( loadedObj ) {
        var surface = loadedObj.getObjectByName("Surface");
        var outline = loadedObj.getObjectByName("Outline");
        var mask = loadedObj.getObjectByName("Mask");
        scene.add(surface);
        scene.add(outline);
        scene.add(mask);
    } );

Кроме того, вы можете обрабатывать несколько материалов одного меша, используя THREE.MeshFaceMaterial, как в следующем коде:

var mat1 = new THREE.MeshLambertMaterial( { map: texture1 } );
var mat2 = new THREE.MeshLambertMaterial( { map: texture2 } );
var materials = [mat1, mat2];
var faceMat = new THREE.MeshFaceMaterial(materials);
mesh = new THREE.Mesh( geometry, faceMat );
scene.add( mesh );

Надеюсь это поможет :)

person Jaime    schedule 09.09.2016