What you suggest is basically what we are already doing. 
Our VR player base class has a function which gets called on Tick(), and repositions both the Actor’s world offset, and its ‘VROrigin’ component. This means physical world movement works in VR, and controller movement works also, but it stops players attempting to walk through VR obstacles, by simply walking in the real world.
That lot all works great.
It was the initial position which was being a pain.
I’ve solved it now, so I will describe what I did, along with what I think is a small Unreal Editor bug which really messed me up.
As mentioned above, we have code to correct position in a function called UpdateVrPosition() which gets called on Tick(). This works fine when everything is up and running, but at the beginning it may be possible that the Tick gets called before the Beginplay function has completely finished. Especially in our case as we have a timer in the BeginPlay to allow the HMD to ‘sort its life out’ before telling it to ResetOrientationAndPosition(). There are a number of ways you can fix that, such as bAllowTickBeforeBeginPlay =false.
However, we chose to allow tick, but start with it disabled, using:
PrimaryActorTick.bCanEverTick = true;
PrimaryActorTick.bStartWithTickEnabled = false;
And then turn it on once we have finished doing whatever setup we wanted in our timer callback.
In addition to ResetOrientationAndPosition(), we also reset the VROrigin and VRCameraComponent relative positions/rotations. That might not be required anymore since disabling the Tick(), but… belt and braces.
Gotta say I am NOT happy about using a timer function in this way, its the kinda cludgey hack you would expect in Javascript, not Unreal C++, but whatever, it works.
Now, lets mention the BUG which ate up a lot of my time…
As anyone who has done a bit of testing in VR knows, sometimes you put the headset on, and sometimes you leave it on the desk. It depends what you are testing.
If you were testing something like the PlayerStart not working as you wanted, you probably leave it on the desk after the 1000th time of trying to fix the code.
So, I suddenly noticed that when I wore the headset my position was WRONG, but when I left it on the desk it was CORRECT.
Instantly I assumed it was something to do with the headset sensor, and I pulled the visor apart, removed the silicon interface, cleaned the sensor, etc, etc.
Lets just skip to the TLDR;
- When NOT wearing the headset, I generally start the preview by pressing the little green ‘VR Preview’ button in the toolbar.
- When wearing the headset, I generally press a button on my streamdeck which does the shortcut keys for the same thing.
It turns out the shortcut, while running the game, IGNORES YOUR GameMode, so none of your code in the playercharacter, or playercontroller even runs.
Call me an idiot if you like, but I literally had to set up breakpoints to eventually discover that.
Anyhow, hope maybe it helps someone
(Or gives them a laugh at my expense) 