SetComponentTransform() の中の SetRelative???_Direct() の意味を教えてください。

レベルシーケンスのトランスフォームトラックでシーンコンポーネントを移動させるとき、

Engine/Source/Runtime/MovieSceneTracks/Private/MovieSceneTracksCustomAccessors.cpp

の中の

void SetComponentTransform(USceneComponent* SceneComponent, const FIntermediate3DTransform& Transform)

という関数が使われると思います。

こちらの関数の中に

SceneComponent->SetRelativeLocation_Direct(Translation);

SceneComponent->SetRelativeRotation_Direct(Rotation);

という2行があるのですがこれはどういう働きをするものでしょうか?

<br/>

そのすぐ上の

SceneComponent->SetRelativeTransform(NewTransform, false, nullptr, bIsSimulatingPhysics ? ETeleportType::ResetPhysics : ETeleportType::None);

でシーンコンポーネントの移動自体はしているのでこの2行は無くても良さそうに見えるのですが違いますでしょうか?

試しにこの2行を消してみましたが違いは判りませんでした。特殊な条件下で違いが出たりするのでしょうか?

<br/>

<br/>

問題がなければ、この2行は消して、

SceneComponent->SetRelativeTransform(NewTransform, false, nullptr, bIsSimulatingPhysics ? ETeleportType::ResetPhysics : ETeleportType::None);

の方だけにして、こちらをスイープ移動にしたいと思っています(上記の2行があると、ここをスイープ移動にしても意味が無いです)。

再現手順

SetRelativeTransformはスイープに伴うオーバーラップの判定や子コンポーネントへの座標の伝播、OnUpdateTransformの送信など様々なサイドエフェクトを伴います。

それに対してSetRelativeLocation_DirectやSetRelativeRotation_Directは、それらのサイドエフェクトの一切を除外し直接プロパティの座標をセットします。

MovieSceneTracksCustomAccessors内のSetComponentTransformでのSetRelativeLocation_Directの呼び出しはそのコードの前のコメントにあるように

// Force the location and rotation values to avoid Rot->Quat->Rot conversionsシーケンサーではオイラー角(FRotator)で管理されている値が一旦クォータニオン(FTransformの内部はFQuat)​に変換されSetRelativeTransform内部で再度FRotatorに再変換されており少なからず誤差が発生します。それを回避するために​再度呼び出しを行っています。

動作を変更しスイープ移動に対応する場合には確かにスイープの意味が無くなってしまうので上記の再変換を承知のうえで適用いただけるとよいかと思います。