広告
広告

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 bpyamt = bpy.context.active_objectbpy.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 refersif len(refers) > 0:    refers = list(set(refers))    print('')    print('=== bones refered to ===')    for b in refers:        print(b)        # print childrenif len(children) > 0:    print('')    print('=== children ===')    for c in children:        print(c)

選択した頂点ひとつひとつに頂点グループを作成するスクリプト

import bpyname='script_generated'obj = bpy.context.active_objectif 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 bpymesh_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 bpycombined_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.datavc = mesh.vertex_colorsout = 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 -1vcb = []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 bpycombined_vc_name = 'combined'vc_names = ['Col', 'Col.001', 'Col.002']num_elem = len(vc_names)vc = bpy.context.active_object.data.vertex_colorsout = 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, bmeshdata = bpy.context.active_object.datavc = data.vertex_colorsout = vc.new(name="baked_normal")bpy.ops.object.mode_set(mode='EDIT')bm = bmesh.from_edit_mesh(data)print(len(bm.verts))list = []i = 0for 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+1bpy.ops.object.mode_set(mode='OBJECT')for i in range(len(list)):    out.data[i].color = list[i]    

関連記事

Blender 記事の目次


広告
広告