Retarget#

骨格とは#

  • Joint の集合。

  • 各 joint の初期姿勢での位置。

  • 各 joint の初期姿勢での回転。

  • 本記事では ヒューマノイド 骨格 のみを扱います。

ポーズとは#

  • 各 joint の初期姿勢からの回転差分。

  • root joint の初期姿勢からの移動。

  • 本記事では root(hips) のみが移動し、他の joint は回転のみとします。

Retarget とは#

  • 体格、初期姿勢が異なるヒューマノイド間で同じ姿勢になるようにポーズを変換する。

Joint から Human bone への拡張#

  • すべてのjoint を head-tail のペアにしてロール軸を確定。

  • 追加のupベクトルも明示することで3次元姿勢を一意にする。

ボーンが 人間の骨 と解釈できるようにする。

曖昧なTPose#

  • TPose から初期姿勢でのヒューマンボーンの向きが だいたい わかる

故に TPose に変換してから同じ Pose を適用することで同じ姿勢ということにしてた。 TPose 時に

  • 親指が斜め

  • 肩の上がり下がり具合

  • 足が内股、蟹股、開き具合

  • 猫背、反り腰

等の TPose 時の個体差が混入する。

厳格な TPose の定義を作ろう#

TPose から ヒューマンボーン の向きを確定できるように作った。

ヒューマンボーン

これではモデルの個性が失われるのでは ?#

  • 曖昧TPose から 初期姿勢厳格TPose(体格) を分離している。

  • 曖昧TPose から 厳格TPose への差分を pose として得ることができるのでこれを加味すればよい(たぶん)。

  • ポーズに姿勢の個性が入っているか否かで切り分けできるかもしれない。

  • アプリ内で内部変換用に使うもので、この状態でエクスポートすることは想定していません。

  • リターゲット元と先、双方で 厳格TPose 使うか否かの判断が要るかもしれない。

    • 元が比較的リアルな人間に近いモデルならば、ポーズから初期姿勢の影響を除去してクリーンになるような気がする。

    • 人形から逸脱している場合は 曖昧TPose 差分の方が良いでしょう。

    • 同じことが先にも言えそう。

姿勢は、骨格とポーズの組 で表される#

例えば、mmd の vpdポーズを厳格TPose化する例

pmd + vpd
= (pmd - pmdの姿勢の個性) + (vpd + pmdの姿勢の個性)
= 厳格TPoseに変換されたpmd + 厳格Tposeに対するポーズ

という感じを想定している。

骨格とポーズのどちらかに 姿勢の個性 が入っていればよくて、 厳格TPose になる前は、骨格に 姿勢の個性 が含まれていた。 指に関しては 厳格TPose を通したほうが制御しやすいのではないか。

同体格に対するリターゲット#

同じ体格で 初期姿勢, ローカル軸 の座標変換を行う。 リターゲットシステムに暗黙に含まれるという感じになるかもしれない。 本記事では、リターゲットに含めないことにしたい。 変換と呼ぼう。

体格差に対するリターゲット#

狭義のリターゲット。 体格差のある骨格にポーズを転送すること。

本記事ではポーズを無加工で、元の厳格TPose から 対象の厳格TPose へとコピーすることを想定しているが、 接地のために hips のだけは、初期姿勢での高さを基準に位置をスケールすることを想定している。

digraph tpose { graph [ rankdir = LR ]; src -> src_tpose [ style = "dashed", label = "座標変換" ]; src_tpose -> dst_tpose [ label = "体格差retarget" ]; dst_tpose -> dst [ style = "dashed", label = "座標変換" ]; }

いわゆるリターゲットでは単純コピーだけではなくて IK を用いるなどして、 いい感じに体格差を吸収しようとするが、それは今後の課題。 本記事では、リターゲット時のポーズ補正の基盤として、何をもって同じ姿勢と見なすかという基盤を整理する。

厳格Tpose を介した retarget まとめ#

  • 厳格TPose は 曖昧TPose や Aスタンスからプログラムで機械的に作れる。

    • 納品物は曖昧TPoseでよい。

    • Aスタンスでも良い。

    • どんなポーズでもよいか?

      • ヒューマンボーンの割当がわかればよい。

      • 左右非対称であるとかメカニムの0ポーズはやめたほうがいい気はする。

      • 曖昧TPose が 骨格の姿勢の個性 を持っている。

  • すべてのヒューマンボーンの向きを 曖昧さ を除いて確定させる。

    • 親指が斜め、指が軽く曲がっている、足の内股具合、などを取り除く。

    • 厳格TPose == ヒューマンボーンの向き。

  • 曖昧だった親指を補正する余地が生まれる。

    • プログラムからの入力ポーズが厳格TPoseに対してずれている、そもそも無理な方向に可動している(親指の第2, 3関節に対して yaw, roll してる)。

    • 受け入れ側のモデルのロール軸が厳格TPoseに対してずれている。

    • 切り分ける。

../_images/thumb.gif

他モデルリターゲット例。親指の補正(ポーズあるいは骨格)を実験する予定。#

  • 厳格TPose に対するポーズ(回転差分)を、ポーズの標準フォーマットにできるのでは?

    • 便利な bvh。

    • mmd とは路線が異なる。mmd はリグに対するキーフレームアニメーションなのでレイヤーが異なる。

      • FK のポーズが想定されるので下のレイヤー。

  • 厳格TPose を作るのに、ヒューマンボーンの先端を示す empty joint が追加で必要(head, toes, 各指)

  • 親指などの斜めなボーンを厳格TPose化する際に、ポールターゲットもしくはローカル軸を使うというヒント情報が欲しい。

    • 例えば vc であればアバターをロードしたあとで、ユーザーが自ら、親指のロールをGUIで設定することも可能だと思う。

    • vroid の指や足が変になる問題。

後で#

座標変換とリターゲットの2本立て。

  • リターゲットは、やってみたら問題は出てくるであろう(想定される人体からの逸脱)。

    • ある程度リアルな人体を要求するかもしれない。

    • BVH が使える範囲では有効かな。

    • リターゲットの設定を自動化できない問題と同じで、ユースケース次第。

    • IK等を追加する基盤にはなると思う。

現状、まじめにリターゲットしてないからこそ、なんとなく動いている気がしてきた。 曖昧TPose は、わりと合理的である。

姿勢の個性(Retarget)#

曖昧TPose と 厳格TPose の差分を姿勢の個性と呼べそう。 極端なデフォルメが含まれる場合に考慮が必要かもしれない。

たとえば、人体でやりすぎなレベルで腰が反っているモデルは、その反りを残すべきだ。 手足指のような棒状(limb)の部位や首頭は厳格TPoseで大丈夫なことが多いと思う。 今は モーションキャプチャー + 比較的リアルな骨格 を想定しているので、姿勢の個性が少ないこと(モーキャプしたときに中の人が再現できるレベル)を想定している。

  • 部分的に 厳格TPose を適用する

  • 厳格TPose を使わないフラグ

    • 入力ポーズに厳格TPoseとの差分を乗算するのと同じ意味(たぶん)

部位

memo

首, 頭

厳格TPoseでいいと思う

肩、上腕、指

厳格TPoseでいいと思う

hips, spine, chest

元骨格がすごいモデル立ちみたいなのだと 厳格TPose は向いてないかもしれない。

upperLeg, lowerLeg

厳格TPose でいいと思う

  • 厳格 TPose は、曖昧 TPose からの初期姿勢と、ローカル軸の変更。

    • ロール軸が一致してほしい

    • 変な方向に曲がると気付かれやすい

    • 膝、肘、指

    • 逆に胴体には必要ないかもしれない