Issue With Camera Offset

I’ve got a script that changes the camera offset of the player for a better first person view, thats moves the camera forward a little, everything works and stuff, but whenever the player gets close to a wall they can see through it.

–Example Picture


The player is in front of a wall but can just kinda look through when getting up close

1 Like

Use raycasts in order to reduce the offset when the player’s head is in front of a wall

2 Likes

I’ve got a script hat kinda works here but when the player looks directly down, the raycast doesnt sense it, and changes it back to the normal cameraOffset.

local Character = script.Parent
local Humanoid = Character:FindFirstChild("Humanoid")
local Camera = game.Workspace.CurrentCamera
local Head = Character:FindFirstChild("Head")
local HumRootPart = Character:WaitForChild("HumanoidRootPart")

Humanoid.CameraOffset = Vector3.new(0, 0, -0.8)

local OriginalCameraOffset = Humanoid.CameraOffset

local function TweenCamera(SetPosition)
	local TweenService = game:GetService("TweenService")
	local Info = TweenInfo.new(0.2, Enum.EasingStyle.Exponential)
	local Goal = {CameraOffset = SetPosition}
	local Tween = TweenService:Create(Humanoid, Info, Goal)
	Tween:Play()
end

game:GetService("RunService").RenderStepped:Connect(function()
	local IgnoreParts = {}

	for _, part in pairs(game.Workspace:GetChildren()) do
		if (part:IsA("BasePart") or part:IsA("MeshPart")) and part.Transparency == 1 then
			table.insert(IgnoreParts, part)
		end
	end

	for _, part in pairs(Character:GetDescendants()) do
		if part:IsA("BasePart") or part:IsA("MeshPart") then 
			table.insert(IgnoreParts, part)
		end
	end

	local rayParams = RaycastParams.new()
	rayParams.FilterDescendantsInstances = IgnoreParts
	rayParams.FilterType = Enum.RaycastFilterType.Exclude

	local Raycast = game.Workspace:Raycast(Head.Position + OriginalCameraOffset, Camera.CFrame.LookVector * 1.3, rayParams)

	if Raycast and Humanoid.CameraOffset.Z < 0 then
		print(Raycast.Distance)
		print(Raycast.Instance)
		local NewPosition = Vector3.new(0, 0, (Humanoid.CameraOffset.Z + Raycast.Distance) * 0.05)
		TweenCamera(NewPosition)
	elseif not Raycast then
		TweenCamera(OriginalCameraOffset)
	end
end)

Showcase.wmv (1.5 MB)
Here is an example video of what happens

1 Like

Nevermind, got it working. Full script here for anyone that wants it.

local RunService = game:GetService("RunService")

local Character = script.Parent
local Humanoid = Character:FindFirstChild("Humanoid")
local Camera = game.Workspace.CurrentCamera
local Head = Character:FindFirstChild("Head")
local HumRootPart = Character:WaitForChild("HumanoidRootPart")

Humanoid.CameraOffset = Vector3.new(0, 0, -0.8)

local OriginalCameraOffset = Humanoid.CameraOffset

local function TweenCamera(SetPosition)
	local TweenService = game:GetService("TweenService")
	local Info = TweenInfo.new(0.4, Enum.EasingStyle.Exponential)
	local Goal = {CameraOffset = SetPosition}
	local Tween = TweenService:Create(Humanoid, Info, Goal)
	Tween:Play()
end

local function FixCameraClip()
	local IgnoreParts = {}

	for _, part in pairs(game.Workspace:GetChildren()) do
		if (part:IsA("BasePart") or part:IsA("MeshPart")) and part.Transparency == 1 then
			table.insert(IgnoreParts, part)
		end
	end

	for _, part in pairs(Character:GetDescendants()) do
		if part:IsA("BasePart") or part:IsA("MeshPart") then 
			table.insert(IgnoreParts, part)
		end
	end

	local rayParams = RaycastParams.new()
	rayParams.FilterDescendantsInstances = IgnoreParts
	rayParams.FilterType = Enum.RaycastFilterType.Exclude

	local Raycast = game.Workspace:Raycast(Head.Position + OriginalCameraOffset, Head.CFrame.LookVector * 1.7, rayParams)

	if Raycast and Humanoid.CameraOffset.Z < -0.4 then
		print(Raycast.Distance)
		print(Raycast.Instance)
		local NewPosition = Vector3.new(0, 0, -0.4)
		TweenCamera(NewPosition)
	elseif not Raycast then
		TweenCamera(OriginalCameraOffset)
	end
	
end


local Connection = RunService.RenderStepped:Connect(function ()
	FixCameraClip()
end)
1 Like

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