Default camera scripts do not account for Camera.HeadScale

Reproduction Steps

1. Open an empty place in Studio with VR enabled
2. Play solo
3. In Studio, manually set Camera’s HeadScale property to something big e.g. 30

Expected Behavior

The vignette used for reducing motion-sickness should have the correct size and be functioning correctly.

The camera should have a good view of the character. In third-person mode the camera should probably zoom out some distance based on the HeadScale to prevent the character from getting too close to the headset’s eyes and becoming incoherent. The part the default 2D UI is being projected on to should have a stable position so that the UI is usable.

Actual Behavior

The vignette used for reducing motion sickness has not been resized and its distance from the center of the play area does not account for HeadScale. (So we can just see a small textured rectangle.)

When the camera is in third-person mode the player character is too close to the headset’s eyes. The part the default 2D UI is projected on seems very jittery or prone to disappearing. I’m not exactly sure why this is, but it seems due to third-person mode i.e. the camera scripts.

Workaround

For the vignette problem, replacing the “VRBlurPart”'s RenderStepped callback in the VRBaseCamera module:

RunService.RenderStepped:Connect(function(step)
	local userHeadCF = VRService:GetUserCFrame(Enum.UserCFrame.Head)
	local scaledUserHeadCF = userHeadCF.Rotation + (userHeadCF.Position*Camera.HeadScale) -- this line is the fix
	local vrCF = workspace.Camera.CFrame * scaledUserHeadCF
	blurPart.CFrame = (vrCF * CFrame.Angles(0, math.rad(180), 0)) + vrCF.LookVector * 1.05
end)

Issue Area: Engine
Issue Type: Display
Impact: Moderate
Frequency: Often

3 Likes