2012-09-18 5 views
7

C'è un modo per cambiare il materialIndex su una faccia di una mesh esistente? Questo non è discusso nella documentazione How to Update Things, quindi non sono sicuro che sia possibile. Sto usando un contesto WebGLRenderer per questo.three.js aggiornamento geometria faccia materialindex

Questo è fondamentalmente quello che sto cercando di fare:

// Make a mesh with two materials 
var texture = THREE.ImageUtils.loadTexture(IMAGE_URL); 
var geometry = new THREE.Geometry(); 
geometry.materials.push(new THREE.MeshBasicMaterial({ wireframe: true, vertexColors: THREE.FaceColors})); 
geometry.materials.push(new THREE.MeshBasicMaterial({ map: texture, overdraw: true})); 

whatever.forEach(function(w, i) { 
    geometry.vertices.push(makeVerts(w)); 

    var materialIndex = 0; 
    var color = new THREE.Color(i); 
    geometry.faces.push(new THREE.Face4(i*4+0, i*4+1, i*4+2, i*4+3, 
        null, color, materialIndex)); 
}); 

var mesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial()); 
scene.add(mesh) 


// Later on, change some faces to a different material 

geometry.faces.filter(someFilter).forEach(function(face) { 
    face.color = someOtherColor; 
    face.materialIndex = 1; 
} 

geometry.colorsNeedUpdate = true; // This is how to update the color, and it works. 
//geometry.materialsNeedUpdate = true; // This isn't a thing, is it? 

risposta

13

Questo comportamento è cambiato.

Se si utilizza THREE.Geometry, è possibile utilizzare il seguente schema per modificare un indice di materiale volto:

mesh.geometry.faces[ 0 ].materialIndex = 1; 

Se la geometria è stata precedentemente resa, è inoltre necessario impostare

mesh.geometry.groupsNeedUpdate = true; 

three.js r.88

+0

Ah, questo ha senso. Grazie per aver spiegato la ragione del comportamento. – JDS