三.js JSONLoader搅拌机模型错误:属性'length'未定义

Posted

技术标签:

【中文标题】三.js JSONLoader搅拌机模型错误:属性\'length\'未定义【英文标题】:Three.js JSONLoader blender model error: property 'length' undefined三.js JSONLoader搅拌机模型错误:属性'length'未定义 【发布时间】:2015-04-02 15:54:02 【问题描述】:

我最近一直在尝试 Three.js,我使用 Blender 的导出器插件来测试在 Blender 中制作模型并导出,以便我可以在 three.js 程序中使用它们。

我将附加组件添加到搅拌机中,并仅使用搅拌机的基本立方体模型,按照出口商的说法将其导出为 .json。然后我将模型作为guide 导入到我的three.js 中 但这给了我一个错误:

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

我已经在网上搜索并尝试了几种不同的方法(例如在加载程序的函数调用中包含材料),但似乎没有任何效果。

我还检查了 *** 的答案,但到目前为止似乎没有任何问题得到解决。如果有人能澄清我做错了什么,我将不胜感激。

我的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);
)();

【问题讨论】:

【参考方案1】:

导出时,将类型从 buffergeometry 更改为 Geometry (Blender 2.76)

【讨论】:

【参考方案2】:

根据我目前在出口商方面的经验,您必须非常小心勾选哪些框!

这个长度错误通常是因为您没有导出顶点,或者导出场景而不是对象。

【讨论】:

【参考方案3】:

我对新的出口商有同样的问题。

如果选择 SCENE,那么我通常会得到“无法读取未定义的属性 'length'”

如果我只选择对象以及材质和顶点。它通常似乎永远卡住了。

更新

查看对此问题的回复!

Threejs blender exporter exports in wrong format

【讨论】:

我有同样的问题,但这是因为我在threejs中使用了错误的加载器。要加载导出的场景,您必须使用 ObjectLoader 而不是 JSONLoader。类似于var loader = new THREE.ObjectLoader(); loader.load('data/yourfile.json', function( obj ) scene.add( obj ); animate(); );。这解决了我的问题。【参考方案4】:

正如前面所说的 roadkill,导出为 Geometry 而不是 BufferedGeometry 是可行的。

另请注意,加载 JSON 模型加载是异步处理的(仅在操作完成时才调用回调,其余代码继续运行)。该模型在第一帧或第二帧中不存在,因此在动画循环中对其进行任何操作之前,请检查您的模型是否存在。

【讨论】:

以上是关于三.js JSONLoader搅拌机模型错误:属性'length'未定义的主要内容,如果未能解决你的问题,请参考以下文章

三.js JSONLoader 回调

使用three.js JSONLoader

为three.js导出json的搅拌机

带有骨骼动画(搅拌机导出)的模型在三个.js 中动画不正确

THREE.JS 从搅拌机中导出 JSON 模型(包括纹理)

如何在使用three.js和jsonLoader时制作加载屏幕?