I had the same problem, btw it’s not exclusive to VIVE, starting from 4.20 unticking bLockToHmd disables LateUpdate which introduces a noticeable lag. The best workaround over this is to create a new class that inherits ‘UCameraComponent’ and override ‘GetCameraView’ function with this code:
void UCameraComponent::GetCameraView(float DeltaTime, FMinimalViewInfo& DesiredView)
{
if (GEngine && GEngine->XRSystem.IsValid() && GetWorld() && GetWorld()->WorldType != EWorldType::Editor )
{
IXRTrackingSystem* XRSystem = GEngine->XRSystem.Get();
auto XRCamera = XRSystem->GetXRCamera();
if (XRCamera.IsValid())
{
if (XRSystem->IsHeadTrackingAllowed())
{
const FTransform ParentWorld = CalcNewComponentToWorld(FTransform());
if (bLockToHmd)
{
XRCamera->SetupLateUpdate(ParentWorld, this, false);
FQuat Orientation;
FVector Position;
if (XRCamera->UpdatePlayerCamera(Orientation, Position))
{
SetRelativeTransform(FTransform(Orientation, Position));
}
else
{
ResetRelativeTransform();
}
}
XRCamera->OverrideFOV(this->FieldOfView);
}
}
}
if (bUsePawnControlRotation)
{
const APawn* OwningPawn = Cast<APawn>(GetOwner());
const AController* OwningController = OwningPawn ? OwningPawn->GetController() : nullptr;
if (OwningController && OwningController->IsLocalPlayerController())
{
const FRotator PawnViewRotation = OwningPawn->GetViewRotation();
if (!PawnViewRotation.Equals(GetComponentRotation()))
{
SetWorldRotation(PawnViewRotation);
}
}
}
if (bUseAdditiveOffset)
{
FTransform OffsetCamToBaseCam = AdditiveOffset;
FTransform BaseCamToWorld = GetComponentToWorld();
FTransform OffsetCamToWorld = OffsetCamToBaseCam * BaseCamToWorld;
DesiredView.Location = OffsetCamToWorld.GetLocation();
DesiredView.Rotation = OffsetCamToWorld.Rotator();
}
else
{
DesiredView.Location = GetComponentLocation();
DesiredView.Rotation = GetComponentRotation();
}
DesiredView.FOV = bUseAdditiveOffset ? (FieldOfView + AdditiveFOVOffset) : FieldOfView;
DesiredView.AspectRatio = AspectRatio;
DesiredView.bConstrainAspectRatio = bConstrainAspectRatio;
DesiredView.bUseFieldOfViewForLOD = bUseFieldOfViewForLOD;
DesiredView.ProjectionMode = ProjectionMode;
DesiredView.OrthoWidth = OrthoWidth;
DesiredView.OrthoNearClipPlane = OrthoNearClipPlane;
DesiredView.OrthoFarClipPlane = OrthoFarClipPlane;
// See if the CameraActor wants to override the PostProcess settings used.
DesiredView.PostProcessBlendWeight = PostProcessBlendWeight;
if (PostProcessBlendWeight > 0.0f)
{
DesiredView.PostProcessSettings = PostProcessSettings;
}
}