今回は、Sequencerにおいて、CineCameraActorにCameraアニメーションをインポートした時の挙動についての確認と、その回避策の妥当性について確認させてください。
別途記入した再現手順の通り、CineCameraActorのImportで、ForceFrontXAxisを有効にした状態でインポートを行うと、Rotation-Pitch(Y)において、各キーの接線が反転してしまう問題が起きています。
[Image Removed]
この図のように、MayaとForceFrontXAxisがOFFの時(左端&右端)は、接線含めて同じ状態になります。しかし、ForceFrontXAxisがONの場合(真ん中)は、接線が反転していて正しいカーブになっていません。
インポート周りのソースコードも確認してみましたが、UE側でForceFrontXAxisの有無で明示的に接線を反転している箇所は見当たりませんでした。つまり、FFbxImporter::ConvertScene()で行っているFbxAxisSystem::ConvertScene()というFBXSDKの処理に問題がありそうに思います。
この調査結果は正しいでしょうか?
次にFBXSDKの修正は望めないと思いますので、UE側で出来る回避策が無いか調査をしました。
その結果、MovieSceneToolHelpers.cppに実装されているImportFBXTransform()において、Rotaion.Yの処理の時に接線を反転することで問題が解消できる事を確認できました。
具体的には、MovieSceneToolHelpers.cpp(3154)辺りで、Rotation.YのキーをFBXSceneからSequencerのChannelに移し替えている処理があります。
if (DoubleChannels[4].Get())
{
DoubleChannels[4].Get()->SetDefault(Rotation.Y);
ImportTransformChannelToDouble(EulerRotation[1], DoubleChannels[4].Get(), FrameRate, false, true);
}
幸い、このImportTransformChannelToDouble()関数の第4引数に、接線反転用のフラグがありました。
ForceFrontXAxisのフラグを参照して、第4引数を変更することでこの問題を回避できていますが、この回避策は妥当でしょうか?
そもそもの原因を読み間違えていたり、他に適切な修正/回避方法があれば教えていただけると助かります。
また、この問題はAnimSequenceのインポート時には問題にならないのかが少し気になってます。もし、AnimSequenceのインポート時の情報があれば合わせて教えていただけると助かります。
お手数をおかけしますが、ご回答よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
ご報告と再現プロジェクトのご提供、および非常に綿密な調査をありがとうございます。
現在開発チームに問い合わせを行っておりますので、回答までしばらくお待ちください。
また、「再現条件を別途記入」していただいたとのことですが、どちらにご記入されましたでしょうか。
EPS投稿欄の本再現手順欄や、再現プロジェクトの圧縮ファイル内に見当たりませんでしたので、念のため確認させていただけますと幸いです。
以上、よろしくお願いいたします。
[Attachment Removed]
ご回答ありがとうございます。
初回投稿時の再現手順欄に記入したと思うのですが、上手く投稿されてなかったのでしょうか。
再現プロジェクト(圧縮ファイル)は添付されているようなので、再現手順欄の内容だけ改めて書きます。
再現手順は以下の通りです。
- LevelSequenceを新規作成
- SequencerからCineCameraActorを追加
- CineCameraActorの右クリックメニューからImportを選択し、問題が起きるアニメーション(fbx)をインポートする
- インポート時のオプションでForceFrontXAxisを有効にする
- インポート後CurveEditorを表示し、Rotation-Pitch(Y)のキーを選択して接線の状態を確認する
圧縮ファイル内には、プロジェクトフォルダ直下に問題が確認できるアニメーションファイル(TEST_CAM.fbx)を用意しています。TEST_CAM.fbxで試す際は、インポート時にMatch by Name Onlyのチェックは外してください。
また、元のデータの都合から、935フレーム以降のだいぶ後ろの方にアニメーションデータが含まれているので、確認する際はその点もご注意ください。
再現プロジェクト内にはNewLevelSequenceに、2つのCineCameraActorを用意しました。
- CineCameraActor
- ForceFrontXAxisがOFFの状態で、TEST_CAM.fbxをインポートしています
- こちらのカーブは接線含めて意図通りのカーブです
- CineCameraActor2
- ForceFrontXAxisがONの状態で、TEST_CAM.fbxインポートしています。
- Rotation-Pitch(Y)のキーを選択してもらうと分かりますが、接線がカーブの方向に逆らうように付いており、反転しているのが確認できると思います。
もし、再現プロジェクトも上手く添付されていないようであればお知らせください。
一つ書き忘れていたことがあったので、追記します。
FBXの出力元はMayaで作成したデータになります。そのため、ForceFrontXAxisをONにしないとRotationが合わないため、カメラアニメーションに限らず、AnimSequenceはもちろん、SkeletalMeshなどもすべてForceFrontXAxisをONにしてインポートしていました。
ちなみに、今まで数タイトルをこの運用で進めていましたが、特に問題になったことはありませんでした。
Sequencerのこの問題も、例えば30fpsで作成して30fpsで再生していれば、補間のフレームは表出しませんし、カーブの形状を見てもキーの周辺はかなり歪みますが、カーブの勾配が急でないと中間位置のずれはかなり少ないため問題にならなかっただけかもしれません。
引き続きよろしくお願いいたします。
[Attachment Removed]
お世話になっております。
再現手順のご提供ありがとうございます。
■再現手順について
頂戴した再現手順と、ヴァニラのUE5.7.3、 TEST_CAM.fbx で試しましたところ、ForceFrontXAxisのON/OFF状態にかかわらず、(935フレーム以降であっても)キーが取り込まれないという現象が起きております。下記のインポートオプションで取り込みを行っておりますが、何かほかに設定したほうがよいものがありますでしょうか?
[Image Removed]再現プロジェクトは読めましたので、ForceFrontAxisX ON/OFFでそれぞれ作成されたカメラトラックのキー接線の違いは見えております。
■修正の妥当性について
当方で動作テストができておらず恐縮ですが、修正の方向性については正しいというコメントが開発チームから得られております。エンジン側にフィードバックしたいという意見も出てきているため、正確な修正コードを確認させていただければと思うのですが、MovieSceneToolHelpers.cpp(3154)あたりを
if (DoubleChannels[4].Get())
{
DoubleChannels[4].Get()->SetDefault(Rotation.Y);
- ImportTransformChannelToDouble(EulerRotation[1], DoubleChannels[4].Get(), FrameRate, false, true);
+ ImportTransformChannelToDouble(EulerRotation[1], DoubleChannels[4].Get(), FrameRate, ImportFBXSettings->bForceFrontXAxis, true);
}
のように変更されたという理解で合っておりますでしょうか?
■AnimSequenceのインポート時の問題
ご指摘ありがとうございます。AnimSequence のアニメーションインポートはボーンの姿勢をフレーム単位でサンプリングするという、カメラのインポートとは異なる手法を通じて行われており、ForceFrontAxisXフラグの反映も、JointOrientationMatrixという後加工用の行列を変更することで行っておりますので、今回のような問題は発生しないと考えております。
以上、よろしくお願いいたします。
[Attachment Removed]
ご回答ありがとうございます。
再現用のFBXデータについては、正しくないデータを添付してしまったようです。
改めて、FBXだけ圧縮して添付しましたので、これで確認していただけると助かります。
修正の妥当性についても確認ありがとうございます。
if (DoubleChannels[4].Get())
{
bool bNegateTangents = ImportFBXSettings->bForceFrontXAxis;
DoubleChannels[4].Get()->SetDefault(Rotation.Y);
ImportTransformChannelToDouble(EulerRotation[1], DoubleChannels[4].Get(), FrameRate, bNegateTangents, true);
}
修正コードについては、上記のようなコードにしていました。分かりやすくいったん変数には入れていますが、提示された内容と同じ修正になります。
AnimSequenceについても、確認していただきありがとうございました。影響がないということで安心しました。
もし改めて添付したFBXでも上手くインポートできないとか、他に追加情報が必要であればお知らせください。
引き続きよろしくお願いいたします。
[Attachment Removed]
お世話になっております。
コードおよびデータのご提供ありがとうございます。
頂戴したデータで正しく再現が取れ、コードで症状を修正できることを確認できました。
また、//UE5/Main/ CL51964479 (GitHubでの変更追跡はこちら)にて頂戴した修正が反映されましたのでご確認ください。
今回は貴重な情報とデータのご提供を誠にありがとうございました。
ほかにご不明点などなければ、本チケットは対応済みとしてCloseさせていただこうと考えております。
以上、よろしくお願いいたします。
[Attachment Removed]
ご回答ありがとうございます。
こちらもで該当CLが確認できました。
当面は、この回避策を適用して回避しておこうと思います。
今回も迅速な対応、ありがとうございました。
[Attachment Removed]
ご確認およびご返信ありがとうございます。
それでは本件は対応済みとしてCloseさせていただきます。
以上、よろしくお願いいたします。
[Attachment Removed]