回転付与と対称化の問題、エクスポートの注意点etc


はじめに

BlenderでMMDモデルを制作しています。趣味です。

開発環境はBlederを2.83LTSから3.35LTSに、mmd_toolsを2.4.0から2.8.0に更新して現在モデルを制作しています。

開発環境のアップデートが影響したこと、しなかったこと、及び新たに発見したことについて記します。

主なテーマは以下の2つです。

  • mmd_toolsの回転付与とBlenderの対称化の問題
  • mmd_toolsのエクスポートの注意点

尚、記事の内容については正確性を保証致しません。
解説ではなく、個人のメモ、備忘録のような情報としてお読みください。

以下の環境でモデルの制作を行っています。

ソフト、アドオン
Blender3.35LTS
mmd_tools2.8.0
PmxEditor0.2.5.7
制作環境

対称化で起こる問題

以前の投稿で記したBlender2.83LTS、mmd_tools2.4.0の開発環境で起きる問題についてです。

Blender3.35LTS、mmd_tools2.8.0の開発環境でもこの問題は発生しました。

問題の概要

この問題について簡単に説明します。

  1. mmd_toolsの機能で回転付与を設定後に、Blenderの対称化を行う
  2. 対称化で作成されたボーンの回転付与の付与親は対称化されない
    (例:左足Dから対称化で作成した右足Dの回転付与の付与親は左足)
  3. 誤った付与親を変更することができない

機能の概要

自動ネーム、対称化についてです。

自動ネーム(左右)

Blender Manualを参照します。

AutoName Left/Right
Will add the “.L” suffix to all bones with a positive X coordinate root, and the “.R” suffix to all bones with a negative X coordinate root.

https://docs.blender.org/manual/ja/3.3/animation/armatures/bones/editing/naming.html

X軸で+方向に位置するボーンの名称に接尾辞「.L」を、-方向に方向に位置するボーンの名称に接尾辞「.R」を付け加えます。

今回の場合、モデルの左半身のボーンから作成していますので、該当するボーンを全て選択し、自動ネーム(左右)を実行します。

余談ですが、Blender Manualを読む限りでは、X軸0.0に位置するボーンに対して自動ネーム(左右)を実行すると、その名称に接尾辞「.」だけを付け加えるらしいです。

試してみましたが、私の環境では確認できませんでした。
3.35LTS、2.83LTSより古い版だとこういうことが起きるのかもしれません。
(Blender Manualが更新されていない?)

知らない間に加えてしまった「.」に悩まされる心配はしなくてもいいようです。

対称化

Blender Manualを参照します。

Symmetrize(対称化)
This operator will mirror the selected bones along the X axis based on Blender’s bone naming convention for symmetrical armatures, either from left to right or right to left, depending on the selection.

Bones with the opposite names that don’t yet exist will be created, and already existing ones will be overwritten.

https://docs.blender.org/manual/ja/3.3/animation/armatures/bones/editing/symmetrize.html

今回の場合、自動ネームを使用するため「.L」から「.R」のボーンを作成することになります。

余談ですが、命名規則を参照すれば、必ずしも左右について「.L」「.R」である必要はなく、他の接尾辞も有効なようです。
(試しに「_L」で対称化を実行すると、確かに「_R」で作成されました)

Examples of valid separators:

  • (nothing): handLeft –> handRight
  • “_” (underscore): hand_L –> hand_R
  • “.” (dot): hand.l –> hand.r
  • “-” (dash): handl –> handr
  • ” ” (space): hand LEFT –> hand RIGHT
https://docs.blender.org/manual/ja/3.3/animation/armatures/bones/editing/naming.html

対称化を行う理由

自動ネーム、対称化のメリットは、人体のような左右対称のモデルを制作する場合、左(右)半身のボーンを作れば他方は簡単に作成ができる点にあります。

そして、対称化はBlenderのBoneConstraintのIKに対応しています。
対称化によって作成されたボーンは、対象となるボーンが左右反転して設定されます。

