MayaからBlenderへキャラクターを移植!レストポーズの罠

初寄稿になります。クリーク・アンド・リバー社 テクニカルアーティストチームの吉田です。
将来の夢はドラゴンの背中に乗って世界を旅することです。

今回は、Blender にキャラクターデータを持ち込んだ時に出会った不思議な現象について、調査したログを記事にしてみました。
いつかのどこかのだれか1人にでも届けば幸いです!

対象読者
・テクニカルアーティスト
・リガー、セットアップアーティスト
・Mayaのスキンバインドについて一歩踏み込んでみたい方

環境
・Maya 2024.2.4
・Blender 4.5.8

トランスフォームをクリアしたら変な姿勢になったんですけど!?

その日私は、Blender 上でボーンをどのように操作できるのかを知るために、Maya で作成したキャラクターデータを fbx 経由でインポートして使っていました。
ひとしきり触ったところで一旦区切りをつけようと、「トランスフォームをクリア」で全てのボーンを初期姿勢(レストポーズ)に戻します。

すると、あれれ?
キャラクターのポーズがインポートした時と微妙に違うポーズになっているではありませんか。
インポートした時のポーズは、Maya で fbx エクスポートしたときのポーズと同じはずなのに。

このレストポーズはどこから来たのでしょう?

調べてみよう

どのタイミングでそうなった?

まず、同データのインポート直後の状態を再現して、各ボーンの回転値を確認しました。
どうやらよく見ると、インポート時点でいくつかのボーンに回転値が入っていたようです。
だからトランスフォームをクリアしたときに知らないポーズになったんですね。

ということは、答えは Maya データ、もしくは Maya から書き出した fbx データの中に隠れていそうです。


▲ インポート直後に腕のボーンを確認すると、身に覚えのない回転値が入っています

Maya 上での Rotate は全て 0 なのに

fbx はなるべく調べたくないなあという本音を脇に抱えて、エクスポートに使った Maya データを見てみます。
エクスポート時の姿勢は間違いなく意図した通りのもの。
ジョイントの rotate も全て 0 になっています。
ということは、まず rotate の値は直接的には関係がなさそうです。

では jointOrient はどうでしょうか?
このモデルのジョイントの向きは +X が子を向くように作られているため、各ジョイントには様々な jointOrient 値が設定されています。
しかし、これが原因とも考えづらいです。
なぜなら、jointOrient 値の多彩さに対して、Blender 上でのインポート時のポーズとレストポーズの差分があまりにも微妙だからです。
ボーンによっては差分自体がなく、jointOrient が原因だとするとデータ移植の仕組みに一貫性がなさすぎるので、ここは一旦候補から外してもよいでしょう。
実際、jointOrient の値を全て rotate に移したデータでもエクスポート&インポートを行ってみましたが、Blender 上で見られる現象には全く変わりがありませんでした。

バインドポーズでもない

念のために、モデルをバインドポーズに戻してみます。
しかし見かけ上は何も変わりません。
エクスポート時の姿勢はバインドポーズときちんと一致していたようです。

ということは、バインドポーズがレストポーズの元になっているわけでもなさそうです。
いっそバインドポーズをさらに別の姿勢にしたもので実験したらどうなるでしょう?
早速キャラクターを Aスタンスにしてバインドポーズを作り直し、それを Blender に持ち込んでみます。

結果は、上腕を下げた分だけボーンにあらかじめ入っている値が大きくなる、というものでした。
実質何も変わりがなかったとも言えますが、しかしこれは逆に言えば、元の Tスタンスも Aスタンス化したものも、レストポーズは完全に一致しているということです。


▲ 上腕を 45°下げた姿勢をバインドポーズに設定したデータをインポートしたところ、X回転の値に 45°分の変化が表れました

もしかして、バインドポーズの上位概念的なバインドポーズ、みたいなものが存在する……?

正体は……

