blender のアドオンの rokoko を導入してモーションとりこんでいたが、たまにキャラクターが空中にういたようなモーションになった。
そのため、rokoko を使わないで取り込む手順を模索してその結果を記載する。
vrm,fbx読み込みの後から記載
blender 上部メニューの「アニメーション」にする
下部のタイムラインの欄は「ドープシート」を選ぶ
「ドープシート」から「アクションエディター」に変える
上部のキャラクターが表示されている欄を「オブジェクトモード」にする
いったん、右上のツリー内の適用先の「(オレンジ色)Armature」をクリックし、
モーション持っている側の「(オレンジ色)Armature.001」をクリックする
###「アクションエディター」欄のタイムライン内の「概要」の直下の Armature.001 から jump 等に名前を変える
右上のツリー内の適用先の「(オレンジ色)Armature」をクリック
「アクションエディター」欄の「+ 新規」の左隣りの菱形が逆三角形でならんでいるアイコンプルダウンを展開し
「F Armature.001|mixamo.com|Layer0」を選択する
でてきた「Armature.001」を任意の名前(jump等)に変える
blender 上部メニューの「スクリプト作成」を選択し、「新規」を押し下記スクリプトを実行する。
### スクリプト実行だけではまだです。スクリプト実行後も適用の手順続きます。
### ここから ###
import bpy
# --- 設定 ---
target_armature_name = "Armature"
source_armature_name = "Armature.001"
bone_names = [
"mixamorig:Hips", "mixamorig:Spine", "mixamorig:Neck", "mixamorig:Head",
"mixamorig:RightShoulder", "mixamorig:RightHand",
"mixamorig:LeftShoulder", "mixamorig:LeftHand",
"mixamorig:RightFoot", "mixamorig:RightToeBase",
"mixamorig:LeftFoot", "mixamorig:LeftToeBase",
"mixamorig:Chest", "mixamorig:UpperChest",
"mixamorig:LeftUpperArm", "mixamorig:LeftLowerArm",
"mixamorig:LeftIndex1", "mixamorig:LeftIndex2", "mixamorig:LeftIndex3",
"mixamorig:LeftLittle1", "mixamorig:LeftLittle2", "mixamorig:LeftLittle3",
"mixamorig:LeftMiddle1", "mixamorig:LeftMiddle2", "mixamorig:LeftMiddle3",
"mixamorig:LeftRing1", "mixamorig:LeftRing2", "mixamorig:LeftRing3",
"mixamorig:LeftThumb1", "mixamorig:LeftThumb2", "mixamorig:LeftThumb3",
"mixamorig:RightUpperArm", "mixamorig:RightLowerArm",
"mixamorig:RightIndex1", "mixamorig:RightIndex2", "mixamorig:RightIndex3",
"mixamorig:RightLittle1", "mixamorig:RightLittle2", "mixamorig:RightLittle3",
"mixamorig:RightMiddle1", "mixamorig:RightMiddle2", "mixamorig:RightMiddle3",
"mixamorig:RightRing1", "mixamorig:RightRing2", "mixamorig:RightRing3",
"mixamorig:RightThumb1", "mixamorig:RightThumb2", "mixamorig:RightThumb3",
"mixamorig:LeftUpperLeg", "mixamorig:LeftLowerLeg", "mixamorig:LeftFoot", "mixamorig:LeftToe_End",
"mixamorig:RightUpperLeg", "mixamorig:RightLowerLeg", "mixamorig:RightFoot", "mixamorig:RightToe_End"
]
def retarget_mixamo_animation(target_armature_name, source_armature_name, bone_names):
"""Mixamo アニメーションをターゲットアーマチュアにリターゲットします。"""
try:
target_armature = bpy.data.objects[target_armature_name]
source_armature = bpy.data.objects[source_armature_name]
except KeyError as e:
print(f"エラー:オブジェクトが見つかりません: {e}")
return
if target_armature.type != 'ARMATURE' or source_armature.type != 'ARMATURE':
print("エラー:指定されたオブジェクトはアーマチュアではありません。")
return
bpy.context.view_layer.objects.active = target_armature # ターゲットアーマチュアをアクティブにする
for bone_name in bone_names:
target_bone = target_armature.pose.bones.get(bone_name)
source_bone = source_armature.pose.bones.get(bone_name)
if target_bone and source_bone:
# コンストレイントをクリア (既存のものを削除)
if bone_name in target_bone.constraints:
target_bone.constraints.remove(bone_name)
# コピー変換コンストレイントを Bone に追加
copy_transforms = target_bone.constraints.new('COPY_TRANSFORMS')
copy_transforms.target = source_armature
copy_transforms.subtarget = source_bone.name
print(f"ボーン '{bone_name}' にコンストレイントを追加")
else:
if not target_bone:
print(f"警告:ターゲットアーマチュア '{target_armature_name}' にボーン '{bone_name}' が見つかりません。スキップします。")
elif not source_bone:
print(f"警告:ソースアーマチュア '{source_armature_name}' にボーン '{bone_name}' が見つかりません。スキップします。")
print("Mixamo アニメーションのリターゲット処理が完了しました。")
# スクリプト実行
retarget_mixamo_animation(target_armature_name, source_armature_name, bone_names)
### ここまで ###
#########################
blender 上部メニューの「レイアウト」を選択し「ポーズモード」にする
右上のツリー内の適用先の「Armature」をクリック
左枠のキャラクターのそばの空いてるところで「A」キー
「ポーズモード」枠のメニューの「ポーズ」「アニメーション」「アニメーションをベイク」を選ぶ
最終フレームの欄に、モーションの最終フレームの数字をいれ、
「ビジュアルキーイング」「コンストレイントをクリア」「現在のアクションを上書き」に追加でチェック入れる
### あと始末
右シーンコレクション内に追加していたコレクションを
丸ごと削除する
Armature.001 のようなものが残ったら、それも削除する