How would I make angled sway like the video below?

Hello everyone seeing this, I want to make my sway system look around / similar to the one in the video below.

Vid: (Not mine)


This is my current sway system:

run.RenderStepped:Connect(function(dt)
	vm.HRP.CFrame = workspace.CurrentCamera.CFrame

	local mouseDelta = game:GetService("UserInputService"):GetMouseDelta()

	swaySpring:shove(Vector3.new(-mouseDelta.X / 500, mouseDelta.Y / 200, 0) )

	local updatedSwayS = swaySpring:update(dt)

	local rot = workspace.CurrentCamera.CFrame.LookVector

	vm.HRP.CFrame *= CFrame.new(updatedSwayS.X, updatedSwayS.Y, 0)
end)

This system utilizes this spring module: (Not mine)

-- Constants

local ITERATIONS	= 8

-- Module

local SPRING	= {}

-- Functions 

function SPRING.new(self, mass, force, damping, speed)

	local spring	= {
		Target		= Vector3.new();
		Position	= Vector3.new();
		Velocity	= Vector3.new();

		Mass		= mass or 5;
		Force		= force or 50;
		Damping		= damping or 4;
		Speed		= speed  or 4;
	}

	function spring.getstats(self)
		return self.Mass, self.Force, self.Damping, self.Speed
	end

	function spring.changestats(self, mass, force, damping, speed)
		self.Mass = mass or self.Mass
		self.Force = force or self.Force
		self.Damping = damping or self.Damping
		self.Speed = speed or self.Speed
	end

	function spring.shove(self, force)
		local x, y, z	= force.X, force.Y, force.Z
		if x ~= x or x == math.huge or x == -math.huge then
			x	= 0
		end
		if y ~= y or y == math.huge or y == -math.huge then
			y	= 0
		end
		if z ~= z or z == math.huge or z == -math.huge then
			z	= 0
		end
		self.Velocity	= self.Velocity + Vector3.new(x, y, z)
	end

	function spring.update(self, dt)
		local scaledDeltaTime = dt * self.Speed / ITERATIONS
		for i = 1, ITERATIONS do
			local iterationForce= self.Target - self.Position
			local acceleration	= (iterationForce * self.Force) / self.Mass

			acceleration		= acceleration - self.Velocity * self.Damping

			self.Velocity	= self.Velocity + acceleration * scaledDeltaTime
			self.Position	= self.Position + self.Velocity * scaledDeltaTime
		end

		return self.Position
	end

	return spring
end

-- Return

return SPRING

If anybody knows how I can do this it would be massive help! Thanks in advance!

I think I managed to do this by myself, for anybody who wants to achieve a similar thing here is the updated code:

run.RenderStepped:Connect(function(dt)
	vm.HRP.CFrame = workspace.CurrentCamera.CFrame

	local mouseDelta = game:GetService("UserInputService"):GetMouseDelta()

	swaySpring:shove(Vector3.new(-mouseDelta.X / 400, mouseDelta.Y / 200, 0))

	local updatedSwayS = swaySpring:update(dt)

	turn = Lerp(turn, math.clamp(mouseDelta.X, -10, 10), (10 * dt))

	vm.HRP.CFrame *= CFrame.new(updatedSwayS.X, updatedSwayS.Y, 0) * CFrame.Angles(0, 0, math.rad(turn))
end)

Might not look the exact same but looks similar!

Edit: here is the lerp function:

local function Lerp(a, b, t)
	return a + (b - a) * t
end

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