名称IKのTarget
左ひざ左足IK
対称化させるボーン

名称IKのTarget
右ひざ右足IK
対称化で作成されたボーン

対称化で作成されたボーンのIKの設定は何も修正する必要はなく、そのまま対称化元と同じように機能します。

大変お手軽です。

発生する問題

回転付与についても、対称化で作成されたボーンの付与親を左右反転して設定してくれれば、と期待するのですが…。

名称付与親
左ひざD左ひざ
対称化させるボーン

名称付与親
右ひざD左ひざ
対称化で作成されたボーン

付与親は左右反転されず、また、対称化で作成されたボーンの付与親を変更できない、というのがこの問題です。
この場合で言えば、右ひざDに設定した回転付与の付与親を左ひざから右ひざに変更できない、ということです。

対称化の前に一度でも回転付与の設定を行うと、この問題が発生する可能性は上がってしまうように感じます。

  • 回転付与の設定は対称化後に行う

手間は増えてしまいますが、回転付与の設定は対称化後に行うのが無難だと思います。


_dummy_, _shadow_①

対称化の問題に関係がありそうなボーンを見つけました。

概要

回転付与を設定すると、mmd_toolsの機能で以下のボーンが自動で作成されるようです。(〇〇には回転付与の設定先のボーン名)

  • _dummy_〇〇
  • _shadow_〇〇

Blender上で回転付与等の働きを再現するために、以下のBoneConstraintが自動で設定されるようです。

  • mmd_additional_rotation
  • mmd_tools_at_dummy

これらのボーン、BoneConstraintは回転付与を削除すると消失します。

尚、_dummy_及び_shadow_ボーンは、回転付与を設定された全てのボーンに対して作成される訳ではないようです。
回転付与を設定され、かつ全ての親に近いボーンに作られる傾向にあるようですが、詳細は不明です。

実験

実験を行う理由

Blender上で回転付与を再現するために_dummy_及び_shadow_ボーンが必要なのであれば、やはり右(左)半身にもこれらのボーンが必要となるはずです。

  • _dummy_及び_shadow_ボーンは自動ネームに対応しているか
  • _dummy_及び_shadow_ボーンは対称化に対応しているか

_dummy_及び_shadow_ボーンを対称化で作成できれば、上記の対称化問題を解消できるのではないか?と考えました。

これを確かめてみたいと思います。

実験 A-1

簡単なアーマチュアを作成して実験してみました。

  1. ボーンを押し出す(全ての親、.001、.002、.003)
  2. 全ての親.002に回転付与を設定(付与親:.001)
  3. 自動ネーム

ポイントになるのは回転付与を設定した後に自動ネームを行う点です。

つまり、作成された_dummy_及び_shadow_ボーンに対して自動ネームにより接尾辞が付加されるのか?これを確かめます。

上記の作業を終えた後のアウトライナーです。

クリックで拡大できます

接尾辞「.L」は付加されていません。
_dummy_及び_shadow_ボーンは自動ネームに対応していないようです。

念のため、対称化後のアウトライナーです。

クリックで拡大できます

右半身の_dummy_及び_shadow_ボーンは作成されていません。名称に「.L」が付いていないので、当然そうかもしれません。

実験A-1の結論です。

  • 既存の_dummy_及び_shadow_ボーンに対して自動ネームは無効

実験 B-1

自動ネームの順序を入れ替えてみました。

  1. ボーンを押し出す(全ての親、.001、.002、.003)
  2. 自動ネーム
  3. 全ての親.002に回転付与を設定(付与親:.001)

自動ネーム後に回転付与を設定すれば、_dummy_及び_shadow_ボーンを「.L」が付加された状態で作ることができるはず、と考えました。

_dummy_及び_shadow_ボーンにも「.L」が付いていれば、対称化で「.R」が付いた_dummy_及び_shadow_ボーンが作成されるのではないか?
これを確認します。

