vrm-c / UniVRM

UniVRM is a gltf-based VRM format implementation for Unity. English is here https://vrm.dev/en/ . 日本語 はこちら https://vrm.dev/
https://vrm.dev/en
MIT License
2.65k stars 426 forks source link

VRM SpringBoneのCenterに指定出来るノード階層に制約が必要そう #2053

Open FujiSunflower opened 1 year ago

FujiSunflower commented 1 year ago

概要

特定の条件のアバターでVRM SpringBoneの挙動がアプリ毎に異なる現象が見つかりました。 原因はVRM SpringBoneのCenterに指定したノード階層によるもので、VRMの仕様に制約を追加する必要があると感じました。

このアバターをSimpleViewerで読み込みます。 image

実験として、SimpleViewerのシーン上にあるVRMとVRMのHumanPoseTransferの元であるtmpをそれぞれ平行移動してみました。

ところで、Rootボーンの子階層にHipsボーンがありRootボーンと同じ階層のゲームオブジェクトをVRM SpringBoneのCenterに指定することが現在のところ可能です。この場合だと上記のどちらの方法でもスカートの激しい揺れが起こりません。Hipsボーンだけが移動するため、Rootボーンと同様にCenterのゲームオブジェクトが取り残されるからです。

追記:GenericアニメーションかHumanoidアニメーションか否かでも差が出そう。 image

また、VRoid Studioで作られたアバターにはRootボーンがありCenterとして指定されています。 この設定方法はUnityのルートモーションを想定したものと考えられ、上記2種の両方の移動方法を考慮していそうです。 image

提案

検証したようなテクニカルな設定方法が出来るとアプリ毎の挙動の差を引き起こすためVRM SpringBoneのCenterに指定出来るノード階層をHipsボーン以下の階層とする制約が必要かなと感じます。 もしくは、テクニカルな設定方法を可能とする代わりにRootボーンの有無を決めてしまう必要があるかなと感じます。 厳密な制約条件としない場合でもドキュメントに記載が必要な内容ではあると感じます。

ousttrue commented 1 year ago

vrm-0.x の仕様は、修正しない方針です。

vrm-1.0 は center に関する記述があります。

Centerノードは、そのSpringChainの0番目のJointもしくは、その祖先nodeである必要があります。 また、Centerノードには、他のSpringChainのJointノードおよびその子孫を指定することはできません。

https://github.com/vrm-c/vrm-specification/blob/master/specification/VRMC_springBone-1.0/README.ja.md#center-space

vrm-1.0 のエクスポート時に この制約外れることはお勧めでないという警告を出すことは可能です。

FujiSunflower commented 1 year ago

VRM 0系の仕様を修正しない代わりに、説明がVRMドキュメントにあるのが落とし所ですかね。

VRM 0系ではCenterに指定可能なノードに制約はありませんが、VRM 1系ではCenterに指定可能なノードに制約が設けられました

ousttrue commented 5 months ago

2314