Blender のちょっとしたスクリプト
カテゴリ:blender
コンストレイントの削除
import bpy #アクティブなアーマチュアのすべてが対象 for bone in bpy.context.active_object.pose.bones: for c in bone.constraints: #Constraint の名前で削除 if c.name == 'Limit Location': bone.constraints.remove(c) break #Constraint の型で削除 if c.type == 'COPY_ROTATION': bone.constraints.remove(c) break #Constraint のターゲット名で削除 if c.target.name == 'Empty': bone.constraints.remove(c) break #Constraint のターゲットボーン名で削除 if c.subtarget.name == 'Bone.001': bone.constraints.remove(c) break #ボーンについているすべての Transfromation を削除 crs = [c for c in bone.constraints if c.type == 'TRANSFORM'] for c in crs: bone.constraints.remove(c) #選択されているボーンのみが対象 for b in bpy.context.selected_pose_bones: for c in b.constraints: if c.name == 'Copy Rotation': b.constraints.remove(c) break
選択したボーンを参照しているボーンを表示する
import bpy amt = bpy.context.active_object bpy.ops.object.mode_set(mode='POSE') selected = [b.name for b in amt.pose.bones if b.bone.select] if len(selected) == 0: raise Exception() children = [] refers = [] for b in amt.pose.bones: if b.parent and b.parent.name in selected: children.append(b.name) for c in b.constraints: if hasattr(c, 'subtarget') and c.subtarget in selected: refers.append(b.name) # print refers if len(refers) > 0: refers = list(set(refers)) print('') print('=== bones refered to ===') for b in refers: print(b) # print children if len(children) > 0: print('') print('=== children ===') for c in children: print(c)
選択した頂点ひとつひとつに頂点グループを作成するスクリプト
import bpy name='script_generated' obj = bpy.context.active_object if obj and obj.type == 'MESH': old_mode = obj.mode bpy.ops.object.mode_set(mode='OBJECT') selected = [v.index for v in obj.data.vertices if v.select] for v in selected: vg = obj.vertex_groups.new(name) vg.add([v], 0.0, 'ADD') bpy.ops.object.mode_set(mode=old_mode)
オブジェクト名をメッシュ名、マテリアル名にコピーするスクリプト
import bpy mesh_objects = [o for o in bpy.data.objects if o.type == 'MESH'] for o in mesh_objects: o.data.name = o.name for m in o.data.materials: m.name = o.name
頂点グループのパッキング
import bpy combined_vc_name = 'combined' vg_names = ['Group', 'Group.001', 'Group.002'] vg_indices = [] for vg in vg_names: vg_indices.append(bpy.context.active_object.vertex_groups.find(vg)) num_elem = len(vg_names) mesh = bpy.context.active_object.data vc = mesh.vertex_colors out = vc[combined_vc_name] if combined_vc_name in vc else vc.new(name=combined_vc_name) def get_vg_weight(vertex, vg_index): for g in v.groups: if g.group == vg_index: return g.weight return -1 vcb = [] for v in mesh.vertices: c = [0]*4 for i, vg_index in enumerate(vg_indices): weight = get_vg_weight(v, vg_index) if weight != -1: c[i] = weight vcb.append(c) for p in mesh.polygons: for i in p.loop_indices: out.data[i].color = vcb[p.index]
頂点色のパッキング
グレースケールの頂点色をパッキングする。
import bpy combined_vc_name = 'combined' vc_names = ['Col', 'Col.001', 'Col.002'] num_elem = len(vc_names) vc = bpy.context.active_object.data.vertex_colors out = vc[combined_vc_name] if combined_vc_name in vc else vc.new(name=combined_vc_name) for i in range(len(vc[vc_names[0]].data)): new = [0]*4 for j in range(num_elem): new[j] = vc[vc_names[j]].data[i].color[0] out.data[i].color = new
頂点法線を頂点色にパッキング
法線は -1~1 の範囲なので1を足して 0.5 を掛けることで 0~1 の範囲にリマップしている。
import bpy, mathutils, bmesh data = bpy.context.active_object.data vc = data.vertex_colors out = vc.new(name="baked_normal") bpy.ops.object.mode_set(mode='EDIT') bm = bmesh.from_edit_mesh(data) print(len(bm.verts)) list = [] i = 0 for f in bm.faces: for l in f.loops: list.append( ((data.vertices[l.vert.index].normal + mathutils.Vector((1,1,1)))*0.5).to_4d() ) i = i+1 bpy.ops.object.mode_set(mode='OBJECT') for i in range(len(list)): out.data[i].color = list[i]