I'm working on another third person camera, but this time I'm using ROBLOX's default player. I got it working great, but I want to force the player to strafe, rather than turn left or right. Lock first person didn't work, (I'm using lock center to make the mouse stay centered) I haven't been able to find any info on how to force the player to strafe, other than using first person.

Does anyone know how I would do this?

My code:

--Third person camera stuff--

repeat wait() until game.Workspace:FindFirstChild(game.Players.LocalPlayer.Name)
--Set up--
ip = game:GetService("UserInputService")
cam = game.Workspace.CurrentCamera
plr = game.Players.LocalPlayer.Character
plr.Humanoid.AutoRotate = false

--This would be an example of forced settings, though I made a GUI settings example.
--[[
msense = 10 --Might want to make a user controllable value. I personally prefer 10x but I'm also a very fast paced gamer.
msmooth = 35 --How much is the mouse.Delta divided by?
zoomMax = 80 --The highest the camera can me rotated on the y axis, so you can't glitch it. 85 is exavtly 180 degrees.
]]--

--Coroutines--

camCnt = coroutine.wrap(function()
	cam.CameraType = Enum.CameraType.Scriptable
	cam.CoordinateFrame = CFrame.new(plr.Torso.Position+Vector3.new(2,2,3))
	ip.MouseBehavior = Enum.MouseBehavior.LockCenter
	game.Players.LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson	
	
	local angleX = 0
	local angleY = 0

ip.InputChanged:connect(function(inputObject)
	if inputObject.UserInputType == Enum.UserInputType.MouseMovement then
		if inputObject.Delta.x < 0 then
			angleX = angleX - (1 - inputObject.Delta.x/msmooth) * msense
		elseif inputObject.Delta.x > 0 then
			angleX = angleX + (1 + inputObject.Delta.x/msmooth) * msense
		end
		if inputObject.Delta.y < 0 then
			angleY = angleY - (1 - inputObject.Delta.y/msmooth) * msense
		elseif inputObject.Delta.y > 0 then
			angleY = angleY + (1 + inputObject.Delta.y/msmooth) * msense
		end
	end
end)	
	
game:GetService("RunService").RenderStepped:connect(function()
				
				if angleY > zoomMax then
					angleY = zoomMax
				elseif angleY < -zoomMax then
					angleY = -zoomMax
				end
				
				local x = 5 * math.cos(math.rad(angleX))
				local z = 5 * math.sin(math.rad(angleX))
				local y = 2.5 * math.tan(math.rad(angleY))
				
				local camPosition = Vector3.new(x, y, z)
				camPosition = camPosition + plr.Torso.Position	
				
				cam.CoordinateFrame = CFrame.new(camPosition, plr.Torso.Position)*CFrame.new(2,2,3)			
	end)
end)	

--run--

game.Players.LocalPlayer.Character.Humanoid.Died:connect(function()
	cam.CameraType = Enum.CameraType.Custom
	game.Players.LocalPlayer.CameraMode = Enum.CameraMode.Classic
end)

script.Parent.Settings.TextButton.MouseButton1Click:connect(function()

msense = math.floor(script.Parent.Settings.msense.CanvasPosition.X/112.5)
msmooth = math.floor(script.Parent.Settings.smooth.CanvasPosition.X/31.5)
zoomMax = 80

camCnt()

for i,c in pairs (script.Parent.Settings:GetChildren()) do
	c.Visible = false
end

end)

Update:

I got some code that sort-of works, but is still inefficient, I would love if I got a better math equation for this.

--Third person camera stuff--

repeat wait() until game.Workspace:FindFirstChild(game.Players.LocalPlayer.Name)
--Set up--
ip = game:GetService("UserInputService")
cam = game.Workspace.CurrentCamera
plr = game.Players.LocalPlayer.Character
plr.Humanoid.AutoRotate = false
m = game.Players.LocalPlayer:GetMouse()

--This would be an example of forced settings, though I made a GUI settings example.
--[[
msense = 10 --Might want to make a user controllable value. I personally prefer 10x but I'm also a very fast paced gamer.
msmooth = 35 --How much is the mouse.Delta divided by?
zoomMax = 80 --The highest the camera can me rotated on the y axis, so you can't glitch it. 85 is exavtly 180 degrees.
]]--

--Coroutines--

camCnt = coroutine.wrap(function()
	cam.CameraType = Enum.CameraType.Scriptable
	cam.CoordinateFrame = CFrame.new(plr.Torso.Position+Vector3.new(2,2,3))
	ip.MouseBehavior = Enum.MouseBehavior.LockCenter
	game.Players.LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson	
	
	local angleX = 0
	local angleY = 0

ip.InputChanged:connect(function(inputObject)
	if inputObject.UserInputType == Enum.UserInputType.MouseMovement then
		if inputObject.Delta.x < 0 then
			angleX = angleX - (1 - inputObject.Delta.x/msmooth) * msense
		elseif inputObject.Delta.x > 0 then
			angleX = angleX + (1 + inputObject.Delta.x/msmooth) * msense
		end
		if inputObject.Delta.y < 0 then
			angleY = angleY - (1 - inputObject.Delta.y/msmooth) * msense
		elseif inputObject.Delta.y > 0 then
			angleY = angleY + (1 + inputObject.Delta.y/msmooth) * msense
		end
	end
end)	
	
game:GetService("RunService").RenderStepped:connect(function()
				
				if angleY > zoomMax then
					angleY = zoomMax
				elseif angleY < -zoomMax then
					angleY = -zoomMax
				end
				
				local dir = Vector3.new(m.hit.p.x,0,m.hit.p.z)
				local x = 5 * math.cos(math.rad(angleX))
				local z = 5 * math.sin(math.rad(angleX))
				local y = 2.5 * math.tan(math.rad(angleY))		
				
				local camPosition = Vector3.new(x, y, z)
				camPosition = camPosition + plr.Torso.Position	
				
				cam.CoordinateFrame = CFrame.new(camPosition, plr.Torso.Position)*CFrame.new(2,2,3)	
				plr.Torso.CFrame = CFrame.new(plr.Torso.CFrame.p,dir)		
	end)
end)	

--run--

game.Players.LocalPlayer.Character.Humanoid.Died:connect(function()
	cam.CameraType = Enum.CameraType.Custom
	game.Players.LocalPlayer.CameraMode = Enum.CameraMode.Classic
end)

script.Parent.Settings.TextButton.MouseButton1Click:connect(function()

msense = math.floor(script.Parent.Settings.msense.CanvasPosition.X/112.5)
msmooth = math.floor(script.Parent.Settings.smooth.CanvasPosition.X/31.5)
zoomMax = 80

camCnt()

for i,c in pairs (script.Parent.Settings:GetChildren()) do
	c.Visible = false
end

end)

3 comments

0

I'm too tired to look at the equations! Merp. I'll take a look to see if I can come up with a better equation.

0

Alright, sounds cool.

0

Shift lock