起きた問題
Blenderのポーズモードでボーンを左右対称に編集しようとミラー機能を使用したところ、片側のボーンしか動かない問題が発生しました。
環境
Blenderバージョン: 3.6
VRMインポートアドオン: VRM Add-on for Blender
原因
VRMモデルをBlenderにインポートすると、ボーン名の形式の違いにより、Blenderのミラー機能が正しく働かなくなります。
Blender: xxx.L / xxx.R の形式を左右対称と認識
VRM: J_Bip_L_Hand / J_Bip_R_Hand → Blenderではミラー対象とみなされない
この形式の違いにより、ミラー編集が片側しか反映されないという問題が起きます。
解決策:ボーン名の一括変換スクリプト
ボーン名をBlenderで認識される形式(語尾が .L または .R になっている)に変更する必要があります。
以下のPythonスクリプトを使用すると、現在のボーン名に応じてVRM形式またはBlender形式のいずれかに一括で変換できます。
このスクリプトは、Blender形式に変換可能なボーン名(_L_
や_R_
を含む)を検出した場合に.L
や.R
付きのBlender形式へ変換し、それ以外の場合はVRM形式に戻します。
これにより、ポーズ作業時にはBlenderのミラー機能を使い、作業後はVRM形式へ復元することが可能です。
ボーン名を変換するPythonスクリプト
import bpy
# アーマチュアオブジェクトを取得
armature = bpy.context.active_object
def to_vrm_default():
"""ボーン名をVRM形式に戻す(末尾の .L/.R を削除し、_LR_ → _L_/_R_)"""
for bone in armature.data.bones:
if bone.name.endswith(".L"):
# 末尾の .L を削除し、_LR_ を _L_ に置換
new_name = bone.name[:-2].replace("_LR_", "_L_")
bone.name = new_name
elif bone.name.endswith(".R"):
# 末尾の .R を削除し、_LR_ を _R_ に置換
new_name = bone.name[:-2].replace("_LR_", "_R_")
bone.name = new_name
def to_blender_default():
"""ボーン名をBlender形式に変換(_L_/_R_ → _LR_ に変換して末尾に .L/.R を追加)"""
converted = 0
for bone in armature.data.bones:
if "_L_" in bone.name:
new_name = bone.name.replace("_L_", "_LR_")
bone.name = new_name + ".L"
converted += 1
elif "_R_" in bone.name:
new_name = bone.name.replace("_R_", "_LR_")
bone.name = new_name + ".R"
converted += 1
return converted > 0
# 状態に応じて変換実行(すでにBlender形式ならVRM形式に戻す)
if not to_blender_default():
to_vrm_default()
この手順によって、Blender内でVRMモデルのボーンを左右対称に編集できるようになります。
注意
このスクリプトはボーン名を書き換えるため、他ツールとの互換性やVRM出力に影響を与える可能性があります。
例えば、Humanoidボーンが未設定と判定されたり、エクスポート時にボーンが認識されなくなる可能性があります。
自動変換後に保存する場合は、変換前の状態を必ずバックアップしておくことを強く推奨します。