dskjal
広告
広告

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]    

関連記事

Blender 記事の目次


広告
広告

カテゴリ