【Blender】シンプルなボーンでアニメーションをFBXに書き出す

今回はBlendeのRigifyで作ったアニメーションを、このシンプルな骨格でfbxエクスポートできるようにします。

シンプルな骨格

なんでそうするかと言うと

ふつうにエクスポートした場合
意図してないボーンが入るというか、すごいゴチャゴチャした構造で書き出されるんですね。

デフォルトの骨格
首とか腰とか、何がどうなってるんだ

動きを見るだけならこれでも問題ないんですが、
Maya・Unityなど他のソフトで編集しようものなら、カオスすぎて手に負えなくなる。

なのでエクスポート専用ボーンをRigifyに仕込んで、超シンプルな骨格でエクスポートしようという作戦です。

このシンプル骨格にして以来、他のソフトへの移植がずっと楽になりました。
関連記事 Blender→Mayaにモデル・ボーンを移植する
関連記事 BlenderのアニメーションをMayaでリターゲット

エクスポート用ボーンを作る

メタリグからエクスポート用ボーンを作っていきます。

メタリグを使う

メタリグをコピーします。
オブジェクトモードでメタリグを選択して、ビューポート上で Ctrl+D → Enter
「metarig.001」ができます。

メタリグをコピー

この「metarig.001」をエクスポート用のアーマチュアにします。
名前を「export」に変えておきます。

コピーしたメタリグをexportにリネーム
元のメタリグはもう使わないので非表示にしてOK。

export用アーマチュアにrootボーンを追加します。
export用アーマチュアを選択 > 編集モード > 追加 > 単一ボーン

単一ボーン追加

でかいボーンができます。

新しいボーン

これをrootボーンにするので「root」にリネームします。

rootにリネーム

ボーンの親子構造が
root:親
spine:子 になるよう直します。

spine → root の順番でボーンを複数選択 > Pキー >オフセット保持

ペアレント

アウトライナを見て、rootの中にspineが入ってればOK。

rootの中にspineが入ってればOK

rootボーンがデカすぎるので小さくします。

編集モードでrootボーンを選択して、
X=0
Y=0.1
Z=0 を入力。

rootボーン小さくする

※rootは座標情報だけあればいいボーンなので、長さは適当でOK。
 ただしMayaと違って長さ0にするとBlenderを閉じたら消滅するので0にはしない

rootがちっちゃくなった

root小さくなった

これでエクスポート用ボーンができました!
次はこのボーンをリグに仕込んで動かせるようにします。

エクスポート用ボーンをリグに仕込んで動かす

exportボーンがDEFボーンと同じ動きをするようにコンストレイントを入れます。
ボーン1個ずつやるのは面倒なのでスクリプトで一括でやります。

テキストエディターを開きます。

テキストエディター

新規テキストを作成。

新規テキスト作成

下記のスクリプトをコピペします。

import bpy

# 設定
EXPORT_ARMATURE_NAME = "export"   # exportアーマチュアのオブジェクト名
RIG_ARMATURE_NAME = "rig"         # rigアーマチュアのオブジェクト名
EXPORT_PREFIX = ""                # exportボーンのプレフィックス(なければ空文字)
RIG_PREFIX = "DEF-"              # rigボーンのプレフィックス

def add_copy_transforms():
    export_obj = bpy.data.objects.get(EXPORT_ARMATURE_NAME)
    rig_obj = bpy.data.objects.get(RIG_ARMATURE_NAME)

    if not export_obj or not rig_obj:
        print("ERROR: アーマチュアが見つかりません")
        return

    # ポーズモードに切り替え
    bpy.context.view_layer.objects.active = export_obj
    bpy.ops.object.mode_set(mode='POSE')

    count = 0
    skipped = 0

    for pose_bone in export_obj.pose.bones:
        bone_name = pose_bone.name  # 例: "tail.001"

        # 対応するDEFボーン名を組み立て
        target_bone_name = RIG_PREFIX + bone_name  # 例: "DEF-tail.001"

        # rigアーマチュアにそのボーンが存在するか確認
        if target_bone_name not in rig_obj.pose.bones:
            print(f"SKIP: {target_bone_name} が rig に見つかりません")
            skipped += 1
            continue

        # 既存のCopy Transformsコンストレイントを削除(重複防止)
        for c in pose_bone.constraints:
            if c.type == 'COPY_TRANSFORMS' and c.name == "Copy DEF Transforms":
                pose_bone.constraints.remove(c)

        # コンストレイントを追加
        constraint = pose_bone.constraints.new('COPY_TRANSFORMS')
        constraint.name = "Copy DEF Transforms"
        constraint.target = rig_obj
        constraint.subtarget = target_bone_name

        print(f"OK: {bone_name} → {target_bone_name}")
        count += 1

    bpy.ops.object.mode_set(mode='OBJECT')
    print(f"\n完了: {count}本追加, {skipped}本スキップ")

add_copy_transforms()

スクリプトの定数部分は、必要に応じて書き換えます。
 4行目 “export” さっき作ったexport用アーマチュア名
 5行目 “rig” リグのオブジェクト名
自分のリグに合った名前に書き換えたら、スクリプト実行(▶ボタン)をクリック。

スクリプト実行

ちゃんとスクリプトが効いたか確認します。
リグをポーズモードで動かして、exportボーンが一緒に動いてれば成功。

exportボーンがリグで動く

ただしrootボーンは対応するDEFボーンがないので動きません。
そのため手動でボーンコンストレイントを追加します。

リグにrootボーンをコンストレイント

ポーズモードでrootボーンを選択。

rootボーン選択

ボーンコンストレイント > ボーンコンストレイントを追加 > トランスフォームコピー

トランスフォームコピー

ターゲット:リグのアーマチュア名
ボーン:リグのrootコントローラー
 にします。

コンストレイント設定

これでrootボーンがrootコントローラーと同じ動きをします。

rootボーンがrootコントローラーと同じ動きをします

試しにリグを動かしてみて、
全部のexport用ボーンがリグで動くようになってればOK。

できた!

ボーンだけFBXにする場合は、これで完成!
モデルもFBXにしたい場合は、モデルのウェイトをexport用ボーンに割り当ててください。

エクスポート用ボーンをFBXに書き出す

あとはexport用ボーンを選択してFBXエクスポートするだけです。
ファイル > エクスポート > FBX 

エクスポート

エクスポートの設定「アニメーションのベイク」に✓を入れるのを忘れないように。

アニメーションをベイクに✓

以上、シンプルな骨格でアニメーションFBXを書き出すやりかたでした。

PAGE TOP