Making camera effects like in Pressure: The Vault

Hey!
I’ve recently been wondering how this effect from this video was achieved.

(22:37 is the timestamp)

As you can see, everything that the camera sees just gets “duplicated” and recolored and moves around. I’ve never seen something like this and was wondering how it was done.

The effect your describing is called chromatic aberration(kind of).

While there is no really good way of making it in Roblox, but you can try to mess around with viewports.

I made something like this, while not identical, I think it looks quite close:

local cameras = {} :: {Camera}
local cameraHistories = {} :: {{CFrame}}

local RunService = game:GetService("RunService") :: RunService
local Players = game:GetService("Players") :: Players

local camera = workspace.CurrentCamera :: Camera

local player = Players.LocalPlayer :: Player
local character = player.Character or player.CharacterAdded:Wait() :: Model

local viewports = script.Parent.Viewports :: Folder

for i, vp in viewports:GetChildren() do
	if not vp:IsA("ViewportFrame") then continue end
	
	local vpcamera = Instance.new("Camera") :: Camera
	vpcamera.Parent = vp
	vp.CurrentCamera = vpcamera
	
	table.insert(cameras, vpcamera)
	
	local worldModel = Instance.new("WorldModel") :: WorldModel
	worldModel.Parent = vp
	
	cameraHistories[i] = {}
	for _ = 1, #viewports:GetChildren() do table.insert(cameraHistories[i], camera.CFrame) end
	
	for _, obj in workspace:GetChildren() do
		if not obj:IsA("BasePart") or obj:IsA("Terrain") then continue end
		local clone = obj:Clone() :: Instance
		
		clone.Parent = worldModel
	end
end

RunService.RenderStepped:Connect(function(dt : number)
	for i, cam in cameras do
		local history = cameraHistories[i]
		table.insert(history, 1, camera.CFrame)
		
		if #history > #viewports:GetChildren() then
			table.remove(history, #history)
		end

		cam.CFrame = cam.CFrame:Lerp(history[#history], 0.2)
	end 
end)

I have a ScreenGui with a Folder with 3 viewports with different colors on them, and they are all offset from each other by a couple of pixels, and a script outside the folder.

All this code does it get the position of the players camera 3 times, gets the oldest camera position, and just tweens the viewports camera to that old position.

In this case I have used workspace for the objects, but it can get pretty preformance intensive, this script can work on simple things like the basic baseplate, but if you want to improve preformance, you’ll need to specify a specific area, doing the whole workspace will definitely cause it to lag.

Also this script checks inside the workspace if the objects contained inside are only BaseParts and Terrain, if you have more object types you don’t want to include, you’ll have to tweak the code.

But thats basically it, let me know if you don’t understand something.

3 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.