three.js如何在mtl,obj文件上映射纹理

时间:2016-09-16 12:22:43

标签: javascript three.js mapping

我正在尝试在mtl,obj文件

上映射png文件

在映射之前

但是在映射之后,mtl纹理就会消失。

映射后

我该怎么办? 我英语说的不好。如果您无法理解我的问题,请发表评论。

这是我的代码:

           var onProgress = function(xhr) {
           var percentComplete = xhr.loaded / xhr.total * 100;
           console.log(Math.round(percentComplete, 2) + '% downloaded');
        };


        var onError = function(xhr) {};

        THREE.Loader.Handlers.add(/\.dds$/i, new THREE.DDSLoader());

        var loader = new THREE.ImageLoader();
        loader.load("../img/ang.png", function(image) {

           texture.minFilter = THREE.LinearFilter;   
           texture.image = image;
           texture.wrapS = THREE.ClampToEdgeWrapping;
           texture.wrapT = THREE.ClampToEdgeWrapping;
           texture.offset.set(-3, -9.5);
           texture.repeat.set(13, 13);
           texture.needsUpdate = true;

        },onProgress,onError);

        var mtlLoader = new THREE.MTLLoader();
        mtlLoader.setPath('../models/');
        mtlLoader.load('nag-green.mtl', function(materials) {

           materials.preload();

           var objLoader = new THREE.OBJLoader();
           objLoader.setMaterials(materials);
           objLoader.setPath('../models/');
           objLoader.load('nag-green.obj', function(object) {

              object.traverse(function(child) {

                 if (child instanceof THREE.Mesh) {
                    child.material.map = texture;
                 }
              });

              object.name = "object";
              object.position.y = 0;
              scene.add(object);

           }, onProgress, onError);
        });

我想要做的是将'ang.png'文件映射到像这样的T恤上

what i want

谢谢你的回答Radio,我试过这种方式,但这不是我想做的。

give a name to material and map

1 个答案:

答案 0 :(得分:0)

你已经应用了相同的' ang.png'纹理到所有子网格。我认为在遍历函数中需要一个条件才能将纹理仅应用于需要纹理的网格部分。

mtl应该在首次加载时为材质应用名称。例如,在这里我假装材料名称是"躯干"。原始3d编辑器中的导出器会给它一些其他名称。在任何情况下,您都应该能够在条件中查询名称:

          object.traverse(function(child) {
             if (child instanceof THREE.Mesh) {         
                 if(child.material != undefined){
                    if(child.material.name=="torso"){
                      child.material.map = texture;
                    }
                 }
             }
          });