22

我已经使用以下代码导入了一个 OBJ 模型:

var loader = new THREE.OBJLoader();
loader.addEventListener('load', function (geometry) {
    object = geometry.content;
    scene.add(object);
});
loader.load('ship.obj');

它工作得很好,但是每当我尝试向它添加材质时,它要么没有效果,要么模型消失了。我以为我可以这样做:

var ship = new THREE.Mesh(object, material);

但这不起作用。有谁知道这样做的方法,或者是否有可能?我也尝试过使用 OBJMTLLoader,但它只是增加了复杂性,同时仍然不允许我更改材料。

4

3 回答 3

25

编辑:这个答案现在已经过时了。相反,请参阅@mightypile 的答案。


假设您已正确定义material,请尝试以下操作:

loader.addEventListener( 'load', function ( event ) {

    var object = event.content;

    object.traverse( function ( child ) {

        if ( child instanceof THREE.Mesh ) {

            child.material = material;

        }

    } );

    scene.add( object );

});
于 2013-04-24T19:48:56.763 回答
6

使用@WestLangley 的回答,我不断收到错误消息

loader.addEventListener is not a function

我的页面无法加载。根据 discourse.threejs.org 上的 Atul_Mourya 的说法,加载时在回调中实现函数是一个更好的(或更最新的?)想法。我将他的建议与文档和@WestLangley 的有用功能相结合,回答了同样的问题:

var ship_material = new THREE.MeshBasicMaterial( { color: 0x444444 } );
var loader = new THREE.OBJLoader();
loader.load( 'ship.obj',
    function( obj ){
        obj.traverse( function( child ) {
            if ( child instanceof THREE.Mesh ) {
                child.material = ship_material;
            }
        } );
        scene.add( obj );
    },
    function( xhr ){
        console.log( (xhr.loaded / xhr.total * 100) + "% loaded")
    },
    function( err ){
        console.error( "Error loading 'ship.obj'")
    }
);

这个例子还实现了进度和错误的回调,它对我有用。

于 2019-03-22T21:28:15.577 回答
0

我使用 SketchUp 来制作我的模型。当我从 SketchUp 导出为OBJ文件格式时,生成的 zip 包含一个MTL文件;

此代码将加载MTL文件和OBJ文件;加载成功后scene.add(object),纹理会自动渲染(无需分配给child.material.map

const loader = new OBJLoader(manager);

const materialsLoader = new MTLLoader(manager);

materialsLoader.load('models/obj/sketchup_export/d2e8bc61-6dd1-4554-b874-13b5364d656e.mtl', function (materialsCreator) {

    // https://threejs.org/docs/#examples/en/loaders/OBJLoader.setMaterials
    loader.setMaterials(materialsCreator);


    loader.load('models/obj/sketchup_export/d2e8bc61-6dd1-4554-b874-13b5364d656e.obj', function (obj) {

        object = obj;

    }, onProgress, onError);

}, onProgress, onError);
于 2020-12-06T17:27:50.443 回答