😃

INABAの表情筋を鍛えるためのPythonスクリプト

2023/03/07に公開

表情シェイプキーのコピー作業を自動化できないか調べたところ、
PythonでBlenderをマクロ操作できることが分かったので、書いてみました。
注意点と使用方法は以下の通りです。

注意点

以下の表情シェイプキーは、表情の内容が変更されます。

シェイプキー 変更後の表情
にやり 口角上げ
デフォルト表情(Basis)
デフォルト表情(Basis)

対応する表情がないシェイプキーについては、デフォルト表情(Basis)のシェイプキーをコピーしています。

シェイプキー
光下
口角広げ

使用方法

FBXをインポート後、Shift+F11でテキストエディタを開きます。

テキストエディタで「新規」ボタンを押下し、以下のコードを貼り付けます。

import bpy

COPY_SHAPE_KEYS = [
    ["まばたき"      , ["blink"          , 1.0 ]],
    ["ウィンク"      , ["笑いL"          , 1.0 ]],
    ["ウィンク右"    , ["笑いR"          , 1.0 ]],
    ["ウィンク2"    , ["ウィンクL"      , 1.0 ]],
    ["ウィンク2右"      , ["ウィンクR"      , 1.0 ]],
    ["はぅ"          , ["はう目"         , 1.0 ]],
    ["じと目"        , ["ジト目"         , 1.0 ]],
    ["キリッ"           , ["怒"             , 1.0 ]],
    ["星目"          , ["シイタケ"       , 1.0 ]],
    ["はぁと"        , ["ハート目"       , 1.0 ]],
    ["瞳小"          , ["目小"           , 0.47]],
    ["瞳大"          , ["目大"           , 0.3 ]],
    ["光下"          , ["Basis"           ,1.0 ]],
    ["ハイライト消し", ["ハイライトオフ1", 1.0 ],
                       ["ハイライトオフ2", 1.0 ],
                       ["瞳孔無し"       , 1.0 ],
                       ["絶望"           , 1.0 ]],
    ["ω□"          , ["ω"             , 1.0 ]],
    ["∧"            , ["^"              , 1.0 ]],
    ["▲"            , ["sankaku"        , 1.0 ]],
    ["はんっ!"      , ["ワ"             , 1.0 ],
                       ["口角上げL"      , 1.0 ]],
    ["にやり"        , ["口角上げ"       , 1.0 ]],
    ["にっこり"      , ["口角上げ"       , 1.0 ]],
    ["ぺろっ"        , ["舌1"            , 1.0 ]],
    ["てへぺろ"      , ["舌3"            , 1.0 ]],
    ["口横広げ"      , ["Basis"          , 1.0 ]],
    ["困る"          , ["困り"           , 1.0 ]],
    ["にこり"        , ["喜び"           , 1.0 ]],
    ["上"            , ["Basis"          , 1.0 ]],
    ["下"            , ["Basis"          , 1.0 ]],
    ["頬染め"        , ["照れ"           , 1.0 ]],
    ["涙"            , ["涙1"            , 1.0 ]]
]

obj = bpy.data.objects.get("Body")
bpy.context.view_layer.objects.active = obj

def createShapeKey(name):
    bpy.ops.object.mode_set(mode="OBJECT")

    shape_keys = obj.data.shape_keys.key_blocks.keys()
    if name in shape_keys:
        obj.active_shape_key_index = shape_keys.index(name)
        bpy.ops.object.shape_key_remove(all=False)

    bpy.ops.object.shape_key_add(from_mix=False)
    obj.active_shape_key.name = name

def copyShapeKey(cp0, cp1, blend):
    shape_keys = obj.data.shape_keys.key_blocks.keys()
    obj.active_shape_key_index = shape_keys.index(cp0)

    bpy.ops.object.mode_set(mode="EDIT")
    bpy.ops.mesh.select_all(action="SELECT")
    bpy.ops.mesh.blend_from_shape(shape=cp1, blend=blend, add=True)

createShapeKey(name="===MMD===")

for copy_keys in COPY_SHAPE_KEYS:
    createShapeKey(name=copy_keys[0])

    for keys in copy_keys[1:]:
        copyShapeKey(cp0=copy_keys[0], cp1=keys[0], blend=keys[1])

bpy.ops.object.mode_set(mode="OBJECT")

▶ (スクリプト実行)ボタンを押下します。

情報のウィンドウを開いて、bpy.ops.text.run_script()が出力されていれば成功です。

確認

Shift+F5で3Dビューポートを開いて、Bodyを選択します。
COPY_SHAPE_KEYSの表情シェイプキーが追加されています。

クレジット・参考リンク

https://booth.pm/ja/items/4213786
https://dskjal.com/blender/shapekey.html
https://end0tknr.hateblo.jp/entry/20221021/1666298016
https://mmd15gyuunyuu.blog.jp/archives/11193436.html

Discussion