В цветовой модели RGB любой цвет представляется как комбинация из трех базовых цветов: R – красного, B – синего, и G – зеленого. Базовые цвета задаются числом в диапазоне от 0 до 255. Следовательно, любой цвет в этой модели будет представлен комбинацией из трех таких чисел. Например, светло-оранжевый цвет будет представлен набором чисел (255, 153, 51). Модель RGB можно визуализировать, представив ее в виде куба со стороной равной 255, все внутренние точки которого являются векторами, положение которых определяется тройкой чисел, которая определяет сам цвет.
Такой куб не сложно построить в Blender при помощи Python API.
Мы можем в цикле по каждой координате проходить все значения от 0 до 255 и в каждую полученную точку сцены помещать любой объект, например, сферу.
|
1 2 3 4 5 6 7 |
for x in range(0, 255): for y in range(0, 255): for z in range(0, 255): bpy.ops.mesh.primitive_ico_sphere_add( radius=0.001, location=(x, y, z) ) |
Однако давайте немного упростим пример, и будем создавать сферу в сцене не для каждой возможной точки, а возьмем только 6 точек на сторону куба. И сам цветовой куб уменьшим в 255 раз, чтобы в координатах сцены он занимал пространство в диапазоне от 0 до 1.
Для получения 6 точек из диапазона 0-255 нам нужно на каждой итерации цикла увеличивать координату на 51. А чтобы получить все 6 точек, воспользуемся лист-компрехенсив, в дополнение к оператору range().
Цикл по трем координатам будет иметь следующий вид:
|
1 2 3 4 5 6 7 |
for x in [int(_c * (255/5)) for _c in range(0, 6)]: for y in [int(_c * (255/5)) for _c in range(0, 6)]: for z in [int(_c * (255/5)) for _c in range(0, 6)]: bpy.ops.mesh.primitive_ico_sphere_add( radius=0.1, location=(x/255, y/255, z/255) ) |
Выполнив этот код, мы получим куб, заполненный сферами. Однако мы не видим в нем никакой информации о цвете.
Назначим каждой сфере цвет вьюпорта, такой, который соответствует координатам ее центра. Дополнительно, имя каждой сферы оформим так же в виде цифрового значения того цвета, которому она соответствует.
Теперь наш код будет выглядеть так:
|
1 2 3 4 5 6 7 8 9 10 |
for x in [int(_c * (255/5)) for _c in range(0, 6)]: for y in [int(_c * (255/5)) for _c in range(0, 6)]: for z in [int(_c * (255/5)) for _c in range(0, 6)]: bpy.ops.mesh.primitive_ico_sphere_add( radius=0.1, location=(x/255, y/255, z/255) ) active_object = bpy.context.object active_object.color = (x/255, y/255, z/255, 1) active_object.name = '(' + str(x) + ', ' + str(y) + ', ' + str(z) + ')' |
Выполним его, а для того, чтобы цвета были видны сразу в окне 3D вьюпорта, в его свойствах переключим параметр Lighting в значение Flat, Object Color – в значение Object. По желанию, можно установить галочки Shadow и Outline.
Если присмотреться к кубу, цвета кажется распределенными немного неправильно. Это произошло из-за того, что в цветовой модели RGB мы оперируем числами в диапазоне от 0 до 255, а цвет нашим сферам во вьюпорте мы задаем в диапазоне от 0 до 1. Приводя один диапазон к другому, мы просто поделили значения на 255, что для преобразования диапазона цветов является ошибочным.
Чтобы перевести значение цвета из диапазона RGB в линейный диапазон, нам нужно воспользоваться специальной формулой.
Оформим ее в виде функции, на вход которой подается число из цветового диапазона RGB от 0 до 255, а на выходе мы получаем значение в линейном диапазоне от 0 до 1.
|
1 2 3 4 5 6 |
def rgb2l(color_value: int) -> float: color_value /= 255.99 if color_value <= 0.04045: return color_value / 12.92 else: return ((color_value + 0.055) / 1.055) ** 2.4 |
Теперь осталось немного изменить наш код построения цветового куба, добавив правильное преобразование цветов.
Финальный код:
|
1 2 3 4 5 6 7 8 9 10 |
for x in [int(_c * (255/5)) for _c in range(0, 6)]: for y in [int(_c * (255/5)) for _c in range(0, 6)]: for z in [int(_c * (255/5)) for _c in range(0, 6)]: bpy.ops.mesh.primitive_ico_sphere_add( radius=0.1, location=(x/255, y/255, z/255) ) active_object = bpy.context.object active_object.color = (rgb2l(x), rgb2l(y), rgb2l(z), 1) active_object.name = '(' + str(x) + ', ' + str(y) + ', ' + str(z) + ')' |
Теперь построенный нами цветовой куб выглядит корректно и мы можем удобно изучать распределение цветов в его пространстве.
Количество точек можно увеличить, чтобы повысить точность визуализации вплоть до 255.

.blend file on Patreon