Невозможно изменить цвет материала THREE.Mesh, существующего в сцене во время выполнения.

Я уже добавил сетку в сцену. Я пытаюсь изменить цвет материала. Изменение цвета происходит через цветовую палитру из меню. Используя этот плагин 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 это: введите здесь описание изображения

Как это могло быть красным?


person Community    schedule 04.03.2014    source источник


Ответы (1)


Судя по снимку экрана, вы правильно получаете шестнадцатеричное значение.

Вы можете просто установить цвет материала, используя функцию setHex напрямую.

поэтому код внутри условия if (тот, что в строке 741) будет примерно таким

if ( item instanceof THREE.Mesh ) {
        item.material.ambient.setHex(colorHex);// sets the ambient color

        item.material.color.setHex(colorHex);// sets the diffused color

   }
person Shiva    schedule 04.03.2014
comment
Где именно неправильно? Палитра показывает шестнадцатеричное значение, как в аргументе функции colorHex, вы можете посетить сайт: shodor .org/stella2java/rgbint.html, когда я попробовал цвет, который находится в палитре (поскольку цвет, который вы видите на экране, и его код такой же, как на этом веб-сайте, пожалуйста, посмотрите на другом экране: s28.postimg.org/6phagclkd/image.png), а также Самое смешное, что я пробовал статически установить собственный цвет для теста: item.material.color.setHex( 0x0044FF ); она такая синяя, она не становится синей, она становится зеленой?! - person ; 04.03.2014
comment
@GeloVolro: что мне кажется неправильным, так это молния в твоей голове. т.е. если у вас есть желтый цвет в сцене, синий материал будет казаться зеленым, и это похоже на то, что вы упомянули в своем обновленном вопросе. так что просто добавьте окружающий белый свет в сцену и удалите все остальные источники света, и проверьте - person Shiva; 05.03.2014
comment
также, если вы можете предоставить jsfiddle или подобное, это было бы полезно. - person Shiva; 05.03.2014