Three.js - экспорт сцены с TextGeometry в OBJ / GLTF с последующей загрузкой загрузчиком OBJ / GLTF - PullRequest
0 голосов
/ 19 апреля 2019

У меня проблема с импортом / экспортом сцен в Three.js. У меня мало объектов (модели загружаются с OBJLoader, текст генерируется с помощью TextGeometry).Я могу экспортировать его в определение строки, используя OBjExporter / GLTFExporter, но когда я пытаюсь загрузить его снова, он загружает текст в BufferGeometry, а не TextGeometry.Можно ли загрузить все сетки сцен с правильной геометрией?Или, возможно, можно разобрать геометрию?Я знаю, что могу сохранить сцену без текста (сохранить параметры текста в другом определении, а затем сгенерировать его снова), но я бы хотел этого избежать.Я с нетерпением жду вашей помощи.Спасибо.

Примеры кода:1. Функция для экспорта сцены в OBJ

function CanvasToOBJ(callback) {

var exporter = new THREE.OBJExporter();

var options = {
    trs: false,
    onlyVisible: true,
    truncateDrawRange: true,
    binary: false,
    forceIndices: false,
    forcePowerOfTwoTextures: false,
    embedImages: true
};

var result = exporter.parse(scene);
callback(result);
exporter.parse(scene, function (result) {
    if (result instanceof ArrayBuffer) {
        callback(null);
    } else {
        var output = JSON.stringify(result, null, 2);
        callback(output);
    }
}, options);
}
Функция для импорта из строки OBJ
function LoadOBJ() {
    var elem = document.getElementById("modelEditor");
    if (elem != null && elem !== "undefined" && elem.value !== "undefined" && elem.value != null && elem.value != "") {
        var gltfString = elem.value;
        var loader = new THREE.OBJLoader();
        loader.load = function load(url, localtext, onLoad, onProgress, onError) {
            var scope = this;
            var loader = new THREE.XHRLoader(scope.manager);
            loader.setPath(this.path);
            loader.load(url, function (text) {
                if (url == "") {
                    text = localtext;
                }
                onLoad(scope.parse(text));
            }, onProgress, onError);
        },

            loader.load('', gltfString, function (gltf) {

                scene = new THREE.Scene();
                scene.background = new THREE.Color(0xf0f0f0);

                scene.add(new THREE.AmbientLight(0x505050));

                var light = new THREE.SpotLight(0xffffff, 1.5);
                light.position.set(0, 500, 2000);
                light.angle = Math.PI / 9;

                light.castShadow = true;
                light.shadow.camera.near = 1000;
                light.shadow.camera.far = 4000;
                light.shadow.mapSize.width = 1024;
                light.shadow.mapSize.height = 1024;

                scene.add(light);

                var elem = gltf.children[0];
                scene.add(elem);
                objects.push(elem);
                renderer.setSize(renderer.domElement.width, renderer.domElement.height, false);
            })
    }
}

1 Ответ

0 голосов
/ 22 апреля 2019

Ответ: НЕТ.Ни .obj, ни .gltf не поддерживают ничего, кроме простой буферной геометрии.

Если вы хотите сохранить все в своем первоначальном формате, например, для сферы, определяемой радиусом и числом подразделений, а не просто для набора треугольников, вам необходимо использовать собственный формат three.js.Формат json, используемый редактором three.js , который AFAICT не имеет документов.

К сожалению, даже он не поддерживает форматы Geometry, только форматы BufferGeometry, такие как SphereBufferGeometry, но в настоящее время он также не поддерживает TextBufferGeometry, хотя вы можете попытаться добавить поддержку.

https://github.com/mrdoob/three.js/blob/513eceb0fedfd05089168bde81c5bb85ba0e6ec1/src/loaders/ObjectLoader.js#L200

Одна проблема, с которой вам нужно разобраться, это загрузка и сохранение ссылок на шрифты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...