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に変換することができました。
Blenderで試してみる
Blenderで試してみます。
Cubeを螺旋状に並べて、HSVで順番に色を付けました。
大量のメッシュに色を付ける時は、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)