ここまでで、少なくとも普段 Maya 上で意識する「rotate」「jointOrient」「バインドポーズ」のいずれもレストポーズに直結するものではないことが分かりました。
思いついていた候補が全て外れてしまったので、ここからはスキニングやバインド周りの情報をひたすら調べました。
言葉から言葉へ飛び回り、ようやく見つけた正体は────幸い、Maya データの中で観測できるものでした。

Maya データを fbx 経由で Blender に持ち込んだ際にレストポーズとして扱われるもの、それは……

skinCluster ノードにある
bindPreMatrix
というアトリビュートです。

これがどのようなものかというと、メッシュとジョイントをバインドした時点でのジョイントの姿勢をまとめて記録するというものです。
※厳密には、各ジョイントのバインド時点のワールド行列の逆行列が記録されています。

肝心なのは、この bindPreMatrix はバインドポーズを作り直しただけでは書き換わらないということ。
bindPreMatrix を簡単に更新するには、登録したい姿勢でバインド自体をやり直すことが必要になります。

Column: バインドポーズと bindPreMatrix の役割の違い
ところで、よく似たようなものに見えるこれらは、それぞれ Maya 上でどのような役割を果たしているのでしょうか。
一言で説明すると、
バインドポーズは「ジョイントのポーズを一括で目的の姿勢にするための目印」
bindPreMatrix は「ジョイントを動かした時のメッシュ変形を計算するための情報」です。

バインドポーズは dagPose という種類のノードで、ジョイントなどの transform 情報を持つノードの姿勢を複数まとめて記録するものです。
その働きは基本的に、記録されたものの記録された姿勢を再現させるだけに留まります。
そのため、後から追加したり差し替えたりすることが容易にできます。
◆バインドポーズについて深堀りした記事はこちら!→【Maya】バインドポーズについて

他方、bindPreMatrix は skinCluster ノードに直接属するアトリビュートの一種で、スキニングされたメッシュの変形計算と密接に関わっています。
メッシュの変形計算は大まかに言えば、
「バインド時点での各頂点の位置」
「各頂点に振られているウェイト」
「バインド時点での各ジョイントの姿勢」
などの情報をもとに計算されるものです。
そしてこれらを合わせて計算するということは、当然、これらを下手にいじってしまうと変形計算の結果がおかしくなってしまうということです。

たとえば Tスタンスでバインドしたキャラクターに対して bindPreMatrix だけを Aスタンスのものに無理やり書き換えると、以下画像のような見た目になってしまいます。
「bindPreMatrix を簡単に更新するには、登録したい姿勢でバインド自体をやり直すことが必要」と上で書きましたが、これはより詳細に言えば、
「バインド自体をやり直すことで『バインド時点での各頂点の位置』と『バインド時点での各ジョイントの姿勢』を同時に書き換える」ことによって正しい見た目で更新ができる、ということなのです。

今回の出来事の結論としては、キャラクターのメッシュが少しリラックスした姿勢で作られていて、それに対してバインドとスキニングをしたデータだったため、Blender 上ではバインド時のリラックス姿勢がレストポーズとして扱われた、ということでした。
当該データのバインドポーズと bindPreMatrix の内容が食い違っていたのは、これまでこのデータを用いて作業をした際に、どこかのタイミングで bindPreMatrix と異なる姿勢でバインドポーズの作り直しをしていたためのようですね。

まとめ

  • Maya で作成したスキニング済みモデルを fbx 経由で Blender にインポートすると、bindPreMatrix に由来する姿勢がレストポーズとして現れる
  • レストポーズにおいては、バインドポーズやバインド後にいじった rotate・jointOrient の値は全て無視される

※同データを Blender 以外の DCC ツールやゲームエンジンに持ち込んだ際にどうなるかは、そのツールによります。fbx に書き込まれた情報のうち、どれを都合よく扱えるデータとして取り出すかがツールによって異なるためです。

おまけ1: Blender 上では簡単に上書きできる

