初期テンプレートのサード・パーソンから条件を揃えたテスト環境を作ると、動画のようにカメラがブレたような動きをしてしまいます。
(黄色い人形はダミーです。カメラのための参照座標の目印です)
プレイヤーキャラのスプリングアームをtickイベントからset world locationを使い座標指定
プレイヤーのアニメ(動画ではジャンプの動き)に通知を仕込み、setActorRotationでプレイヤーの向きを大きく変える
このブレを引き起こさず、なおかつ振り向きのタイミングはアニメからの通知からとりたいのですが解決策はありますでしょうか。よろしくお願いします。
補足:質問画像中のプレイヤー変数はあらかじめプレイヤーポーンをキャストしたものです。
また、この現象はUE4.11では発生せず、UE4.12で発生します。
一度調べたいと思いますので、差支えなければprojectを公開してもらえないでしょうか?
PierPop
(Pier Pop)
August 6, 2016, 4:03am
5
ジャンプ時の「SetActorRotation」によってCameraBoomのRotationも変更されるのですが、
CameraBoomのRotation同期(UsePawnControlRotation = true)との前後の差分が大きい時に
大きなカメラぶれが発生していました。
差分が小さい時は大きなカメラぶれは発生しません(ぶれが小さく違和感が無いように見える)。
実装すべき内容と合致しているかは分かりませんが、SetActorRotationだとCameraにも影響を及ぼすため、
SkeltalMeshのみRotationを変更する、Cameraの同期方法を変更する等が挙げられかと思います。
Takao
(Takao)
August 6, 2016, 6:33am
6
setActorRotationをどうしても使いたいならダメですが、
Add Movement Inputではスプリングアームがアクターの回転によって動くことはないので、これを利用してみました。
Rotation Rateをものすごい高くすることで一瞬で振り向かせます。
ある程度待たないと振り向いてくれないので、Delayで少し待ってから
Rotation Rateを元に戻します。
プロジェクトの準備ありがとうございます。
少し調べてみますね。
4.11と12で色々変わっているのでこのあたりのコントロールのやり方も変わってそうですね。
原因と回避策までわかればお知らせします。
少し調べてみましたが、原因はPier Poopsさんの仰る通りだと思います。
回避策ですがカメラのスプリングアームにLagを付けてみてはどうでしょうか?
バージョンによって違いがあるのはまだわかりませんが、Lagをつけることによりカメラの回転の補正のかかり方が変わるので回避できます。
もしくはカメラの制御の方法を変える必要がありそうな気がします。
カメラ座標がキャラクターの向きでグリグリ変わることになるので、キャラクターと分離してキャラクターとカメラの位置関係を相対的に保てればなんとかなる気もします。
ご回答有り難うございます。大変参考になりました。ひとまずはユーザーのボタン入力(インプットアクション)から直接setActorRotationを使うということで一応の対策をしました。つまりはアニメーションの再生をトリガーとしてsetActorRotationするという条件を諦める形です。そうするとブレは発生しません。これが未だ不可解なのですが、詳しくはわかりませんでしょうか? よろしくお願いします。
丁寧に検証していただき、ありがとうございます。参考にさせていただきます。
lagを試しましたが回転のギャップが大きい時はやはりカメラブレが発生しているようで、残念ながら解決には至りませんでした。カメラとキャラクターを分離するのは、大幅な改変となりそうですので最終的な手段と覚えておきます。
こちらは条件を後出して申し訳ないのですが、“振り向き”は実際の実装ですとスティックを倒した任意の方向に回転させたいというものでした。add movement inputでは他の仕組みとの兼ね合いで都合が悪くなるところもあり、大幅な改変となりそうでしたので一旦置かせていただきました。ご回答有り難うございます。
Takao
(Takao)
August 6, 2016, 8:28pm
13
意外と簡単に解決する方法を見つけました。イベントが呼ばれた時に振り向かずにTickで呼べば良いのでは?と思ってやってみたらうまくいきました。
takanyan7
(takanyan7)
August 8, 2016, 2:48am
15
出る理由としては、
プレイヤーが90度回転する際、
プレイヤーの位置を中心にカメラの配置も90度回転した位置に移動し
毎フレーム開始時、定位置に戻す動作で正常にしていたと思うのですが、
アニメーションの再生をトリガーとしてsetActorRotationを実行した場合
フレーム処理後に流れ、次のフレームまで90度移動した位置に残ってしまっているのかもしれません。
その辺りが、12バージョンで順番が変わっているのかもしれません。
なので以下の方法でも修正は可能です。
Takao さんと同様に、回転動作の後にカメラを戻せば問題が解消されます。
CamMovはカメラ移動のイベントです。
Tickと回転後に処理しています。
もう一つの方法としては、カメラをデタッチしてしまう方法です。
運用に問題が有るかもしれませんが、
おかげさまで解決しました!
ありがとうございます。非常に助かりました。
原因はご指摘の通りかと思われます。
カメライベントを即座に呼び直すことで、カメラブレを無くすことに成功しました。
プログラムの改変も少しで済みました。
takanyan7
(takanyan7)
August 16, 2016, 10:15am
17
今読み返したらひどい文章だったので、書き直しました(汗