How to have camera lerp lookvectors based on character position

I have a 3rd person camera, which I want to be able to change dynamically as players move around the map.

I’m unsure how to plugin this LookVector tho. Basically, the camera needs to rotate once I touch a specific part. Ideally it’d lerp slower around too. I set the lerp to high because when the camera is in a solid 3rd person look, it should stay reasonable close to the exact position, but when rotating, i dont want it to immediately snap (93)
So touching blue would set lookvector back to 0,0,0, but touching the pink should make camera rotate on that lookvector (can see cone handle for orientation)

local OFFSET =, 6, 0)
local INTERIOR_OFFSET =, 9, 0)
local FOV = 65
local CameraLookVector =, 0, 0)

--// Get the default position for the camera
function CameraController:GetDefaultPosition()
	local Character = game.Players.LocalPlayer.Character
	if not Character then return end

	local HumanoidRootPart = Character:FindFirstChild("HumanoidRootPart")
	if not HumanoidRootPart then return end
	local PlayerPosition = HumanoidRootPart.Position
	local CameraPosition = PlayerPosition + (game.Players.LocalPlayer:GetAttribute("Inside") and INTERIOR_OFFSET or OFFSET)
	return PlayerPosition, CameraPosition

--// Update camera movement
function CameraController:Update()	
	-- Get default position
	local PlayerPosition, CameraPosition = self:GetDefaultPosition()
	if not PlayerPosition or not CameraPosition then return end
	local To =, PlayerPosition)
	CurrentCamera.CFrame = CurrentCamera.CFrame:Lerp(To, 0.5)

for _, v in pairs(CollectionService:GetTagged("Camera")) do
		local Character = hit.Parent
		if not Character then return end
		local TouchedPlayer = game.Players:GetPlayerFromCharacter(Character)
		if not TouchedPlayer then return end
		if TouchedPlayer ~= game.Players.LocalPlayer then return end
		CameraLookVector = v.LookVector

Will the camera only be rotated on the y axis? If so, you could:
- Store a number for the goal y axis rotation
- Store a number for the current y axis rotation
- Lerp the current rotation variable to the goal variable (in Update)
- Calculate a new CFrame for the camera (in Update)

To calculate the new CFrame you can use something like this:

local CurrentCameraYRotation = 45
local PlayerPosition, CameraPosition = CameraController:GetDefaultPosition()

 -- Make a CFrame with the correct rotation
local cframe = CFrame.Angles(0, math.rad(CurrentCameraYRotation), 0)
-- Translate the CFrame relatively based on the offset
cframe *=
-- Move the CFrame over to the character
cframe += PlayerPosition

Oh another thing, you probably want to make the rotation rate time dependent.


local function lerp(a,b,c)
    return a+(b-a)*c

local CurrentYAxisRotation = 0
local GoalYAxisRotation = 90

local Rate = 0.05

-- Frame dependant:
local function Update()
    lerp(CurrentYAxisRotation, GoalYAxisRotation, Rate)

-- Time dependant:
local function Update(DeltaTime)
    lerp(CurrentYAxisRotation, GoalYAxisRotation, math.pow(Rate, 1/DeltaTime))


I probably just should have answered the question, to lerp lookvectors you can use slerp. There are some forum posts with different slerp algorithms if you search slerp.