広告
広告

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'
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

関連記事

Blender 記事の目次


広告
広告