1

我是 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 颗出现在集合中,并注意它们是如何分散的,这表明它们仍以某种方式与一些我无法正确设置位置的高阶关系相关联(就像每个网格都是以某种方式相对于它在加载的原始对象中的原始位置偏移......认为这与世界矩阵有关?

4

0 回答 0