Hello,

I'm doing some pretty nasty camera manipulation, where It's supposed to work kinda like this https://i.imgur.com/3WSf9qP.png

The camera is above and behind the player, looking at a point that's in front of the player. When you hold down right click, both the camera and where it's looking at should rotate around the player's center (HumanoidRootPart), just like the default ROBLOX camera.

This is what i've got so far:

wait(0.5)

local Settings = UserSettings()
local GameSettings = Settings.GameSettings
GameSettings.RotationType = Enum.RotationType.MovementRelative

print("Disabling default camera")
script.Parent.CameraScript.Disabled = true -- Disable default camera
print("Default Camera disabled.") 
------------------------------------------------------------------------------
local cplayer = script.Parent.Parent -- current player
local cam = game.Workspace.CurrentCamera -- current camera
local runSvc = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService") -- input service
local m2dn = false -- mouse 2 down

cplayer.Character.Humanoid.AutoRotate = false -- set auto rotate to false

local Player = game.Players.LocalPlayer --get the local player
local Mouse = Player:GetMouse() --get the mouse

local rx=0
local ry=0

Mouse.Button2Down:connect(function()
	m2dn=true
end)

Mouse.Button2Up:connect(function()
	m2dn=false
end)

UserInputService.InputChanged:connect(function(inputObject)
	if inputObject.UserInputType == Enum.UserInputType.MouseMovement and m2dn then
		rx=rx+inputObject.Delta.x
		ry=ry+inputObject.Delta.y
	end
end)

local right = false

local function Update()
	local hRootPart = cplayer.Character.HumanoidRootPart -- makes job easier
	
	local playerPos = hRootPart.Position
	
	local targetAim = Vector3.new(0,1,-5) -- the offset where the camera aims
	local targetPos = Vector3.new(0,10,5) -- offset of where the actual camera is
	
	local objCamPos = hRootPart.CFrame:toObjectSpace(cam.CFrame) -- camera position
	
	local Aim = objCamPos.LookVector -- where the camera is currently aiming
	local Pos = objCamPos.Position -- where the camera is currently at (x,y,z)
	
	ry = math.clamp(ry,-20,60) -- limit values
	if (rx<-360)then
		rx=0
	elseif (rx>360) then
		rx=0
	end

	local ang = CFrame.Angles(math.rad(ry),math.rad(rx),0) -- calculate angles to rotate by
	targetPos = (ang*CFrame.new(targetPos)).Position -- transform position
	targetAim = (ang*CFrame.new(targetAim)).Position -- transform aim area

	local AimDiff = targetAim-Aim -- difference in where the camera is actually aiming vs where it's supposed to be
	local PosDiff = targetPos-Pos -- same as above but for position
	
	Aim=Aim+(AimDiff/2) -- smooth values to create a sliding effect
	Pos=Pos+(PosDiff/2)
	
	Aim = hRootPart.CFrame:toWorldSpace(CFrame.new(Aim)).Position --modify where the camera will be next
	Pos = hRootPart.CFrame:toWorldSpace(CFrame.new(Pos)).Position
	
	

	cam.CoordinateFrame = CFrame.new(Pos,Aim) -- actually move the camera
end

runSvc:BindToRenderStep("Camera",Enum.RenderPriority.Camera.Value,Update)

While it does roughly work, there's some issues where it doesn't always rotate around the center point like I want it to.

I've tried changing the way angles are processed in many ways but i've had no success in getting the results I need.

Anyone have any ideas?

Thanks in advance,

dylanpdx