2012-09-18 2 views
7

Есть ли способ изменить materialIndex на лице существующей сетки? Это не обсуждается в документации How to Update Things, поэтому я не уверен, что это возможно. Для этого я использую контекст WebGLRenderer.three.js обновление геометрии лицо materialindex

Это в основном то, что я пытаюсь сделать:

// 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? 

ответ

13

Такое поведение изменилось.

При использовании THREE.Geometry, вы можете использовать следующий шаблон, чтобы изменить индекс лицо материал:

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

Если геометрия была ранее оказана, необходимо также установить

mesh.geometry.groupsNeedUpdate = true; 

three.js r.88

+0

А, это имеет смысл. Спасибо, что объяснили причину поведения. – JDS

Смежные вопросы