LoginSignup
5
1

More than 3 years have passed since last update.

[Blender2.8] 特定のVertex Groupに対して、Pythonで色を塗る。

Last updated at Posted at 2019-07-05

Blender Python Script を触り始めて2日目。

単一のメッシュ内で、複雑な選択をしているグループをBlenderで作り、頂点カラーの情報としてもたせることによって、他のツールでグループとして扱えるようにしたい。

あらかじめメッシュの一部をVertex Groupでグルーピングし、そのグループに対して特定の頂点カラーを塗る。頂点カラーは、メッシュのVertex Colorsにアクセスしても色の配列が返されるだけなので、bmesh経由で色を塗った。

参考

Blender PythonのMeshデータアクセスのチートシート
Applying per vertex colors

コード

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を経由させた方が、おそらく操作しやすい。

頂点を中心にしたデータ構造に一旦あらためて、そこから操作していくとかがやりやすいのだろうか。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1