He estado probando Three.js últimamente y utilicé el complemento exportador para Blender para probar la creación de modelos en Blender y la exportación para poder usarlos en un programa three.js.

Incluí el complemento a Blender, y usando solo el modelo de cubo básico de Blender, lo exporté a .json como dice el exportador. Luego importé el modelo a mi three.js usando esto como una guía pero eso me dio un error:

Uncaught TypeError: Cannot read property 'length' of undefined.

Ya busqué en línea y probé algunos enfoques diferentes (como incluir materiales en la llamada de función del cargador) pero nada parece funcionar.

También verifiqué stackoverflow en busca de respuestas, pero hasta ahora nada parece resuelto. Si alguien me aclarara qué estoy haciendo mal, estaría muy agradecido.

El código de mi programa three.js:

var WIDTH = 1000,
        HEIGHT = 1000;


var VIEW_ANGLE = 45,
        ASPECT = WIDTH / HEIGHT,
        NEAR = 0.1,
        FAR = 10000;


var radius = 50,
        segments = 16,
        rings = 16;

var sphereMaterial =
        new THREE.MeshLambertMaterial(
                {
                    color: 0xCCCCCC
                });


var sphere = new THREE.Mesh(
        new THREE.SphereGeometry(
                radius,
                segments,
                rings),
        sphereMaterial);



var pointLight =
        new THREE.PointLight(0x660000);


var $container = $('#container');


var renderer = new THREE.WebGLRenderer();
var camera =
        new THREE.PerspectiveCamera(
                VIEW_ANGLE,
                ASPECT,
                NEAR,
                FAR);

var scene = new THREE.Scene();

var loader = new THREE.JSONLoader(); // init the loader util


scene.add(camera);


pointLight.position.x = 10;
pointLight.position.y = 50;
pointLight.position.z = 130;


scene.add(pointLight);

camera.position.z = 300;


renderer.setSize(WIDTH, HEIGHT);

$container.append(renderer.domElement);
window.requestAnimFrame = (function () {
    return  window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            function (callback) {
                window.setTimeout(callback, 1000 / 60);
            };
})();


loader.load('test.json', function (geometry, materials) {
    var material = new THREE.MeshFaceMaterial(materials);
    var object = new THREE.Mesh(geometry, material);
    scene.add(object);

});


(function animloop() {
    requestAnimFrame(animloop);

    renderer.render(scene, camera);
})();
8
Rob Ferreira 3 feb. 2015 a las 15:36

4 respuestas

La mejor respuesta

En mi experiencia hasta ahora con el exportador, ¡debes tener mucho cuidado con las casillas que marcas!

Este error de longitud generalmente se debe a que no está exportando los vértices o exportando la escena en lugar del objeto.

3
Greg Findon 2 mar. 2015 a las 11:51

Como se indicó anteriormente en roadkill, la exportación como geometría en lugar de como geometría con búfer funciona.

También tenga en cuenta que la carga del modelo JSON se maneja de forma asíncrona (la devolución de llamada solo se llama cuando se completa la operación, el resto de su código sigue ejecutándose). El modelo no existirá para el primer cuadro o dos, así que verifique que su modelo exista antes de realizar cualquier operación con él dentro del ciclo de animación.

1
mindstorm8191 26 jun. 2018 a las 09:52

Tengo el mismo problema con el nuevo exportador.

Si selecciono SCENE, normalmente obtengo "No se puede leer la propiedad 'longitud' de indefinida"

Si selecciono solo el objeto y los materiales y vértices. Por lo general, parece quedarse atascado para siempre.

Actualizar

¡Consulta esta respuesta a este problema!

Tres exportaciones de JS Blender exportador en formato incorrecto

1
Community 23 may. 2017 a las 11:54

Al exportar, cambie el Tipo de buffergeometry a Geometry (Blender 2.76)

6
roadkiII 28 jul. 2017 a las 14:37