2015-05-27 2 views
0

Я загружаю obj & файл mtl с помощью OBJMTLLoader. В объекте есть несколько материалов. Я хочу применить текстуру к определенному материалу внутри объекта.Три js, загрузка текстуры только для определенного mtl

Например. У меня есть объект Bag, и у него есть Handle, Brand name, Wheels как другой материал. Я хочу добавить разные текстуры каждому из них. Текстуры не будут присутствовать в материальном файле. Я хочу добавить его только с помощью кода.

<pre> 
    var loader = new THREE.OBJMTLLoader(); 
    loader.load('obj/Test.obj', 'obj/Test.mtl', function (object) { 

    var tex = new THREE.MeshLambertMaterial({map:THREE.ImageUtils.loadTexture( 'obj/texture.png')}); 

    object.traverse(function(child) { 
    if (child instanceof THREE.Mesh) { 
    // apply custom material 
    child.material = tex; 

    // enable casting shadows 
    child.castShadow = true; 
    child.receiveShadow = true; 
    } 
    }); 
</pre> 
+0

Чтобы сделать это, я бы сначала загрузить текстуру, а затем модель (т.е. поставить функцию loader.load в обратный вызов loadTexture). Также вам нужен тест (ваш код будет применяться ко всем сеткам). Но для уникального файла я бы просто добавил текстуру в .MTL (просто добавьте «map_Ka path/textureimage.jpg» в определение материала), по крайней мере, если мне не нужно управлять параметрами wrap ... – jeum

ответ

0

Вы можете сделать это, проверив имя материала, который вы написали в вашем файле mtl, а затем присвоите текстуру.

Ваш .mtl файл выглядит следующим образом:

newmtl wheels 
Ka 1.0 1.0 1.0 
Kd 1.0 1.0 1.0 
d 1.0 
# ... 

и в коде:

var wheelsTexture = THREE.ImageUtils.loadTexture('obj/wheelTexture.png'); 

object.traverse(function(child) { 
    if (child instanceof THREE.Mesh) { 
     if (child.material.name === "wheels") { 

      child.material.map = wheelsTexture; 

     } else if (child.material.name === "handle") { 
      // ... 
     } 
    } 
}); 
Смежные вопросы