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
нанести одну текстуру на другую. Я вижу некоторыепримеры использования одной текстуры но все еще не уверены, как отобразить оба в наложенном состоянии. Я также не уверен, как разместить текстуру в определенном месте на сетке.