Я уже добавил сетку в сцену. Я пытаюсь изменить цвет материала. Изменение цвета происходит через цветовую палитру из меню. Используя этот плагин jQuery: http://colpick.com/plugin
Я знаю, что эта цветовая палитра может отправлять мне значения HSB, но я использую следующую функцию из этого плагина:
$.colpick.hsbToHex(hsb)
Он возвращает строку, а не значение int:
$.colpick.hsbToHex(hsb) Получает объект вида {h:0, s:100, b:100} и возвращает соответствующую HEX-строку (без #).
Здесь я вызываю функцию для изменения цвета сетки:
var buttonColorPicker = document.getElementById( 'color-palette-button' );
buttonColorPicker.onclick = function( sender ) {
this.changeColorForActiveMesh( this.temporary.colorPicker )
}.bind( this );
Вот функция изменения материала:
// Note: colorHex isn't an Int, it's a string in this case
// that's why I'm converting a string to the RGB object
// with the following bit shifting to get an actual Int representation
GC3D.Utils.prototype.changeColorForActiveMesh = function( colorHex ) {
this.scene.children.forEach(function( item ) {
if ( item instanceof THREE.Mesh ) {
var rgbObject = this.convertHexToRgb( colorHex );
var rgbInt = ( ( rgbObject.red & 0x0ff ) << 16 )
| ( ( rgbObject.green & 0x0ff ) << 8 )
| ( rgbObject.blue & 0x0ff );
item.material.color.setHex( rgbInt );
}
}.bind( this ));
};
Здесь я подготовил функцию для преобразования из шестнадцатеричного в объект RGB:
GC3D.Utils.prototype.convertHexToRgb = function( hex ) {
var rgbObject = /^0x?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return rgbObject ? {
red: parseInt( rgbObject[1], 16 ),
green: parseInt( rgbObject[2], 16 ),
blue: parseInt( rgbObject[3], 16 )
} : undefined;
};
В регулярном выражении есть часть /^0x?, потому что я сохраняю преобразованное шестнадцатеричное значение из плагина jQuery в некоторые временные значения.
Доказательство:

Я также пытался провести тест здесь: http://www.shodor.org/stella2java/rgbint.html Проверить, насколько корректно считает конечный Int моя функция, но, вроде бы, все нормально. Так что же неправильно? Может есть другой способ изменить цвет в THREE.JS?
ОБНОВЛЕНИЕ №1:
Я изменил тип материала с MeshLambert на MeshBasic, и теперь палитра правильно меняет цвет! Но это не решение этой проблемы, мне все еще интересно, почему MeshLambert плохо работает в моем коде... Я пытался установить разные значения окружения/цвета, но это работает очень странно...
Например:
new THREE.MeshLambertMaterial({
color: 0xff00ff,
ambient: 0x167aff,
wireframe: false
});
Он отображается как красный:

Но 0xff00ff это:
А 0x167aff это: 
Как это могло быть красным?