vrm-c / vrm-specification

vrm specification
235 stars 37 forks source link

Constraints, source space might need "Local Space (Owner Orientation)" like Blender does #347

Closed 0b5vr closed 2 years ago

0b5vr commented 2 years ago

コンストレイントの検証中に気になった点をissueにしておきます。

以下のモデルをツイストボーンの検証用に作成したのですが:

blender-vrm-bone-with-twist-bones.zip

ツイストボーンのSourceとDestinationの回転軸が異なる場合に、現状のLocalの仕様だと回転が正しく作用されないことがわかりました。

以下は、 LeftFoot をSourceとし、 LeftLowerLeg 以下のツイストボーン(LeftLowerLeg と同じ回転軸)に回転を伝搬しようとした場合の図です:

https://user-images.githubusercontent.com/7824814/150723894-67f67bee-b9c0-4548-ad95-416a99d09cf2.mp4

回転が想定するツイストボーンの動きよりも弱く伝搬しています。

対照に、以下は LeftLowerLeg をSourceとし、 LeftUpperLeg 以下のツイストボーン(LeftUpperLeg と同じ回転軸)に回転を伝搬しようとした場合です:

https://user-images.githubusercontent.com/7824814/150724057-8f181015-0d94-4d8c-8e19-862ddd9e5148.mp4

Blenderにおいても動揺の問題が発生しますが、Blenderにおいては「Local Space (Owner Orientation)」というスペースを適用することで、本問題を解消することができます:

image

これは、Sourceの回転をDestinationの回転軸で再評価して適用するという設定であり、このようなSourceとDestinationの回転軸が異なる場合に有用に働くことがあります。

この機能がVRMのコンストレイントの仕様にも盛り込まれていると良いのではないかと思いました。

以下に、「Local Space (Owner Orientation)」を適用した状態の当該モデルのblendファイルを添付しておきます。

blender-vrm-bone-with-twist-bones.zip

0b5vr commented 2 years ago

トカゲさんと話をして、「Local with Parent」というスペースのほうがよりフレキシブルな設定ができる可能性があるというディスカッションをしました。

TokageItLab commented 2 years ago

このような斜めのボーンに対しては Copy Rotation (Local Owner Orientation) が Blender 3.0 で追加されるまでは、参照用の補助ボーンと Copy Rotation (Local with Parent) を用いて解決するという方法が取られていた (※1) ように考えております。

スクリーンショット 2022-01-24 20 56 43

ただし、それらの挙動はある程度互換性があるものの完全には一致しなさそうで、どちらにも使い道があるように思えます。

補助ボーン + Copy Rotation (Local with Parent) 方式では補助ボーンにオフセットを持たせていると解釈すると、VRM Constraint の Rotation Offset 機能がそれに代替しうるのではないかと考えられるので (未検証)、目下必要なのは Copy Rotation (Owner Orientation) ではないかと考えております。

また、VRM Constraint の Rotation Offset は補助ボーンと比べると視覚化や GUI での制御が難しそうなので、代わりに Copy Rotation (Local with Parent) を実装するのも方向性としてはありなのではないかと思いました。


※1: 補助ボーンと Copy Rotation (World) & Dumped Track の方が一般的かもしれません

0b5vr commented 2 years ago

Dumped TrackというのはVRMにおいては以前Aim Constraint (World-World) として定義されていたものですね。これってコンストレイントを適用する順番も重要になるってことですよね。難しい……

0b5vr commented 2 years ago

技術委員会内でデモを見つつ確認をし、一旦1.0では現状通りLocal to Localのみ仕様とする方針になりました。 引き続き、検証に必要なサンプル数が少ない状態ですので、検証に参加いただける方を歓迎します。

0b5vr commented 2 years ago

Constraintの仕様のアップデートによりclosingします。