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]