Dolly zooms are cool. I watched some TV show today that used it and instantly wanted to figure out how to do it. Thankfully, it’s not that hard! Simple trigonometry (seriously). I put together a demo place that utilizes the cool effect. I unlocked the place too!
For those that don’t know what a dolly zoom is, it’s when the camera’s field-of-view “zooms” in on the subject, but the subject’s size doesn’t change. You do this by adjusting both the FOV and the camera’s distance from the subject.
Here’s the math that I worked out quickly:
Ais where the camera is. Side
bis the distance from the camera to the subject. Side
ais a pre-determined width from the subject to the edge.
When we change the Field Of View, we calculate side
b from the constant side
a, which gives us our cool dolly zoom effect.
Here's the code to it
(Refer to my math above for references to variable names)
local cam = game.Workspace.CurrentCamera cam.CameraType = Enum.CameraType.Scriptable local origin = game.Workspace.Part1 local focus = game.Workspace.Part2 origin.Transparency = 1 focus.Transparency = 1 local b = (origin.Position - focus.Position).Magnitude local a = b * math.tan(math.rad(cam.FieldOfView * 0.5)) local tanOfA = math.tan(math.rad(cam.FieldOfView * 0.5)) -- Angle and distance calculations: cam.Changed:Connect(function(property) if (property == "FieldOfView") then tanOfA = math.tan(math.rad(cam.FieldOfView * 0.5)) b = a / tanOfA end end) -- Continuous camera update: game:GetService("RunService"):BindToRenderStep("Test", Enum.RenderPriority.Camera.Value, function() local pos = focus.Position + (CFrame.new(focus.Position, origin.Position).lookVector * b) cam.CFrame = CFrame.new(pos, focus.Position) end)
Now it will calculate the correct distance when the FieldOfView property is changed.
Note: I imagine someone else has probably done this before, but I haven’t seen a post about it here before, so I figured I’d post this anyway.