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

Den*_*son 5 javascript json blender three.js

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

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

先感谢您!

登革病毒

编辑+++

谢谢您的回答!

因此,如果我在一个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 );       
});
Run Code Online (Sandbox Code Playgroud)

我怎样才能移动第一个立方体?

mesh.getObjectById(0).position.x = 15;
Run Code Online (Sandbox Code Playgroud)

似乎不起作用.

谢谢!

小智 7

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

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

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

**图片**:在搅拌机中(步骤1和2)

  1. 使用此选项,您的json文件现在包含 Blender的Outliner 中的所有网格,因为您可以使用任何文本编辑器进行验证.是否选择了网格并不重要.
  2. 重要的是要知道(或父)对象不再是几何.它现在标有Object类型.要访问子对象(Mesh类型),可以在对象上使用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);
    } );
    
    Run Code Online (Sandbox Code Playgroud)

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

**图片**:Json结构和控制台输出(步骤3和4)


gai*_*tat -1

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

  • @JothiKannan *2年后*一个解决方案是使用 `loader = THREE.ObjectLoader(); loader.load('path/to/objects.json', function (objs) { obj1 = objs.getObjectByName('name_of_obj'); });` 按照 @Jaime 的回答,您可以看到如何命名对象在 Blender 中,然后在 JS 中使用该名称来获取该对象,然后将其添加到场景中,等等 (2认同)