隅田川沿いを歩きつつ

歩きながら考えたことや感じたこと

PythonでHSVをRGBに変換する

Pythonを勉強中です。

勉強方法は、主にBlenderのPythonAPIです。

色の指定が RGB ばかりで HSV(HSB)を使えないのかな?使えると思うけどどうしたらいい?とずっと疑問でした。

HSV を RGB に変換する

まず、colorsys をインポートします。

import colorsys

colorsys.hsv_to_rgb(h,s,b)の引数に h,s,v を設定すると、tuple で r,g,b が取得できます。

rgb = colorsys.hsv_to_rgb(1, 1, 1)
# (1, 0.0, 0.0)

取得した tuple は、r,g,b の順に並んでいます。

print(rgb)
# (1, 0.0, 0.0)

print(rgb[0], rgb[1], rgb[2])
# 1 0.0 0.0

HSVをRGBに変換することができました。

docs.python.org

Blenderで試してみる

Blenderで試してみます。

Cubeを螺旋状に並べて、HSVで順番に色を付けました。

PythonでHSVをRGBに変換する

大量のメッシュに色を付ける時は、HSVの方が便利です。

import bpy
import math
import colorsys

NUM = 70
R = 5


def delete_all():
    for i in bpy.data.meshes:
        bpy.data.meshes.remove(i)
    for i in bpy.data.materials:
        bpy.data.materials.remove(i)


def make_cubes(num, r):
    for i in range(num):
        make_cube(i, i, i, r)
        r = r+0.2


def make_cube(x, y, z, r):
    x = math.cos(math.radians(x*10))*r
    y = math.sin(math.radians(y*10))*r
    z = z*0.2
    loc = (x, y, z)
    bpy.ops.mesh.primitive_cube_add(location=loc, size=2)
    bpy.ops.object.material_slot_add()


def make_material(name, color):
    ma = bpy.data.materials.new(name)
    ma.use_nodes = True
    bsdf = ma.node_tree.nodes['Principled BSDF']
    bsdf.inputs[0].default_value = color
    bsdf.inputs[4].default_value = 1
    bsdf.inputs[7].default_value = 1
    bpy.context.object.data.materials.append(ma)
    ma.diffuse_color = color
    return ma


def make_materials(num):
    mats = []
    for i in range(num):
        name = 'test'+str(i)
        rgb = colorsys.hsv_to_rgb(i/num, 1, 1)
        mats.append(make_material(name, (rgb[0], rgb[1], rgb[2], 1)))
    return mats


def set_materials(mats):
    index = 0
    for o in bpy.data.objects:
        for m in o.material_slots:
            m.material = mats[index]
            index += 1
            break


if __name__ == '__main__':
    delete_all()
    make_cubes(NUM, R)
    mats = make_materials(NUM)
    set_materials(mats)

BlenderユーザーのためのPython入門

BlenderユーザーのためのPython入門

  • 作者:大西武
  • シーアンドアール研究所
Amazon