Three.js加载多个分离的对象/ JSONLoader

时间:2013-05-03 11:00:48

标签: javascript json three.js blender

是否可以将从blender导出的场景(例如两个不同的立方体)加载到json并识别它们?

我需要区分它们,例如使一个旋转,另一个旋转。

提前谢谢!

DENV

编辑+++

感谢您的回答!

因此,如果我在一个JSON文件中加载两个多维数据集:

loader.load("untitled1.js", function(geometry, materials) {  
        mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial(materials));
        mesh.scale.set( 10, 10, 10 );
        mesh.position.y = 0;
        mesh.position.x = 0;
        scene.add( mesh );       
});

如何移动第一个立方体?

mesh.getObjectById(0).position.x = 15;

似乎不起作用。

谢谢!

2 个答案:

答案 0 :(得分:7)

是的,可以从Blender导出的json文件中加载整个场景!

我通过以下过程实现了这一目标:(使用three.js r80)

  1. 首先,您必须在Blender中命名不同的对象,如下图“大纲视图”中所示。
  2. 然后你可以使用Three.js json exporter add-on为Blender导出文件,但是要注意标记 Scene 复选框,如下所示:
  3. **Image**: In Blender (Steps 1 and 2)

    1. 使用此选项,您的json文件现在包含Blender的Outliner中的所有网格,因为您可以使用任何文本编辑器进行验证。是否选择了网格并不重要。
    2. 重要的是要知道 root (或父)对象不再是 Geometry 。它现在标有 对象 类型。要访问子对象( Mesh 类型),您可以在 root 对象上使用 getObjectByName 方法,如下面的代码所示:

      jsonloader.load( "obj/Books.json", function ( loadedObj ) {
          var surface = loadedObj.getObjectByName("Surface");
          var outline = loadedObj.getObjectByName("Outline");
          var mask = loadedObj.getObjectByName("Mask");
          // Watch the objects properties on console:
          console.log(loadedObj);
          console.log(surface);
          console.log(outline);
          console.log(mask);
      } );
      

      如果我们检查浏览器的控制台,我们可以看到分配的正确对象。从现在开始,您可以独立操作子对象(移动,旋转,更改材料等)。

    3. **Image**: Json Structure and Console Output (Steps 3 and 4)

答案 1 :(得分:-1)

每个加载的对象都有一个关联的.id。因此,您可以使用Object3D.getObjectById()来查找它并对其应用变换。