三种js-JSON loader在示例中可用,但在我的代码中不可用?

时间:2019-09-17 21:55:26

标签: javascript html three.js

我只是试图用从Blender到三个js的动画加载模型。因此,我试图复制http://stemkoski.github.io/Three.js/Model-Animation.html

我下载了他的代码,他使用了:

var jsonLoader = new THREE.JSONLoader();
        jsonLoader.load( "models/android-animations.js", addModelToScene );
        // addModelToScene function is called back after model has loaded

        var ambientLight = new THREE.AmbientLight(0x111111);
        scene.add(ambientLight);

    }

    function addModelToScene( geometry, materials ) 
    {
        // for preparing animation
        for (var i = 0; i < materials.length; i++)
            materials[i].morphTargets = true;

        var material = new THREE.MeshFaceMaterial( materials );
        android = new THREE.Mesh( geometry, material );
        android.scale.set(10,10,10);
        scene.add( android );
    }

已授予Im在节点JS中工作的权限,但执行此操作时出现错误JSONLoader has been removed

var jsonLoader = new THREE.JSONLoader();
jsonLoader.load( "./src/scripts/elements/android-animations.js", this.addModelJson);

我已经尝试过FBXLoader,ObjectLoader,以及所有其他工具。我可以加载模型,但不能加载带有动画的模型。这是唯一的解决方案吗?

如果JSONLoader不再存在,如何使用来自Blender的动画加载模型?

更新:

当我像这样使用LegacyJSONLoader时,

this是未定义的:

var jsonLoader = new THREE.LegacyJSONLoader();
jsonLoader.load( "./src/scripts/elements/android-animations.js", this.addModelJson);

addModelJson( geometry, materials, scene )
  {
    // for preparing animation
    for (var i = 0; i < materials.length; i++)
        materials[i].morphTargets = true;

    var material = new THREE.MeshFaceMaterial( materials );
    var android = new THREE.Mesh( geometry, material );
    android.scale.set(10,10,10);

    this.scene.add( android );
  }

2 个答案:

答案 0 :(得分:0)

此装载程序仍以LegacyJSONLoader的形式提供。如果在项目中包含该文件,则应该能够创建LegacyJSONLoader的实例并像以前一样加载JSON模型。
这是Link

答案 1 :(得分:0)

对于第二个未定义this的问题。

this可能不是您要查找的对象。 this可能有许多不同的含义,具体取决于您的使用方式和使用位置。

但是,好像scene传递给了函数,因此您应该可以这样做:

var jsonLoader = new THREE.LegacyJSONLoader();
jsonLoader.load( "./src/scripts/elements/android-animations.js", this.addModelJson);

addModelJson( geometry, materials, scene ) // <-- scene is passed in
  {
    // for preparing animation
    for (var i = 0; i < materials.length; i++)
        materials[i].morphTargets = true;

    var material = new THREE.MeshFaceMaterial( materials );
    var android = new THREE.Mesh( geometry, material );
    android.scale.set(10,10,10);

    // this.scene.add( android ); `this` isn't what you are thinking it is
    scene.add(android); // <-- use the passed in `scene` object instead
  }