If you allow translation or rotation of the initial starting point to move the Vive headset away from world (0,0,0), you need to compensate for that in your controller code.
At one point we were letting the user rotate the world start position via the spawn point, but that proved not that useful so we ripped that out. Some bits of that code are still there though.
We haven’t had any problems with it once we did this however.
This is the Tick code we use for each vive controller. It sets the controller in world space relative the Player Pawn.
(Note: as I said this does not currently compensate if the initial pawn is rotated. You can support that, we just aren’t right now).
FTransform playerTrans = FTransform::Identity;
if (UWorld* World = GetWorld())
if (APlayerController* PlayerController = World->GetFirstPlayerController())
if (APawn* Pawn = PlayerController->GetPawn())
playerTrans = Pawn->GetTransform();
FVector offset = playerTrans.GetLocation();
FRotator rotation = playerTrans.GetRotation().Rotator();
if (USteamVRFunctionLibrary::GetTrackedDevicePositionAndOrientation(ControllerId, resPos, resRot))
Position = resPos + playerTrans.GetLocation();
Orientation = resRot;