コントロールリグかポーズアセットで手を握る機能をつくりたい

実現したいこと

UE5.1でコントロールリグまたはポーズアセットを使って指を握る仕組みをつくりたいです。

前提

VRゲームを制作していて、デバイスはOculus Quest 2を使っています。
フルボディIKでキャラクターの動きがHMDやコントローラに沿って動くようになっていて、そこに手を握るアニメーションを追加したいです。

例えば、Oculus Touchのトリガーの入力があったら人差し指を握りこむというアニメーションをしたいです。
また、なるべくUEスケルトン(UE4版)の他のキャラクターでも使いやすいような実装にしたいです。

試したこと

コントロールリグとポーズアセットの2通りで試しましたがうまくいきませんでした。

①ポーズアセット
以前、4.27のVRプロジェクトでポーズアセットを使って実装できたので同じように実装してみました。指を握るようなポーズをつくり、アニメーションBPでコントローラ入力の値をそのポーズのウェイトに設定するという仕組みです。
しかし、5.1ではうまくいきませんでした。

フルボディIKと共に使えるようにするためにポーズアセットをAddictiveにしなければならないのですが、Addictiveに設定するとポーズ全体がおかしくなってしまいます。

下の画像の1枚目はデフォルトのポーズからポーズアセットを作成しAddictiveにした状態です。デフォルトのポーズなのでウェイトを変えても何も変化はないはずですが、2枚目のようにボーン全体に変化があります。
UE4.27ではこうはならなかったので、おそらくバグではないかと思うのですが解決方法は見つけられませんでした。


UE4.27で作ったポーズをインポートするとAddictiveでも想定通り指だけが曲がるようなポーズになりますが、アニメーションBP側で使えません。
どちらのスケルトンもUE4マネキンスケルトンベースですしCompatible Skeletonsを設定していますが利用できないのです。
Modify Curveノードを右クリックしてAdd Curve Pinからポーズを追加しようとしても該当するポーズ名(ウェイト名?)が見つかりません。
ポーズでないアニメーションは問題なく共有できているのですが。

②コントロールリグ
指のボーンを回転することで手の握りを実現できないかと思い試してみたのですがうまくいきませんでした。
Weightが0または1のときには問題ないのですが、間の値のときには画像のように変な方向に曲がってしまっています。

回転軸などを制御していないためこのような挙動になってしまっているのだと思うのですが、うまく手のひら側に回転させる方法がわかりませんでした。

下の画像はコントロールリグのノードグラフです。
画像1枚目の左側をみるとわかる通り、手(hand_r,l)から指先までのボーンからコントロールをつくり、指コントロールをそれぞれ回転させて目標地点としています。

UpdateFingersは指のコントロール配列とウェイトを受け取り、初期地点の回転から目標地点の回転までInterpolateして指ボーンの回転をセットする関数です。
(間違ってUpdateFingers関数のSetRotation - BoneのWeightをセットしてしまっていますが、InterpolateのTだけにセットするのが正しいです。結果は変わりません。)

Forward Solve


UpdateFingers関数

いろいろと試してみたのですがうまくいかなかったのでアドバイスをいただけないでしょうか。よろしくお願いします。

手元では1の問題は再現しませんでした
UE5では多くの浮動小数点数がdoubleになった影響で、細かい誤差が出る可能性がありますが、少なくともこちらの手元では問題なくAdditiveポーズを作成できています

ModifyCurveのについてはこちらでもうまくいきませんでした
Curve名の方はSkeleton側の持ち物になるようなので、CompatibleであってもAnimBPに紐づいたSkeletonが違う時点で持ってこれないように思います
CompatibleはあくまでもBone構造に互換性があるかどうか、という視点のようです

現時点ではCompatibleSkeletonでPoseAssetの共有はできないようですね
これがバグであるかどうかは判断が付きませんが、どちらかというとバグよりな気がします
少なくともAssetBrowserには出てきてしまっているので…

ControlRigに関してですが、GlobalSpaceを使用するのは適切ではありません
何かしらのアニメーションを流したり、対象より上のBoneを動かしてしまうと、当然BoneやControllerのGlobalTransformがずれてしまうので、結果的に思い通りになりません
FKとして動作させるのであれば、LocalSpaceで動かすほうが良いと思います

あと、Warningはなるべく対応したほうが良いでしょう

1 Like

@T_Sumisaki
新しくプロジェクトをつくって新しくAddictiveのポーズをつくってみましたが再現できませんでした。また、現在作業を進めているプロジェクト内にあるTPPテンプレートのUE4マネキンでもこの問題はおこりません。しかし、なぜか使用しているUE4マネキンでは必ずこの問題が発生してしまいます。
使用しているマネキンは購入したアセットについてきたもので、おそらくこのスケルトンに問題があるのではないかと思うのですが、一見しただけでは同じに見えて解決方法はわかりませんでした。

コントロールリグですがLocalスペースにするとうまくいきません。
対象のコントロールの親をたどると画像にある通りグローバルなnullなので、Localにしてしまうとプレビューに表示されている場所に指が移動しません。

WarningですがRig Element Key ArrayをFor EachでまわしてGet Transformを使うと出てしまうもので機能的には問題なさそうです。TPPテンプレートのCR_Mennequin_Bodyでも同様のWarningが出ています。

Basic FABRIKで指を曲げられないかと試してみましたが、これだと思ったよう指を折り曲げるのが難しいので、なんとか回転のみでできたらいいのですが。

手元で試してみましたが、GlobalSpaceでもLocalSpaceでも、関係する全てで条件が揃っていれば問題ないようです

ただ、 青のRotationはQuarternionである、ということを意識しておかないと、特定の角度になったときに反転する場合があります
Interporateで処理すると中間値が好ましくない値になることもあります


手法と考え方は違いますが、おそらくこんな形でも良いような気がします
ユースケースに合致するかはわかりませんが…

@T_Sumisaki
同じように組むことで実現することができました!ありがとうございます。