Three.js在导入obj模型时自动赋予名字

本文介绍如何在使用Three.js时,通过解析OBJLoader加载过程中的XML文件获取模型URL,从而提取文件名作为模型名称。由于加载过程异步,此方法解决了为导入模型赋予名字的难题,但需注意不同浏览器XML格式的差异,代码适用于Firefox和Chrome。

在Three.js实现的Web项目中自动导入模型时需要根据文件名给导入的模型赋予名字,但由于THREE.OBJLoader().load()和你写的读入模型的for循环是异步进行的,因此难以实现,这里使用了一个讨巧的方式实现了这个需求。

笔者使用的方法是从OBJLoader读取过程中的xml文件里找到文件导入的url,然后从url中分离出文件的名字,xml文件的具体内容可以打印xhr查看。这里需要注意的是不同浏览器的xml格式可能不太相同,需要做一定的修改,下面的代码里只考虑了火狐和谷歌的浏览器。

function objLoading() {
    //加载OBJ格式的模型
    objs_list = one_model_objs["all_objs"];
    for(var obj_id in objs_list) {
        material_choosed[objs_list[obj_id]] = "None";
        obj_path = model_path + "/textured_objs/" + objs_list[obj_id] + ".obj";
        var cur_obj;
        var objLoader = new THREE.OBJLoader();
        // objLoader.load() 与 for 循环是异步进行,因此需要从url中获取当前加载对象的名称并赋值给object.name.
        objLoader.load(obj_path, function (object) {
            object.name = cur_obj;
            object.material = defautMaterial;
            object.children.forEach(function (child) {
                child.material = defautMaterial;
            });
            scene.add(object);
        },
        // 模型加载中获取obj名字
        function ( xhr ) {
            var cur_url;
            // Firefox
            if (isFF) {
                cur_url = xhr.explicitOriginalTarget.responseURL;
            }
            // Google Chrome
            else if (isChrome) {
                cur_url = xhr.currentTarget.responseURL;
            }
            cur_obj = cur_url.split("/");
            cur_obj = cur_obj[cur_obj.length - 1].split(".")[0];
        }
        );
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值