上記の作業を終えた後のアウトライナーです。

クリックで拡大できます

今回は_dummy_及び_shadow_ボーンにも「.L」が付きました。

これを対称化します。

クリックで拡大できます

接尾辞「.L」が付いているにも関わらず、右半身の_dummy_及び_shadow_ボーンは作成されませんでした。

_dummy_及び_shadow_ボーンを対称化で作成することはできないようです。

実験B-1の結論です。

  • _dummy_及び_shadow_ボーンは接尾辞「.L」が付いても対称化は無効

尚、対称化で作成された全ての親.002.Rにはmmd_additional_rotationが付加されていました。
しかし、そのターゲットは_shadow_全ての親.002.Lが設定されているため、対称とは言い難いです。

結論

  • _dummy_及び_shadow_ボーンに対して自動ネーム・対称化は無効

_dummy_, _shadow_②

_dummy_及び_shadow_ボーンは自動ネーム、対称化に対応していないことが分かりました。

しかし、これらのボーンや、mmd_additional_rotation、mmd_tools_at_dummyというBoneCosntraintが回転付与と関係していることは間違いなさそうです。

これらの設定を見直すことで対称化の問題を解消できないか、試してみました。

実験 A-2

上記の実験A-1の続きです。

状況確認

実験A-1で行った作業です。

  • 回転付与を設定後、自動ネームを実行し対称化

この状況には以下の特徴があります。

  • 対称化先の回転付与に対称化元の付与親が設定されている
  • 対称化先には_dummy_及び_shadow_ボーンが存在しない
  • 対称化先にはmmd_tools_at_dummyが付加されていない

加えて、このような特徴があります。

  • 対称化元の_dummy_及び_shadow_ボーンの名称が誤っている

回転付与を設定した時点で_dummy_及び_shadow_ボーンが作成されますが。
しかし、_dummy_及び_shadow_ボーンは自動ネームに対応していないため、その名称が更新されません。

具体的には、『全ての親.002.L』に対応する_dummy_及び_shadow_ボーンは『全ての親.002』のままで残ってしまっている、という状況です。
mmd_tools_at_dummy、mmd_additional_rotationのサブターゲットもこれらのボーンが設定されてしまっています。

対称化実行前の状況(クリックで拡大できます)

対処:付与親の変更を試みる

対称化実行後の状況です。

対称化実行後の状況(クリックで拡大できます)
対称化実行後の状況(クリックで拡大できます)
試み①付与親を変更してみる

まずは単純にMMDボーンツールから対称化先の付与親の変更を試みます。

…が、やはり『全ての親.001.L』から変更することができません。
ですが、変化があった部分もありました。

付与親変更を試した後の状況(クリックで拡大できます)

新たな_dummy_及び_shadow_ボーンが左右それぞれ作成されています。

これらのボーンが関わるBoneConstraintの設定です。

BoneConstraint設定先サブターゲット
mmd_tools_at_dummy_shadow_全ての親.002.L_dummy_全ての親.002.L
_shadow_全ての親.002.R_dummy_全ての親.002.R
mmd_additional_rotation全ての親.002.L_shadow_全ての親.002.L
全ての親.002.R_shadow_全ての親.002.R

正しい設定のように見えます。
全ての親.002.Lのmmd_additional_rotationについて言えば、サブターゲットを_shadow_全ての親.002から_shadow_全ての親.002.Lに更新することができました。

試み②不要なmmd_tools_at_dummyを消去する

不気味に感じるのは、以下の点です。

  • _dummy_全ての親.002及び_shadow_全ての親.002が残っている
  • _shadow_全ての親.002のmmd_tools_at_dummyが残っている
BoneConstraint設定先サブターゲット
mmd_tools_at_dummy_shadow_全ての親.002_dummy_全ての親.002

