お世話になっております。
コードを確認した所、たしかに FCameraCutPreRollExecutionToken::Execute()
における IStreamingManager::Get().AddViewSlaveLocation()
の引数には CameraCutトラックのCameraBindingIDに指定されたActorの座標が渡されるため、PreRoll時点でそのActorが動いている場合はご報告頂いたような問題が発生する可能性があります。
LevelSequenceの構造やカメラの動かし方により細かい部分は変わる可能性はあると思いますが、本問題を解決する方法として以下の方法が考えられます。
-
IStreamingManager::Get().AddViewSlaveLocation()
を直接呼ぶ -
FMovieSceneCameraCutSectionTemplate
のCutTransform
を活用する
前者はエンジン改造が不要なシンプルな方法です。また、Event Trackから呼び出すようにすれば対応がSequencer上で完結するというメリットもあります。しかし、 AddViewSlaveLocation
を呼ぶようのトラックの追加や AddViewSlaveLocation
に渡す座標の調整が必要になります。自動化できる部分はあるかとは思うのですが、もし全Level Sequenceにその対応を入れる必要がある場合はあまり現実的ではないかもしれません。
後者に関しては、 UMovieSceneCameraCutSection::GenerateTemplate()
における実装を改造することになります。この関数内では以下の処理が行われています。
- CameraBindingIDに指定されたActorが そのCameraCutトラックを持つLevelSequence に追加(Bind)されているか確認(MasterScequenceにBindされているCameraを指定している場合はここで弾かれます)
- 追加されている場合、そのActorがTransformトラックを持つか確認
- もし持っている場合、そのTransformトラックのキーのデータ( FTransform )を
FMovieSceneCameraCutSectionTemplate
の CutTransform にわたす
そして、CutTransformに値が入っている場合はそのLocationが IStreamingManager::Get().AddViewSlaveLocation()
に渡されることになります。
既存のLevel Sequenceに出来るだけ変更を加えたくない場合は、上記の部分の実装を変更することなるかと思います。実際にどのように変更するのかに関しましては、はじめに申し上げた通り LevelSequenceの構造やカメラの動かし方によって変わってくるかと思います。
まずは上記の情報を元に今後の対応についてご検討いただけますと幸いです。その過程でご不明な点などありましたらご質問いただけますと幸いです。
よろしくお願いいたします。