如何在三个.js中动态地将Object3D中的网格添加到新的Object中

时间:2013-03-10 08:36:50

标签: three.js

我是3D编程的完全新手,现在只用了一周就使用了three.js。我已经设法加载了多个collada和obj文件,并设法获得透视图,轨迹球,一切从示例中工作。但是,现在我被困住了,需要一些帮助。作为参考,您可以在以下网址上看到我发布的文件:

http://shaman-labz.appspot.com/webgl_loader_obj_mtl.html

这个页面基本上是直接来自示例,除了我正在加载一个obj文件,它将所有这些对象都作为网格物体。我现在正在处理的是在加载obj之后,我将遍历对象中的所有几何体并提取它们,以便我可以在场景中将它们一次丢弃,或者让它们像我一样漂浮在周围气泡之类的东西。我想也许会尝试使用菲涅耳的例子,但这就是我要理解我的理解界限的地方,而且有些术语让我感到厌烦。

我的问题是,当它运行时,返回并在加载后添加到场景中的对象将所有这些宝石放在一起。

所以不是以下几行:

var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
    var object = event.content;
    object.position.y = - 100;
    scene.add( object );
});
loader.load( 'obj/gems/24.obj', 'obj/gems/24.mtl' );  

所以我正在做的是当对象返回时,我在调试/中断模式下查看内部,我看到它是一个object3D和object.children是一个包含25个网格的数组...以及每个网格网格将是我想要单独使用的“宝石”之一。

所以这就是我迷失的地方......当我抓住'网格'时,我是否需要剥离底层几何体并创建一个新网格?

在这个页面上,您可以看到我想要完成的任务:

http://shaman-labz.appspot.com/webgl_loader_obj_mtl2.html

唯一的主要区别在于此部分代码:

var loader = new THREE.OBJMTLLoader();
loader.addEventListener( 'load', function ( event ) {
        var object = event.content;
        var pos=0;
        for(var i=0; i< object.children.length; i++){
            var m = object.children[i];
            var gem = new THREE.Object3D();
            gem.name=m.name;
            gem.add(m);                     
            gem.position.x = -10;
            gem.position.y = -10;
            gem.position.z = pos;
            scene.add( gem );
            pos = pos - 10;
    }
});
loader.load( 'obj/gems/24.obj', 'obj/gems/24.mtl' );

请注意,25个宝石中只有13个出现在集合中,并且还注意到它们是如何分散的,表明它们仍然以某种方式仍然与某些高阶关系相关联,而我无法正确设置位置(就像它每个网格在某种程度上相对于它在原始对象中的原始位置偏移...认为这与世界矩阵有关吗?

0 个答案:

没有答案