Viewport Raycast Exceeds Intended Bounds


Raycast has a stud limit of 10 and it works until I zoom out

the yellow parts indicate that the ray has exceeded its bounds

local raycastparams = RaycastParams.new()
raycastparams.FilterDescendantsInstances = {player.Character} 
local function RenderPreview()
	local mouse = UIS:GetMouseLocation()
	local mouseray = camera:ViewportPointToRay(mouse.X, mouse.Y)
	local raycastresult = workspace:Raycast(mouseray.Origin, mouseray.Direction * 20, raycastparams)
	if raycastresult then -- don't use result.Position, it could lead to errors.
		local direction = raycastresult.Position:Lerp((head.Position + Vector3.new(0,5,0)),0.5)
		
		part.Position = raycastresult.Position
		part3.Position = head.Position + Vector3.new(0,5,0)
		part2.Position = direction
		part2.CFrame = CFrame.lookAt(part2.Position,raycastresult.Position)
		part4.Position = direction
		part4.Size = Vector3.new(0.1,0.1,(part.Position - part3.Position).Magnitude)
		part4.CFrame = CFrame.lookAt(part4.Position,raycastresult.Position)
	else

		warn("outside boundaries")
		local pseudo_raycastresult = mouseray.Origin + mouseray.Direction * 20
		local direction = pseudo_raycastresult:Lerp((head.Position + Vector3.new(0,5,0)),0.5)
		
		part.Position = pseudo_raycastresult
		part3.Position = head.Position + Vector3.new(0,5,0)
		part2.Position = direction
		part2.CFrame = CFrame.lookAt(part2.Position,pseudo_raycastresult)
		part4.Position = direction
		part4.Size = Vector3.new(0.1,0.1,(part.Position - part3.Position).Magnitude)
		part4.CFrame = CFrame.lookAt(part4.Position,pseudo_raycastresult)
		
		
		local part5 = Instance.new("Part")
		part5.Transparency = 0.75
		part5.Anchored = true
		part5.CanCollide = false
		part5.CanQuery = false
		part5.Parent = workspace
		part5.Size = Vector3.new(0.5,0.5,.5)
		part5.Material = Enum.Material.Neon
		part5.BrickColor = BrickColor.Yellow()
		part5.Name = "part3"
		
		part5.Position = pseudo_raycastresult
	end
end