現在、プレイヤーキャラクターのメッシュをMutableへ移行作業中しております。
このキャラクターは、共通スケルトン構造の武器(以下、武器A)を装備します。
武器Aは、CopyPoseFromMeshを使いプレイヤーの動きに追従させる予定です。
しかし実装したところ、武器Aがルート位置(根本の位置)へ意図せず移動してしまいました。
そのため、期待通りに動作していません。
調査で判明した点は以下の通りです。
武器A側:ウェイトが設定された専用ボーンが存在します。
プレイヤー側:上記と同じ武器A専用ボーンが存在しますが、こちらにはウェイトが設定されていません。
Mutable導入前は、FSkeletalMeshMergeでプレイヤーメッシュを生成していました。
その当時、CopyPoseFromMeshを使用しても武器Aは想定通りの位置に正しく表示されていました。
この動作の違いがなぜ起きるのか原因を確認したところ、以下の点が分かりました。
FSkeletalMeshMergeの場合: メッシュマージ時、使用していないボーンは考慮されません。
Mutableの場合: メッシュマージ時、使用していないボーンも考慮されます。
この「使用していないボーンの扱い」の違いが問題の原因だと考えています。
Mutableへ移行したことで、プレイヤー側でウェイト未設定の武器A専用ボーンの情報が初期値で保持され、その結果、武器Aの位置に差異が出ていると思われます。
Mutableのこの挙動は、それ自体としては問題ない(仕様通り)のかもしれません。
しかし、FSkeletalMeshMergeの時のように、メッシュ側で使用していないボーンを無視してメッシュを生成したいと考えています。
(ここで言う「使用していないボーン」とは、ウェイトが設定されていない、またはメッシュと関連性のないボーンを指します。)
Mutableでこのような挙動を実現するための設定項目や、何らかの方法はありますでしょうか。
よろしくお願いいたします。
> Mutableでこのような挙動を実現するための設定項目や、何らかの方法はありますでしょうか。
スケルトンに関しては標準的なマージ処理が行われており特殊なものではありません。問題になっているのは姿勢を取り出すメインのリファレンススケルタルメッシュにありその調整が必要なのではないかと開発者よりコメントがありましたのでまず共有させていただきます。
スケルトンのマージ処理はそれぞれ USkeletalMergingLibrary::MergeSkeletons と FSkeletalMeshMerge::BuildReferenceSkeleton にありますが、影響を及ぼしている部分について調査がすんでいる部分があればご共有いただけますと幸いです。
USkeletalMergingLibrary::MergeSkeletonsの動作については入力データを調整する以外に介入する方法はないので、もしここの処理に手を加えることで動作が再現できるのであればエンジンに手を入れることになるかと思います。
> Mutableへ移行したことで、プレイヤー側でウェイト未設定の武器A専用ボーンの情報が初期値で保持され、その結果、武器Aの位置に差異が出ていると思われます。
つまり武器A専用ボーンの初期値(スケルトンに設定された位置)はルートの位置(0,0,0)にあるということでしょうか?これを適切な場所に移動させているのは特定のスケルタルメッシュということなのであればそのスケルタルメッシュと同じ姿勢を持った基本姿勢用のスケルタルメッシュをベーススケルタルメッシュとして設定することで改善が見込めるかもしれません。
ランタイムでマージされたスケルタルメッシュをエディタで開いたとき、対象のボーンはメッシュに対して未アサインのため省略されたことを示すグレーアウトした状態でしょうか?それとも白くなった状態でしょうか?まず同じ状況を作り出して動作を確認できれば具体的なことが申し上げられると思うのですが、再現が難航しています。アセットを別プロジェクトにマイグレートしたりMutableSampleをベースにして再現を行うことは可能でしょうか?
> ボーンの設定がされていない場合は初期化されて初期値になるそれがルートの位置になっていると考えての発言となっております。
武器Aのボーンの親ボーンはルートボーンで相対座標が単位マトリクスになっているような状態でしょうか?
> 一応のご連絡になりますが、合成前のプレイヤー側のメッシュの場合は灰色、武器A側のメッシュの場合は白色になります。
合成した後もグレーということは、武器Aのボーンを含むメッシュはMutableで合成していない。
ランタイムでMutableメッシュに対して武器ボーンに対するアニメーションは制御しておらず、武器スケルタルメッシュにCopyPoseFromMeshされた時には以前は「スケルトン上で確認できる位置」に移動していたがMutableではルートの位置に移動してしまうということですね。
対処として武器AのAnimBPで武器ボーンに対してアニメーションを上書きすれば想定の動きになるがこれは望ましい動作ではないという受け取りましたが、本来はどのような形で武器ボーンにアニメーションを適用させていましたか?
> アセットを別プロジェクトにマイグレートするのはオープンの場では厳しいです。
可能であれば受け渡し専用のクラウドストレージをご案内いたします。
> 武器Aのボーンの親ボーンはルートボーンで相対座標が単位マトリクスになっているような状態でしょうか?
親ボーンはプレイヤーの肘に当たる部分になります。
こちらは両メッシュともに対象のボーンは白色でアサインされているものになります。
> 対処として武器AのAnimBPで武器ボーンに対してアニメーションを上書きすれば想定の動きになるがこれは望ましい動作ではないという受け取りましたが、本来はどのような形で武器ボーンにアニメーションを適用させていましたか?
CopyPose Form Mesh を使用しておりました。
具体的に申しますと、プレイヤーのSkeletal Mesh Componenの参照をを武器メッシュ側で持たせました。
武器側のAnimBPでCopyPose Form Meshを呼びだしプレイヤーのSkeletal Mesh ComponentをSource Mesh Component ピンに接続しておりました。
現在もCopyPose From Mesh自体は使用しております。
CopyPoseの結果を Layered blend per bone を使用して実質的に無視する状態にしております。
> 受け渡し専用のクラウドストレージをご案内いたします。
承知いたしました。
社外秘の情報になりますので取り扱いご注意いただければと思います。
ご招待を送らせていただきました。メールボックスをご確認ください。
ありがとうございます、確認いたしました。
対応に時間を要する想定です。
お手数をおかけしますが、よろしくお願いいたします。
それぞれのスケルトンとスケルタルメッシュの構造をこちらでも構成できれば問題を再現できるかもしれません。
例えばマネキンのスケルトンにボーンを追加するような形でも再現が可能だったりしますか?
> 対応に時間を要する想定です。
承知しました。お待ちしております。
> 調査がすんでいる部分があればご共有いただけますと幸いです。
マージ処理に関してはそのあと特に進展がございません。
こちら、武器側のAnimBPに Layered blend per bone を使用し該当のボーンのコピーを上書きいたしました。
この対応で現状は想定した動きになりました。
ただ、根本的な解決ではないとは思うので引き続き調査もしていこうと思いますので、わかったことがあればまた連絡と考えております。
> 武器A専用ボーンの初期値(スケルトンに設定された位置)はルートの位置(0,0,0)にあるということでしょうか?
おそらく違います。
ボーンの設定がされていない場合は初期化されて初期値になるそれがルートの位置になっていると考えての発言となっております。
> ランタイムでマージされたスケルタルメッシュをエディタで開いたとき、対象のボーンはメッシュに対して未アサインのため省略されたことを示すグレーアウトした状態でしょうか?それとも白くなった状態でしょうか?
こちらは灰色になっております。
一応のご連絡になりますが、合成前のプレイヤー側のメッシュの場合は灰色、武器A側のメッシュの場合は白色になります。
> アセットを別プロジェクトにマイグレートしたりMutableSampleをベースにして再現を行うことは可能でしょうか?
アセットを別プロジェクトにマイグレートするのはオープンの場では厳しいです。