この不要なmmd_tools_at_dummyが悪さをしているのではないか?
そう考え、このBoneConstraintを削除し、その後、全ての親.002.Rの回転付与の付与親を全ての親.002.Lから変更を試みました。

…が、それでも付与親の更新はできませんでした。

試み③組み立ての更新

mmd_toolsの組み立てで、ゴミ箱ボタンからmmd_tools由来のBoneConstraintを一旦削除し、その後ボーンボタンからBoneConstraintの再設定を行いました。

既に存在していない全ての親.002に関係する_dummy_及び_shadow_ボーンを削除することができました。

クリックで拡大できます

…が、やはり付与親の更新はできませんでした。

ここで不審な点に気が付きました。
_dummy_全ての親.002.Rの親は『全ての親.001.L』が設定されています。これは全ての親.001.Rが正しいはずです。

この設定の変更を試みました。

クリックで拡大できます

成功しました。…と、思ったのも束の間、ポーズモードを開いた瞬間に元の『全ての親.001.L』に親が戻されていました。

この設定を変更できれば、全ての親.002.Rの回転付与の付与親を更新できるのではないか?と考えましたが、試みは阻まれてしまいました。

まとめ

  • 結局、誤った付与親の変更を受け付けない
  • _dummy_全ての親.002.Rのペアレントも変更を受け付けない

実験 B-2

実験B-1の続きで同様に検証してみましたが、結論だけ言うと、実験A-2と結果は変りませんでした。

自動ネームを先に実行しているため、『全ての親.002』に関係する_dummy_及び_shadow_ボーンが作成されない、という点で違いはありました。
しかし、それ以外の点で変わるところはありませんでしたので、詳細は割愛します。

結局のところ、対称化先の回転付与が設定されたボーンについて、誤った付与親を変更できず、かつ、そのボーンの_dummy_ボーン(今回で言えば_dummy_全ての親.002.R)の親(ペアレント)を変更することができませんでした。

結論

ボーンツリーの中で、回転付与を設定されたボーンの_dummy_ボーン(今回で言えば_dummy_全ての親.002.R)が作成される場所が間違っているのが、この対称化の問題の原因ではないか、と思います。

言い換えれば、_dummy_全ての親.002.Rの親が全ての親.001.Lに設定されており、かつその変更ができないためにこの問題が起こるのではないか、と思います。

自動ネーム、対称化の実行後に、左右それぞれ回転付与の設定を行った場合のアウトライナーを例に挙げます。

クリックで拡大できます

_dummy_全ての親.002.Rの親には全ての親.001.Rが設定されていますし、ボーンツリー上の配置も正しいように思います。
この状態であれば、全ての親.002.Rの回転付与の付与親に全ての親.001.Rをすることができます。

上記の画像のような状態に調整できれば良いのだろうと思うのですが、今回私が調べた限りでは、対称化の前に回転付与の設定を行った場合、_dummy_全ての親.002.Rの親を変更する、ボーンツリー内の配置を変更することはできませんでした。

対称化の前に回転付与を設定した場合、mmd_toolsの組み立てで、すべて削除と実行をしても、_dummy_全ての親.002.Rの親や配置は必ず上述したように作成されてしまいます。

結局、全ての親.002.Rの回転付与の付与親を変更する方法は見つかりませんでした。

  • 回転付与の設定は対称化後に行う

.blendを保存する前につい作業を進めてしまうこと、やはりあると思うので、できればこの問題の解決策を見つけたいのですが、今回は発見できませんでした。


エクスポート時の注意点

mmd_toolsの機能でモデルを.pmxに変換する際、いくつか躓いた箇所についてです。

適用されるUVマップ

UVマップが複数存在する場合、Blenderで適用されているUV配置がエクスポートされる訳ではないようです。

今回試しに制作中のモデルを輸出してみたところ、リボンの部分に使用していなかったUVマップが設定されていました。
おそらくデフォルトのUVマップが優先される仕組みではないでしょうか?

