Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

I'm trying to pixelate the player's screen (SOLVED) ?

dist = 3
thic = 0.1
globalpart = Instance.new("Part")
globalpart.Size = Vector3.new(1, 1, 1)
print(globalpart.Size)
globalpart.Anchored = true
globalpart.CanCollide = false
globalpart.Transparency = 1
globalpart.Parent = game.Workspace
script.Parent.Adornee = globalpart

function refreshView()
	local vfov = game.Workspace.CurrentCamera.FieldOfView
	local aspectRatio = game.Players.LocalPlayer.PlayerGui.ScreenGui.AbsoluteSize.X/game.Players.LocalPlayer.PlayerGui.ScreenGui.AbsoluteSize.Y
	local hfov = vfov * (aspectRatio - 1)
	print(aspectRatio)
	globalpart.Size = Vector3.new(2*math.sqrt(math.cos(hfov/2)^2 - (dist + thic/2)^2), 2*math.sqrt(math.cos(vfov/2)^2 - (dist + thic/2)^2), 0.5)
	print(Vector3.new(2*math.sqrt(math.cos(hfov/2)^2 - (dist + thic/2)^2), 2*math.sqrt(math.cos(vfov/2)^2 - (dist + thic/2)^2), 0.5))
	print(globalpart.Size)
	local newcam = Instance.new("Camera")
	script.Parent.ViewportFrame.CurrentCamera = newcam
	newcam.FieldOfView = game.Workspace.CurrentCamera.FieldOfView
	newcam.Parent = script.Parent.ViewportFrame
	newcam.CFrame = game.Workspace.CurrentCamera.CFrame * CFrame.new(0, 0, dist + thic/2)
	newcam.HeadLocked = false
	globalpart.CFrame = game.Workspace.CurrentCamera.CFrame * CFrame.new(0, 0, -(dist + thic/2))
	for i, v in pairs(script.Parent.ViewportFrame:GetChildren()) do
		v:Destroy()
	end
	for i, v in pairs(game.Workspace:GetChildren()) do
		if v.ClassName ~= "Terrain" and v.ClassName ~= "Camera" then
			local eee = v:Clone()
			if eee then
				eee.Parent = script.Parent.ViewportFrame
			end
		end
	end
	newcam:Destroy()
end

game:GetService("RunService"):BindToRenderStep("runit", Enum.RenderPriority.Camera.Value - 1, refreshView)

Here's what my StarterGui looks like: image

So I'm trying to get the vertical and horizontal FOV then have a part fill the screen at a set distance away so I can get a pixelated screen effect. The size of the part remains 1, 1, 1 and the print prints -nan(ind), -nan(ind), 0.5. I don't know why.

LAST UPDATE I HAVE FIGURED IT OUT! My math was bad. I redid my math and switched from BindToRenderStepped because it was laggy. Now it's just PERFECT. Here is the code if you want to try it:

thic = 0.1
dist = 1.5 + thic/2
globalpart = Instance.new("Part")
globalpart.Size = Vector3.new(1, 1, 1)
print(globalpart.Size)
globalpart.Anchored = true
globalpart.CastShadow = false
globalpart.CanCollide = false
globalpart.Transparency = 1
globalpart.Parent = game.Workspace
script.Parent.Adornee = globalpart

for i, v in pairs(script.Parent.ViewportFrame:GetChildren()) do
	if v.ClassName ~= "Sky" then
		v:Destroy()
	end
end
for i, v in pairs(game.Workspace:GetChildren()) do
	if v.ClassName ~= "Terrain" and v.ClassName ~= "Camera" and v ~= globalpart then
		local eee = v:Clone()
		if eee then
			eee.Parent = script.Parent.ViewportFrame
		end
	end
end

game.Workspace.Changed:Connect(function()
	for i, v in pairs(script.Parent.ViewportFrame:GetChildren()) do
		if v.ClassName ~= "Sky" then
			v:Destroy()
		end
	end
	for i, v in pairs(game.Workspace:GetChildren()) do
		if v.ClassName ~= "Terrain" and v.ClassName ~= "Camera" and v ~= globalpart then
			local eee = v:Clone()
			if eee then
				eee.Parent = script.Parent.ViewportFrame
			end
		end
	end
end)

