2013-07-06 4 views
1

У меня есть объект Three.Geometry, состоящий из множества вершин и граней (сетка). Я хочу динамически изменять цвет или материал выбранного лица.Изменить материал или цвет в поверхности сетки

geometry.colorsNeedUpdate = true; 
geometry.faces[1].color.setHex(0xcccccc); //this doesn't work 

Выше кода делает новую непрозрачность цвета странной. Он ведет себя так, как будто он не заменяет цвет, но смешивает новый цвет со старым. Поэтому переписывание более темного цвета с лигером невозможно. Как это исправить? Мои материалы не применяются:

mat = new THREE.MeshBasicMaterial({color:"white",shading: THREE.FlatShading,side: THREE.DoubleSide,vertexColors: THREE.FaceColors, needsUpdate : true});

Другой подход я хотел сделать, это также с изменением ссылки на другой материал:

geometry.faces[0].materialIndex = 1; // works only when disabled OpenGL in browser 

Уже set material.needsUpdate flag to true и проверил https://github.com/mrdoob/three.js/wiki/Updates

до сих пор без изменений ,

+0

Можете ли вы предоставить (простой) живой пример, чтобы продемонстрировать необычный эффект, который вы видите? – WestLangley

+0

OFC. Вот код JsFiddle - http://jsfiddle.net/VsWb9/1163/ – user2550696

+0

И вот версия zip. Это лучший код, чем JsFiddle. Мне пришлось переписать некоторые вещи, чтобы заставить его работать на скрипке JS. http://www.sendspace.com/file/ap1l4n – user2550696

ответ

1

Вы смешиваете яблоки и апельсины. Не используйте оба цвета лица и MeshFaceMaterial одновременно.

Прежде всего, в WebGLRenderer вы не можете изменить лицо materialIndex после того, как сетка была сделана один раз. Однако вы можете изменить один из материалов в массиве материалов.

Для вашего сетчатого материала необходимо использовать MeshBasicMaterial и указать vertexColors: THREE.FaceColors. Таким образом, вы можете контролировать каждый цвет лица. Обязательно начинайте каждый цвет лица, чтобы получить шаблон шахматной доски. Также установите цвет материала на 0xffffff, иначе вы увидите мультипликативный эффект, который вы пытаетесь избежать.

three.js r.58

+0

Я исправил его. Благодарю. Удивительно, что это не работает так, как я думал. Мне нужно некоторое объяснение того, как работают несколько материалов. Такая тривиальная проблема заняла у меня 2 дня:] lol – user2550696