コード例 #1
0
ファイル: armature_fs.py プロジェクト: hanshuogang/Learnbgame
def symmetrize_armature(obj=None, cutoff=.001, scale=.5):
    ac = set_ac(obj)
    mode = set_mode("EDIT")
    ebones = obj.data.edit_bones
    bones = obj

    xcos = tuple(b.head[0] for b in ebones)
    l = tuple(ebones[i] for i in get_side(coords=xcos))
    r = tuple(ebones[i]
              for i in get_side(coords=xcos, cmp_func=lambda x, y: x < y))

    n_r = mirror_arm_side(bones=l, side_tag="_R", scale=scale)
    n_l = mirror_arm_side(bones=r, side_tag="_L", scale=scale)

    for b in r:
        b.name += "_R"
    for b in l:
        b.name += "_L"

    res_r = (tuple(b.name for b in r), tuple(b.name for b in n_r))
    res_l = (tuple(b.name for b in l), tuple(b.name for b in n_l))

    set_mode(mode)
    set_ac(ac)

    return res_r, res_l
コード例 #2
0
def set_minimum_envelopes(obj = None):
    ac = set_ac(obj)
    mode = set_mode("EDIT")
    for b in obj.data.edit_bones:
        b.envelope_distance = 0
        b.head_radius = .0001
        b.tail_radius = .0001
    set_mode(mode)
    set_ac(ac)
コード例 #3
0
def ordered_bone_parent(bone_names,obj = None):
    ac = set_ac(obj)
    mode = set_mode("EDIT")
    ebones = obj.data.edit_bones
    if bone_names[0] != None:
        ebones[bone_names[1]].parent = ebones[bone_names[0]]
    if len(bone_names) > 2:
        for b in range(2,len(bone_names)):
            bname,parent_name = (bone_names[b],bone_names[b-1])
            ebones[bname].parent = ebones[parent_name]
            
    set_mode(mode)
    set_ac(ac)
コード例 #4
0
ファイル: mesh_fs.py プロジェクト: hanshuogang/Learnbgame
def mirror_selector(mirror_verts, mirror_dict, obj=None):
    mode = set_mode('OBJECT')
    mesh = obj.data
    verts = mesh.vertices
    errs = []
    for v in mirror_verts:
        vco, vindex = v
        try:
            for vert in mirror_dict[vco]:
                verts[vert].select = True
        except Exception as e:
            errs.append((e, vindex))
    set_mode(mode)
    return errs
コード例 #5
0
ファイル: armature_fs.py プロジェクト: hanshuogang/Learnbgame
def envelope_armature_settings(envelope_distance=.25,
                               envelope_weight=1.0,
                               head_radius=0,
                               tail_radius=0,
                               obj=None):
    prop_dict = kwargize(head_radius=head_radius,
                         tail_radius=tail_radius,
                         envelope_distance=envelope_distance,
                         envelope_weight=envelope_weight)
    ac = set_ac(obj)
    mode = set_mode("EDIT")
    ebones = obj.data.edit_bones
    tmap(lambda b: prop_copy(b, prop_dict), ebones)
    set_mode(mode)
    set_ac(ac)
コード例 #6
0
def bone_trans(matrix,obj = None,bone_names = None,scale = .5):
    ac = set_ac(obj)
    mode = set_mode("EDIT")
    ebones = obj.data.edit_bones
    if bone_names:
        target_bones = tuple(ebones[bn] for bn in bone_names)
    else:
        target_bones = tuple(ebones)
    m3 = matrix.to_3x3()
    mt = matrix.to_translation()
    anymap(lambda b: b.head.rotate(matrix),target_bones)
    anymap(lambda b: b.tail.rotate(matrix),target_bones)
    anymap(lambda b: setattr(b,"head",mt+b.head),target_bones)
    anymap(lambda b: setattr(b,"tail",Vector((0,1,0))*scale+b.head),target_bones)
    set_mode(mode)
    set_ac(ac)
コード例 #7
0
ファイル: mesh_fs.py プロジェクト: hanshuogang/Learnbgame
def send_mirror_weights_exec(vdata=None,
                             cutoff=.001,
                             type="both",
                             scale=1,
                             target_shape_key_index=0,
                             use_active_shape_key=False,
                             precision=4,
                             obj=None,
                             selected_only=True):
    mode = set_mode('OBJECT')
    if vdata == None:
        vdata = find_mirror(target_shape_key_index=target_shape_key_index,
                            use_active_shape_key=use_active_shape_key,
                            obj=obj,
                            precision=precision,
                            scale=scale)
    selvertsL, vcodictL, selvertsR, vcodictR = vdata

    vgroups = obj.vertex_groups

    tdict = {
        "l>r": ((selvertsL, vcodictR), ),
        "l<r": ((selvertsR, vcodictL), ),
        "both": (
            (selvertsL, vcodictR),
            (selvertsR, vcodictL),
        )
    }
    for vs, vdict in tdict[type]:
        mirror_weights(vs,
                       vdict,
                       obj=obj,
                       vgroups=vgroups,
                       selected_only=selected_only)

    set_mode(mode)
    return vdata
