[UE4]CableActor Slomo挙動検証

概要

UE4にて、Time Dilation制御でのSlomo演出を行う際に

CableActorが意図しない挙動を示すことがある。その原因と対策について述べる。

基本的には、Substep Timeプロパティの扱いが焦点になる。

検証動画はこちら。

検証内容

左のケーブルはコマ落としのようになる問題が再現するもの。

中央のケーブルは単にSubstep Timeを短くしたもの。

右のケーブルはCableActorを拡張実装し、Substep TimeにTime Dilationを適用させたもの。

下記パラメータは共通。

・ケーブルの始点と終点の距離:100

・Num Segments:10

・Cable Length:200

動画の環境は60FPS(DeltaTime≒0.016)で動作させている。

スロー演出時、Global Time Dilationを0.1に設定している。

この時、Deltatime≒0.0016となる。

問題点

CableActorの物理挙動は、PhysXに依らない独自実装になっている。

実行環境のDeltaTimeに関係なく、Substep Timeが経過しないと質点の座標が更新されない為、

スロー演出を行った場合に(DeltaTime < SubstepTime)の条件を満たすとコマ落としのような挙動になる。

→デフォルト値のSubstepTime=0.02では、60FPSで動作させると

おおよそ6フレームに1回ほど座標更新されないが、この程度ならほぼ気にならない。

対策

・Substepを短くする(中央のケーブル)

・Pros

・実施が簡単

・挙動も安定

・Time Dilation制御の有無にかかわらず一定の負荷になる

・Cons

・短くしたSubstepよりもさらにスローにされると問題が再発する

・標準のCableActorだとSubstep Timeが0.005までしか下げられない為、

動画では、中央のケーブルも若干コマ落とし状態になっている。

・そこまでスローにしない環境なら問題にならない。

・常時、計算負荷が向上する

・どの程度Cable Actorを使うかにもよるが、今日の計算機では問題にならなさそう

・Substep Timeを可変にする(右のケーブル)

・Pros

・非スロー時の計算負荷は従来通り

・言い換えると、非スロー時の挙動は従来通り

・後付けでスロー演出の導入が決まっちゃった場合などは利点になる

・どのような時間倍率でも対応できる

・Cons

・C++で拡張する必要がある

・計算負荷が一定にならない

・スロー時のみ計算負荷が増える

・シミュレーション幅の変化となるため、時間制御の前後で挙動が変わる

・特にSolver Iterationが小さい場合に顕著

結論

目立ったカクつきを直すだけならSubstep調整にとどめておき、

もしCableActorの処理負荷が問題になるようであれば

C++での拡張を視野に入れるのが良さそう。

以上