How do I switch between 6DoF and 3DoF in the same scene?
Headset and controller
Vector3(0, 0, 0). If you switch to 3DoF, the headset and controllers are always fixed at the origin.
While in VR, if there are no other manipulations to the headset and controllers’ GameObject, you will probably see the controller’s model come out from your head and your head is on the floor. Therefore, fixed transform is still needed to keep a distance between the controllers and floor.
Pose Tracker
controllerGameObject.GetComponent<WaveVR_PoseTracker>().trackPosition = false;
Set trackPosition to true to switch to 6DoF mode.
Render
For 3DoF, set WaveVR's render.origin to WVR_PoseOriginModel.WVR_PoseOriginModel_OriginOnHead_3DoF. For details, see the SDK API’s description.
var render = WaveVR_Render.Instance; render.origin = WVR_PoseOriginModel.WVR_PoseOriginModel_OriginOnHead_3DoF;
Eye to head transform
For example, if your left eye sees an apple in front at position (0, 0, 1), the actual location of the apple in the world is:
HeadPose * EyeToHeadTransform * (0,0,1)
Assuming EyeToHeadTransform is:
| 1 0 0 -0.03 | | 0 1 0 0 | | 0 0 1 0 | | 0 0 0 1 |
and the headset's transform is:
| 1 0 0 0 | | 0 1 0 1.8 | | 0 0 1 0 | | 0 0 0 1 |
- (-0.03, 0, 1) in the head space
- (-0.03, 1.8, 1) in the world space
The apple's position can also be known from the world space and eye space by the inversed transforms.
EyeToHeadTransform^-1 * HeadPose^-1 * (-0.03, 1.8, 1)
The EyeToHeadTransform may have different values in 6DoF and 3DoF.
left eye in 6DoF | 1 0 0 -0.03 | | 0 1 0 0.05 | | 0 0 1 0.05 | | 0 0 0 1 | left eye in 3DoF | 1 0 0 -0.03 | | 0 1 0 0 | | 0 0 1 -0.15 | | 0 0 0 1 |
The 6DoF transform values change according to your headset. For 3DoF, the transform values are based on your head's rotation center where z is usually -0.15 for better a user experience.