首页 > 解决方案 > Threejs:如何使用 Draco 压缩器导出导入的 obj

问题描述

我只有有限的javascript技能,我可以在threejs中获得基本的东西。现在我正在与 draco 出口商斗争。

@Threejs.org 有一个Draco 导出器的例子

此示例使用生成的网格并且运行良好:

// export mesh

            var geometry = new THREE.TorusKnotBufferGeometry( 50, 15, 200, 30 );
            var material = new THREE.MeshPhongMaterial( { color: 0x00ff00 } );
            mesh = new THREE.Mesh( geometry, material );
            mesh.castShadow = true;
            mesh.position.y = 25;
            scene.add( mesh );

我可以导入 .obj 这也可以正常工作

new OBJLoader()
.setPath( '../models/mymodel/' )
.load( 'mymodel.obj', function ( mesh ) {

    mesh.traverse( function ( child ) {

        if(child.name=='mymodel_part1'){                        
                    child.material = Material1;
        }
        if(child.name=='mymodel_part2'){                        
                    child.material = Material2;
        }
        if(child.name=='mymodel_part3'){                        
                    child.material = Material3;
        }

    } );

    scene.add( mesh );

} );

现在我想导出网格,但这不起作用,我得到一个“TypeError:mesh is undefined”。

所以类型不正确,但它应该是什么,我该如何改变它?

标签: javascriptthree.js

解决方案


问题是它OBJLoader.load()不会产生一个组,而是一个THREE.Group. 因此,您必须首先确定组后代中的正确网格。然而,这取决于资产,因为OBJ文件可以包含多个网格定义。我准备了一个演示此工作流程的实时示例。重要的代码部分是:

var loader = new OBJLoader();
loader.load( 'https://threejs.org/examples/models/obj/tree.obj', function ( obj ) {

    scene.add( obj );
    mesh = obj.children[ 0 ];

} );

https://jsfiddle.net/bquxjf28/2/


推荐阅读