キャラクターのデザインによっては、今回のケースのようなリラックス姿勢や、少し脚を開いた姿勢でモデリングを完了したいケースもあると思います。
そのようなキャラクターモデルを Blender 上で扱う場合、以下の手順でレストポーズの上書きを行うことで簡単に綺麗なスタンスをアニメーションの基準姿勢にすることができます。
Maya 上でこれを再現する場合はウェイト情報をどこかに逃がす手順が必要になりますが、それがないのはいいですね……

  1. ポーズモードで基準姿勢にしたいポーズになるようにボーンを回転させる
  2. 各メッシュに対して [モディファイアープロパティ > アーマチュア > 適用]
  3. [ポーズ > 適用 > レストポーズとして適用]
  4. 各メッシュに対して [モディファイアープロパティ > モディファイアーを追加 > アーマチュア]
  5. オブジェクト欄にスケルトンのルートオブジェクトを入力

ただし、シェイプキーが登録されているメッシュにそのままモディファイアーを適用することはできないようです。
姿勢変更の影響を受けるメッシュの中にシェイプキーつきのものがある場合は少し方法を考える必要がありそうですね。

おまけ2: skinCluster によって bindPreMatrix が食い違っているデータだとどうなる?

キャラクターにパーツを足すときのことを考えてみましょう。
想定される正しい手順としては、キャラクターをバインドポーズに戻してから追加パーツのバインドを行うと思いますが、
もしここでバインドポーズが実はバインド当時の姿勢と異なっていたら?
あるいはバインドポーズに戻すのを忘れてしまったら?

そうすると、skinCluster によって記録されている bindPreMatrix の内容が食い違っているデータが出来上がるはずです。
これを Blender に持ち込むとどうなるでしょうか?


▲ 2つのメッシュをジョイントの姿勢が異なる状態でバインドしたものを、

▲ ①をバインドしたときの姿勢でエクスポート&インポートしてみます

正解は、
いずれか 1つの bindPreMatrix だけが採用される
にもかかわらずメッシュは全てバインド時の形状が採用される!
でした。

採用されなかった bindPreMatrix と関連を持つメッシュは、整合性が取れなくなるためおかしな見た目になってしまっていますね。

▲ Maya 上では問題無いように見えていても、Blender 上ではこのとおり

Blender 以外のツールに持ち込んだ場合にどうなるかはやはり一概にいうことはできませんが、いずれにしてもこれはいわゆる「バインドポーズが複数ある状態」が生み出す諸問題の本質にも近い状態です。
Maya 以外の場所で使う予定のデータを作成する際は、バインド時の姿勢によくよく気を付けるのがよいでしょう。


Blender の勉強を始めてたまたま出会った現象で、Maya の仕様にまつわる知識がひとつ増えました。
想定外の出会いがあるからツール探検は面白いですね。
最後までお読みくださりありがとうございました。
興味深い仕様や現象を見つけたらその時はまた会いましょう。それでは!

yoshida yumi

スクリプト書き大好きリガー系TAです。
ちょうちょを追いかけるような足取りで知識を増やすタイプ。OpenMayaたのしい!

関連記事

  1. 【Maya】表示されないMELコマンドを知る方法:初心者編

    2019-11-26

  2. 【Maya】バインドポーズについて

    2026-01-27

  3. 【Maya】ローポリキャラモデリングのコツ

    2020-11-24

  4. 【命名規則】いつ決める、誰が決める

    2025-11-25

スキルレーダーチャート

テクニカルアーティスト専用
スキルレーダーチャート
どなたでも無料でご利用いただけます。

ABOUT

TECH COYOTE​

C&R Creative Studiosに所属するTECHNICAL ART TEAMが運営するテクニカルアーティストのためのまとめサイトです。
本サイトでは、ツール開発、業務効率化等について情報発信をしていきます。

COYOTE 3DCG STUDIO

C&R Creative Studios

お仕事のご依頼・お問い合わせはこちら

難易度別

RECENT TWEET

ページ上部へ戻る