コード例 #8
0
ファイル: mesh_fs.py プロジェクト: hanshuogang/Learnbgame
def mirror_weights_exec(vdata=None,
                        precision=4,
                        scale=1,
                        target_shape_key_index=0,
                        use_active_shape_key=False,
                        obj=None,
                        do_clear=True,
                        oper=None):
    locs = dict(locals())
    locs.pop("vdata")
    locs.pop("do_clear")

    mode = set_mode('OBJECT')
    if vdata == None:
        match_data, selverts = find_mirror_selected(
            target_shape_key_index=target_shape_key_index,
            use_active_shape_key=use_active_shape_key,
            obj=obj,
            precision=precision,
            scale=scale)

    vgroups = obj.vertex_groups

    no_matches = []
    for vmatches, vidx in zip(match_data, selverts):
        if len(vmatches) == 0:
            no_matches.append(vidx)
            continue
        match_weight_data = vmatches[0]
        weight_replace(match_weight_data, vidx, obj, do_clear)

    rep_msg = "Found no match for " + str(len(no_matches)) + " verts"
    oper.report({"INFO"}, rep_msg)

    set_mode(mode)
    return match_data, selverts, no_matches
コード例 #9
0
ファイル: mesh_fs.py プロジェクト: hanshuogang/Learnbgame
def mirror_sel(vdata=None,
               cutoff=.001,
               type="both",
               extend=True,
               precision=4,
               scale=1,
               target_shape_key_index=0,
               use_active_shape_key=False,
               obj=None):
    mode = set_mode('OBJECT')
    if vdata == None:
        vdata = find_mirror(cutoff=cutoff,
                            precision=precision,
                            scale=scale,
                            target_shape_key_index=target_shape_key_index,
                            use_active_shape_key=use_active_shape_key,
                            obj=obj)
    selvertsL, vcodictL, selvertsR, vcodictR, mid = vdata

    tdict = {
        "l>r": ((selvertsL, vcodictR), ),
        "l<r": ((selvertsR, vcodictL), ),
        "both": (
            (selvertsL, vcodictR),
            (selvertsR, vcodictL),
        )
    }

    if extend == False:
        deselect_mesh_parts(obj=obj)

    for vs, vdict in tdict[type]:
        mirror_selector(vs, vdict, obj=obj)

    set_mode(mode)
    return vdata
コード例 #10
0
def make_bone(name = "Bone",obj = None,autoswitch = True,loc = None,dir = None,scale = .05,parent = None,props = {}):
    if loc == None:
        loc = (0,0,0)
    if dir == None:
        dir = (0,1,0)
    if autoswitch:
        ac = set_ac(obj)
        mode = set_mode("EDIT")
        
    ebones = obj.data.edit_bones
    newbone = init_new_bone(ebones)
    newbone.name = name
    
    newbone.head = loc
    newbone.tail = Vector(loc) + Vector(dir)*scale
    
    if parent != None:
        newbone.parent = parent
        
    prop_copy(newbone,props)
    if autoswitch:
        set_mode(mode)
        set_ac(ac)
    return newbone
コード例 #11
0
ファイル: curve_fs.py プロジェクト: hanshuogang/Learnbgame
def curve_to_armature(obj=None,
                      base_name="Bone",
                      make_new_arm=True,
                      arm=None,
                      do_armature=True,
                      scale=.5,
                      do_symmetrize=False,
                      obj_trans_copy=True,
                      bone_props=None,
                      root_bone=None,
                      use_apply_on_spline=False,
                      align_bones=False,
                      do_bone_parent=True):
    if bone_props == None:
        bone_props = {}
    if make_new_arm:
        arm = gtls.make_arm(name="arm_to_curve_" + obj.name)
    else:
        if arm == None:
            arm = get_sel_obj()

    for i in rlen(arm.layers):
        arm.layers[i] = True
    arm.data.draw_type = "STICK"
    mods = obj.modifiers
    splines = tuple(s.bezier_points if s.type == "BEZIER" else s.points
                    for s in obj.data.splines)

    ac = set_ac(arm)
    res = tuple(
        map(
            lambda verts: tuple(
                map(
                    lambda v: bone_fs.make_bone(name=base_name + str(verts[0]),
                                                scale=scale,
                                                obj=arm,
                                                loc=v.co[0:3],
                                                props=bone_props), verts[1])),
            enumerate(splines)))
    res = unpack(res)
    res = list(b.name for b in res)
    res.sort()

    #rootボーンが指定された場合、チュープルの前に置いとく
    if root_bone == None:
        bone_names = res
    else:
        bone_names = (root_bone, *res)

    if do_armature:
        mod = mods.new(name="Curve_to_Armature", type="ARMATURE")
        props = {
            "use_vertex_groups": not use_apply_on_spline,
            "use_bone_envelopes": use_apply_on_spline,
            "object": arm,
            "show_in_editmode": True,
            "use_apply_on_spline": use_apply_on_spline,
        }
        prop_copy(mod, props)

    if do_symmetrize:
        armature_fs.symmetrize_armature(obj=arm)
        curve_fs.symmetrize_spline(obj=obj)

    if obj_trans_copy:
        bone_fs.bone_trans(obj.matrix_world,
                           bone_names=bone_names,
                           obj=arm,
                           scale=scale)

    mode = set_mode("EDIT")
    ebones = arm.data.edit_bones
    c = 0
    for s in rlen(splines):
        c += 0
        ls = len(splines[s])
        if do_bone_parent:
            bone_fs.ordered_bone_parent(bone_names[c:(c + ls)], obj=arm)
        if align_bones:
            for b in range(ls - 1):
                b1 = ebones[bone_names[c]]
                b2 = ebones[bone_names[c + 1]]
                b1.tail = b2.head
                c += 1
        c += 1
    set_mode(mode)
    set_ac(ac)

    return arm