見出し画像

blenderのウェイト、頂点グループの左右反転ミラーが面倒だったのでスクリプト書いた

mayaには普通にあるのに……!

という事でアドオン化するの面倒だったのでpythonスクリプトで走り書き
実行される順序としては
コードの一番最後にある
"vertex_mirror(1)"
これはカッコ内に1があるとRからLにミラー転写、0があるとLからRにミラー転写するもので
例えば骨の名前の末尾に"_L"  "_R"を付けてるアーマチュア(骨)で設計されてれば多分問題無く反転されるはず
_L とか _R とかじゃなくて _Right _Left とかの場合は書き換えちゃえば使えると思います
以下手順
⓪まず転写したいオブジェクトをアクティブ(選択)
①_L or _Rの名前が付いてる頂点を取得
②_L or _Rの反対の頂点グループを削除
③削除されていない頂点グループを上から順にコピーする
④コピーされた頂点グループは[_*_copy]という接尾句が付くので削除した方向の名前をつけなおす
⑤完了

キャラのスキニング作業をちょって手伝う程度のスクリプトなので適当に改良して使って下さい(python全く分からねぇけど使いてぇ!って時はコメント貰えればちょっと書き換える位はしても良いょ(期待しないで))




import bpy


def vertex_mirror(sef):
    
    obj = bpy.context.object
    objname = obj.name
    vgrp = [i.name for i in obj.vertex_groups]
    
    vgrp_l = [i for i in vgrp if "_L" == i[-2:]]
    vgrp_r = [i for i in vgrp if "_R" == i[-2:]]
    
    if sef == 0:
        for d in vgrp_r:
            del_vgrp = obj.vertex_groups[d]
            obj.vertex_groups.remove(del_vgrp)
        for g in vgrp_l:
            vg_index = obj.vertex_groups[g].index
            obj.vertex_groups.active_index = vg_index
            bpy.ops.object.vertex_group_copy()
            vall_grp = len(obj.vertex_groups) - 1
            obj.vertex_groups.active_index = vall_grp
            bpy.ops.object.vertex_group_mirror(use_topology=False)
            bname = bpy.data.objects[objname]
        obj = bpy.context.object
        vgrp = [i.name for i in obj.vertex_groups]
        vgrp_copy = [i for i in vgrp if "_copy" in i]
        for v in vgrp_copy:
            changevgrp = obj.vertex_groups[v]
            changevgrp.name = changevgrp.name.replace("_L_copy","_R")

    elif sef == 1:
        for d in vgrp_l:
            del_vgrp = obj.vertex_groups[d]
            obj.vertex_groups.remove(del_vgrp)
        for g in vgrp_r:
            vg_index = obj.vertex_groups[g].index
            obj.vertex_groups.active_index = vg_index
            bpy.ops.object.vertex_group_copy()
            vall_grp = len(obj.vertex_groups) - 1
            obj.vertex_groups.active_index = vall_grp
            bpy.ops.object.vertex_group_mirror(use_topology=False)
            bname = bpy.data.objects[objname]
        obj = bpy.context.object
        vgrp = [i.name for i in obj.vertex_groups]
        vgrp_copy = [i for i in vgrp if "_copy" in i]
        for v in vgrp_copy:
            changevgrp = obj.vertex_groups[v]
            changevgrp.name = changevgrp.name.replace("_R_copy","_L")

# 0 = _L to _R    1 =  _R to _L
vertex_mirror(1)


この記事が気に入ったらサポートをしてみませんか?