Blender Python Script を触り始めて2日目。
単一のメッシュ内で、複雑な選択をしているグループをBlenderで作り、頂点カラーの情報としてもたせることによって、他のツールでグループとして扱えるようにしたい。
あらかじめメッシュの一部をVertex Groupでグルーピングし、そのグループに対して特定の頂点カラーを塗る。頂点カラーは、メッシュのVertex Colorsにアクセスしても色の配列が返されるだけなので、bmesh経由で色を塗った。
##参考
[Blender PythonのMeshデータアクセスのチートシート]
(https://qiita.com/kenyoshi17/items/b93bbba6451e3c6017e5)
[Applying per vertex colors]
(https://blender.stackexchange.com/questions/60676/applying-per-vertex-colors-to-new-bmesh)
##コード
import bpy
import bmesh
from random import uniform
# OBJECT MODE
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
obj_name = "Cylinder"
group_name = "Group"
color1 = [0.0,1.0,0.0,1.0]
color2 = [1.0,0.0,0.0,1.0]
# OBJECT
obj = bpy.data.objects[obj_name]
# MESH
mesh = obj.data
# BMESH
bm = bmesh.new()
bm.from_mesh(mesh)
# COLOR LAYER
color_layer = bm.loops.layers.color.new("color")
# SET GROUP INDEX
group_index = 0
gs = obj.vertex_groups
for g in gs:
if g.name == group_name:
group_index = g.index
# SELECT COLOR2 GROUP
color2_idlist = []
for v in mesh.vertices:
for grp in v.groups:
if grp.group == group_index:
color2_idlist.append(v.index)
# PAINT COLORS
for face in bm.faces:
for loop in face.loops:
if loop.vert.index in color2_idlist:
loop[color_layer] = color2
else:
loop[color_layer] = color1
# APPLY DATA
bm.to_mesh(mesh)
object.dataのmeshよりも、bmeshを経由させた方が、おそらく操作しやすい。
頂点を中心にしたデータ構造に一旦あらためて、そこから操作していくとかがやりやすいのだろうか。