使用していないUVマップは輸出前に整理しておく方が良さそうです。
(不要なUVマップを一旦削除、輸出し、.blendは保存しない、等)

メッシュのペアレント関係

各メッシュのペアレントにはNew MMD Modelが指定されている必要があるようです。
mmd_toolsの機能でエクスポートする際、New MMD Modelを親としないメッシュは.pmxに変換されないようです。

.pmxに変換されない例

下の表の状態にあると仮定します。

メッシュ名説明
ボディモデルの体New MMD Model
制服モデルの衣服ボディ

New MMD Modelから見て、制服は子の子に当たります。
この状態でエクスポートを行うと、以下のような結果になります。

  • New MMD Modelを親とするボディは.pmxに変換される
  • New MMD Modelを直に親としない制服は.pmxに変換されない

具体的には、制服が失われた状態(モデルが裸)でエクスポートされてしまいます。

メッシュの取り付け

mmd_toolsの機能でメッシュの取り付けを実行すると、全てのメッシュの親にはNew MMD Modelが指定されます。
New MMD Modelを親として設定したメッシュは、エクスポート後、PmxEditorの材質タブに表示され、テクスチャ画像の指定等が可能です。

ですが、予めメッシュにNew MMD Model以外の親を指定していた場合、メッシュの取り付けを実行しても更新はされず、親の変更は行われないようです。

まとめ

  • .pmxに変換するメッシュの親にはNew MMD Modelを指定する

親が未指定の状態であれば、mmd_toolsメッシュの取り付けを実行することで、問題なく全てのメッシュの親にNew MMD Modelが設定されます。

ちなみに、ボディと制服を結合してしまえば、メッシュ自体は.pmxに変換は可能です。しかし、材質タブには制服のシェーダーの設定が引き継がれないようで、テクスチャ画像の指定等が出来なくなります。

PmxEditorの扱いに明るい方であれば、材質の再設定が可能なのでしょうが、おそらく作業が増えてしまうので、何か理由がないのであれば、メッシュの親にはNew MMD Modelを指定するのが良いと思います。


その他

作成作業中に気になった点について記します。

日本語入力

Blender3.35LTSでは日本語入力に対応しています。

以前の2.83LTSの時は、ボーン名を日本語で入力すると、変換時に先頭の英字が残ってしまい、ちょっと不便でした。
しかし、3.35LTSではこの問題は解消されており、ボーン名の日本語編集がとても楽になりました。

Tex:に入力するパス

PmxEditorの材質タブでTex:を指定する際、テクスチャ画像は.pmxと異なるディレクトリに置かれていても読み込まれます。
(例:C:\Users\user001\Documents\texture\tex_body.png)

しかし、MMDでモデルを読み込む場合、これは問題があるようです。
MMD上ではキャラがデフォルトの質感で表示されており、テクスチャ画像が読み込まれていない様子でした。

  1. .pmxファイルと同じディレクトリにテクスチャ画像をCopy&Paste
  2. PmxEditorの材質タブでTex:の指定を修正

上記の手順でこの問題は解消しました。

配布されているモデルを参考にさせて頂けば、DLしたフォルダの構成は基本的にテクスチャ画像またはその画像フォルダは.pmxファイルと同じディレクトリに置かれています。
それに合わせておくのが無難ではないか、と思います。


終わりに

今回は以上です。読んで下さった方、ありがとうございました。

サイト名、作品名URL参考にした日付
Blenderhttps://www.blender.org/2022/12/11
Blender Manualhttps://docs.blender.org/manual/ja/3.3/index.html2023/6/1
3Dミクを躍らせるツールを自作してみた(説明前編)https://www.nicovideo.jp/watch/sm24200252023/6/19
UuuNyaa/blender_mmd_toolshttps://github.com/UuuNyaa/blender_mmd_tools2022/12/11
とある工房https://kkhk22.seesaa.net/2022/12/11
参考URL

comment