4

我有一个非常复杂的形状(穿着打扮的女孩),它在 Blender 中被分解成不同的对象,并使用 JSON 加载器加载到 Three.js 中(我做了一个小技巧,它使用压缩文件而不是 JSON 文件,因为那里是很多顶点)。

由于我想从网页动态更改连衣裙的样式,我想知道如何在场景中显示/隐藏不同的部分(例如袖子)。

我尝试遍历THREE.Mesh,但没有孩子。

当我使用 JSON 导出器从 Blender 导出时,我看不到任何涉及 JSON 中对象名称的内容。结构丢失了吗?

4

2 回答 2

2

如果您使用包含大量顶点的网格,我建议您使用 openCTM webGL 加载程序而不是 zip hacking。这是加载器的链接:http: //threejs.org/examples/webgl_loader_ctm.html
这个网格压缩工具使用 LZMA 压缩方法,可以将文件大小减少 93%...

关于 JSONLoader,使用数组可能会有所帮助:

var meshes = [];
...
var loader = new THREE.JSONLoader();
var onGeometry = function(geom)
{
    var mesh = new THREE.SceneUtils.createMultiMaterialObject(geom, [material]);
    meshes.push( mesh );
    ...
    scene.add(mesh);
};

loader.load("yourfile.js", onGeometry);

希望这可以帮助

于 2013-10-31T12:48:08.293 回答
1

可以从 Blender 导出的 json 文件中加载具有多个网格的整个场景并分别处理它们!

您可以按照我对这篇文章的回答遵循从 Blender 导出整个场景的完整过程以及处理导出网格的正确方法。

因此,您可以使用该方法获取不同的网格并分别操作它们getObjectByName。但重要的是要知道加载的对象不再是几何图形。它现在被标记为场景类型,并且必须以不同的方式处理。

加载代码必须如下所示:

    loader = new THREE.JSONLoader();
    loader.load( "obj/Books.json", function ( loadedObj ) {
        var surface = loadedObj.getObjectByName("Surface");
        var outline = loadedObj.getObjectByName("Outline");
        var mask = loadedObj.getObjectByName("Mask");
        scene.add(surface);
        scene.add(outline);
        scene.add(mask);
    } );

此外,您可以使用以下代码处理单个网格的多种材质:THREE.MeshFaceMaterial

var mat1 = new THREE.MeshLambertMaterial( { map: texture1 } );
var mat2 = new THREE.MeshLambertMaterial( { map: texture2 } );
var materials = [mat1, mat2];
var faceMat = new THREE.MeshFaceMaterial(materials);
mesh = new THREE.Mesh( geometry, faceMat );
scene.add( mesh );

希望这可以帮助 :)

于 2016-09-09T16:31:12.117 回答