game:GetService("RunService").RenderStepped:Connect(function()
--function refreshView()
	local fov = game.Workspace.CurrentCamera.FieldOfView
	local aspectRatio = game.Players.LocalPlayer.PlayerGui.ScreenGui.AbsoluteSize.X/game.Players.LocalPlayer.PlayerGui.ScreenGui.AbsoluteSize.Y
	local vfov = fov
	local hfov = fov + fov * (aspectRatio - 1)
	print(aspectRatio)
	globalpart.Size = Vector3.new(2*math.sqrt(math.abs((dist/math.cos(math.rad(hfov/2)))^2 - dist^2)), 2*math.sqrt(math.abs((dist/math.cos(math.rad(vfov/2)))^2 - dist^2)), thic)
	print(hfov)
	print(vfov)
	print(Vector3.new(2*math.sqrt(math.abs((dist/math.cos(math.rad(hfov/2)))^2 - dist^2)), 2*math.sqrt(math.abs((dist/math.cos(math.rad(vfov/2)))^2 - dist^2)), thic))
	print(globalpart.Size)
	print(math.cos(math.rad(35)))
	local newcam = Instance.new("Camera")
	script.Parent.ViewportFrame.CurrentCamera = newcam
	newcam.FieldOfView = game.Workspace.CurrentCamera.FieldOfView
	newcam.Parent = script.Parent.ViewportFrame
	newcam.CFrame = game.Workspace.CurrentCamera.CFrame --* CFrame.new(0, 0, dist)
	newcam.HeadLocked = false
	globalpart.CFrame = game.Workspace.CurrentCamera.CFrame * CFrame.new(0, 0, -dist)
	newcam:Destroy()
--end
end)

--game:GetService("RunService"):BindToRenderStep("runit", 0, refreshView)

1 answer

Ok I have an update. I figured out why it was returning -nan(ind). I forgot that math.cos uses radians. The part still scales incorrectly. I still need help.

dist = 3
thic = 0.1
globalpart = Instance.new("Part")
globalpart.Size = Vector3.new(1, 1, 1)
print(globalpart.Size)
globalpart.Anchored = true
globalpart.CanCollide = false
globalpart.Transparency = 1
globalpart.Parent = game.Workspace
script.Parent.Adornee = globalpart

function refreshView()
	local fov = game.Workspace.CurrentCamera.FieldOfView
	local aspectRatio = game.Players.LocalPlayer.PlayerGui.ScreenGui.AbsoluteSize.X/game.Players.LocalPlayer.PlayerGui.ScreenGui.AbsoluteSize.Y
	local vfov = fov
	local hfov = fov * (aspectRatio - 1)
	print(aspectRatio)
	globalpart.Size = Vector3.new(2*math.sqrt(math.abs(math.cos(math.rad(hfov/2))^2 - (dist + thic/2)^2)), 2*math.sqrt(math.abs(math.cos(math.rad(vfov/2))^2 - (dist + thic/2)^2)), 0.5)
	print(hfov)
	print(vfov)
	print(Vector3.new(2*math.sqrt(math.abs(math.cos(math.rad(hfov/2))^2 - (dist + thic/2)^2)), 2*math.sqrt(math.abs(math.cos(math.rad(vfov/2))^2 - (dist + thic/2)^2)), 0.5))
	print(globalpart.Size)
	local newcam = Instance.new("Camera")
	script.Parent.ViewportFrame.CurrentCamera = newcam
	newcam.FieldOfView = game.Workspace.CurrentCamera.FieldOfView
	newcam.Parent = script.Parent.ViewportFrame
	newcam.CFrame = game.Workspace.CurrentCamera.CFrame * CFrame.new(0, 0, dist + thic/2)
	newcam.HeadLocked = false
	globalpart.CFrame = game.Workspace.CurrentCamera.CFrame * CFrame.new(0, 0, -(dist + thic/2))
	for i, v in pairs(script.Parent.ViewportFrame:GetChildren()) do
		v:Destroy()
	end
	for i, v in pairs(game.Workspace:GetChildren()) do
		if v.ClassName ~= "Terrain" and v.ClassName ~= "Camera" and v ~= globalpart then
			local eee = v:Clone()
			if eee then
				eee.Parent = script.Parent.ViewportFrame
			end
		end
	end
	newcam:Destroy()
end

game:GetService("RunService"):BindToRenderStep("runit", Enum.RenderPriority.Camera.Value - 1, refreshView)

This discussion is preserved as it was. New answers, comments, and votes are closed.