Constraints, source space might need "Local Space (Owner Orientation)" like Blender does
0b5vr opened this issue · comments
コンストレイントの検証中に気になった点をissueにしておきます。
以下のモデルをツイストボーンの検証用に作成したのですが:
blender-vrm-bone-with-twist-bones.zip
ツイストボーンのSourceとDestinationの回転軸が異なる場合に、現状のLocalの仕様だと回転が正しく作用されないことがわかりました。
以下は、 LeftFoot
をSourceとし、 LeftLowerLeg
以下のツイストボーン(LeftLowerLeg
と同じ回転軸)に回転を伝搬しようとした場合の図です:
three-vrm-inspector.-.Google.Chrome.2022-01-24.13-48-49.mp4
回転が想定するツイストボーンの動きよりも弱く伝搬しています。
対照に、以下は LeftLowerLeg
をSourceとし、 LeftUpperLeg
以下のツイストボーン(LeftUpperLeg
と同じ回転軸)に回転を伝搬しようとした場合です:
three-vrm-inspector.-.Google.Chrome.2022-01-24.13-53-02.mp4
Blenderにおいても動揺の問題が発生しますが、Blenderにおいては「Local Space (Owner Orientation)」というスペースを適用することで、本問題を解消することができます:
これは、Sourceの回転をDestinationの回転軸で再評価して適用するという設定であり、このようなSourceとDestinationの回転軸が異なる場合に有用に働くことがあります。
この機能がVRMのコンストレイントの仕様にも盛り込まれていると良いのではないかと思いました。
以下に、「Local Space (Owner Orientation)」を適用した状態の当該モデルのblendファイルを添付しておきます。
トカゲさんと話をして、「Local with Parent」というスペースのほうがよりフレキシブルな設定ができる可能性があるというディスカッションをしました。
このような斜めのボーンに対しては Copy Rotation (Local Owner Orientation) が Blender 3.0 で追加されるまでは、参照用の補助ボーンと Copy Rotation (Local with Parent) を用いて解決するという方法が取られていた (※1) ように考えております。
ただし、それらの挙動はある程度互換性があるものの完全には一致しなさそうで、どちらにも使い道があるように思えます。
補助ボーン + 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 の方が一般的かもしれません
Dumped TrackというのはVRMにおいては以前Aim Constraint (World-World) として定義されていたものですね。これってコンストレイントを適用する順番も重要になるってことですよね。難しい……
技術委員会内でデモを見つつ確認をし、一旦1.0では現状通りLocal to Localのみ仕様とする方針になりました。
引き続き、検証に必要なサンプル数が少ない状態ですので、検証に参加いただける方を歓迎します。
Constraintの仕様のアップデートによりclosingします。