Custom Camera Clipping

Hey so i made a custom 3rd person camera for my game, and I made a simple raycast from the character’s head to the Camera’s position to stop the camera clipping through walls. This works but sometimes when you aim down sights for example it clips through the wall. I dont know how to fix this and im not sure if i overlooked something simple.

https://gyazo.com/991e799c907d00e5c86dc7461de78235
https://gyazo.com/bcb1c50ca8977279205e1c1a60c3133a

local TargetCF = CFrame.new(CameraTarget.CFrame.Position)
	* CFrame.Angles(0, LastCamera.X, 0) 
	* CFrame.Angles(LastCamera.Y, 0, 0)
	* CFrame.new(CameraOffsetZ, CameraOffsetY, CameraOffsetX);

local CameraRay = Ray.new(char.Head.Position, (TargetCF.LookVector.Unit * -1) * CameraOffsetX);
local Hit, Pos, Normal = workspace:FindPartOnRayWithIgnoreList(CameraRay, {CameraTarget.Parent, Camera});
local CutOff = 0;

if (Hit) then
	Pos = Pos + Normal * .2

	local Distance = (char.Head.Position - Pos).Magnitude;

	CutOff = CameraOffsetX - Distance
end
				
Camera.CFrame = CFrame.new(CameraTarget.CFrame.Position)
	* CFrame.Angles(0, LastCamera.X, 0) 
	* CFrame.Angles(LastCamera.Y, 0, 0)
	* CFrame.new(CameraOffsetZ, CameraOffsetY, CameraOffsetX - CutOff);

do something like this

while rstep:wait() do
	local distance = (camera.CFrame.p - camera.Focus.p).Magnitude
	local negativeLookVector = camera.CFrame:VectorToWorldSpace(Vector3.new(0, 0, 1))
	local ray = Ray.new(camera.Focus.p, negativeLookVector * distance)
	local partInTheWay, hitPos = workspace:FindPartOnRayWithIgnoreList(ray, {character})
	if partInTheWay and partInTheWay.CanCollide and partInTheWay.Transparency <= 0.1 then -- disable the cancollide and transparency thing if you want, but the popper cam does this
		local newCameraDistanceFromHead = (camera.Focus.p - hitPos).Magnitude
		camera.CFrame = character.Head.CFrame * CFrame.new(0, 0, -newCameraDistanceFromHead)
	end
end

Fixed, heres the code I used.

Used https://www.roblox.com/games/2609028954/RBR-Main-Game for an guidance

local Center = CameraTarget.Position;
local TargetCF = CFrame.new(CameraTarget.CFrame.Position)
	* CFrame.Angles(0, LastCamera.X, 0) 
	* CFrame.Angles(LastCamera.Y, 0, 0)
	* CFrame.new(CameraOffsetZ * DirectionZ, CameraOffsetY, CameraOffsetX);
local Rotation	= TargetCF - TargetCF.Position;

local CameraRay = Ray.new(Center, TargetCF.Position - Center);
local Hit, Pos, Normal = workspace:FindPartOnRayWithIgnoreList(CameraRay, {CameraTarget.Parent, Camera});

if (Hit) then
	Pos = Pos + Normal * 0.2;
end
				
local Distance = (Center - Pos).Magnitude;

Camera.CFrame = CFrame.new(Pos) * Rotation
2 Likes