[4.9] "Reset Orientation and Position" function has inconsistent behavior with HTC Vive

Hello,

Using UE 4.9.2 launcher version, the Reset Orientation and Position function gives inconsistent results when used with the HTC Vive.

I created a minimal Bluescript in the character even graph where:

  • R key pressed event is plugged to the Exec input of Reset Orientation and Position;
  • Yaw is 0.0;
  • Options is Orientation and position.

When used with the Oculus DK2 (SDK 0.7.0.0) this works as intended: pressing “R” resets the orientation and position; pressing is several times gives the same result.

When used with the HTC Vive (runtime 1445024212) the behavior is unexpected and inconsistent: pressing “R” several times switches between two different orientations, none of them being the original orientation.

Hey Jullien,

I have just tested this using the Vive and 4.9.2 and I did run into the same issue as you reported. I have entered the following Jira ticket to track this issue and get it fixed.

UEBP-98 - [4.9] “Reset Orientation and Position” function has inconsistent behavior with HTC Vive

If you experience any more issues like this please be sure to let us know.

Thank you for the confirmation. Looking forward to the fix.

I would also be interested in seeing a solution for this issue.

I met the same problem,and i got it fixed by modifying the engine source,here is the solution:
[SteamVRHMD.cpp]

void FSteamVRHMD::CalculateStereoViewOffset(const enum EStereoscopicPass StereoPassType, const FRotator& ViewRotation, const float WorldToMeters, FVector& ViewLocation)
{
	if( StereoPassType != eSSP_FULL)
	{
		vr::Hmd_Eye HmdEye = (StereoPassType == eSSP_LEFT_EYE) ? vr::Eye_Left : vr::Eye_Right;
		vr::HmdMatrix34_t HeadFromEye = VRSystem->GetEyeToHeadTransform(HmdEye);

		// grab the eye position, currently ignoring the rotation supplied by GetHeadFromEyePose()
		FVector TotalOffset = FVector(-HeadFromEye.m[2][3], HeadFromEye.m[0][3], HeadFromEye.m[1][3]) * WorldToMeters;

		//ViewLocation += ViewRotation.Quaternion().RotateVector(TotalOffset);

 		const FVector vHMDPosition = DeltaControlOrientation.RotateVector(TrackingFrame.DevicePosition[vr::k_unTrackedDeviceIndex_Hmd]);
		//ViewLocation += vHMDPosition;
	}
}

What I did in the code above is that I comment the modificaion of the ViewLocation variable.