Three.js несколько материалов на объекте, загруженном через OBJMTLLoader

У меня есть ".obj" и ".mtl" файлы модели, и я загружаю ее черезOBJMTLLoader, «.mtl» задает текстуру для применения к модели, а three.js загружает модель и прекрасно отображает ее с примененной текстурой.

Но вот в чем дело.

Как только объект загружен, я хотел бы применить к нему другую текстуру. Это потому, что первая текстура представляет материал поверхности объекта. И вторая текстура - это рисунок, который я хотел бы разместить в определенном месте модели.

Мой вопрос:как применить вторую текстуру к уже загруженному (и текстурированному) объекту?

Я вижу, что three.js создает экземплярTHREE.Object3Dи этот экземпляр имеет массив "children" с одним экземпляромTHREE.Mesh.

Когда я пытаюсь применить текстуру к этой сетке (mesh.material.map = texture), Я теряю исходную текстуру.

Я смотрел в этовопрос о применении нескольких текстур и JSONLoader но не нашел ответа.

Я также пытался использоватьnew THREE.MeshFaceMaterial( materials ) (как предложено вэтот ответ) но безуспешно.

ОБНОВИТЬ:

Я попробовал предложение @ WestLangley об использовании многокомпонентного объекта, но все еще не могу отобразить один материал поверх другого.

Я сделал это простое демо, адаптированное из three.js OBJLoader -http://dl.dropboxusercontent.com/u/822184/webgl_multiple_texture/index.html

я используюTHREE.SceneUtils.createMultiMaterialObject как и предполагалось, передавая клонированную геометрию основной сетки, загруженной из .obj. Я также даю ему 2 текстуры - одну для всей поверхности, другую - для лицевой поверхности модели.

Но это не работает. Я добавил 2 флажка, которые переключают «видимое» свойство соответствующих материалов. Вы можете видеть, что материалы присутствуют, но я не могу видеть первый из-под второго.

Суть загрузки / рендеринга заключается в следующем:

var texture = THREE.ImageUtils.loadTexture('fabric.jpg');
var texture2 = THREE.ImageUtils.loadTexture('table.jpg');

texture2.offset.set(-0.65, -2.5);
texture2.repeat.set(4, 4);

var loader = new THREE.OBJLoader();
loader.addEventListener( 'load', function ( event ) {

  var mainMesh = event.content.children[0].children[0];

  multiMaterialObject = THREE.SceneUtils.createMultiMaterialObject( 
    mainMesh.geometry.clone(), [
      new THREE.MeshLambertMaterial({ map: texture2 }),
      new THREE.MeshLambertMaterial({ map: texture })
    ]);

  multiMaterialObject.position.y = -80;
  scene.add(multiMaterialObject);
});

loader.load( 'male02.obj' );

ОБНОВЛЕНИЕ № 2

На данный момент, я думаю, лучше всего использоватьTHREE.ShaderMaterial нанести одну текстуру на другую. Я вижу некоторыепримеры использования одной текстуры но все еще не уверены, как отобразить оба в наложенном состоянии. Я также не уверен, как разместить текстуру в определенном месте на сетке.

Ответы на вопрос(2)

Ваш ответ на вопрос