I'm animating characters through Motor6D. It works pretty smoothly, except for the fact that the animation is pretty choppy at the beginning. I'm using Vector3:Lerp() to make C0s. Could someone make it smoother? I also keep some things in a ModuleScript.

Part of the LocalScript:

repeat wait() until game.Players.LocalPlayer

database = require(Workspace.Database)

repeat wait() until database

player = game.Players.LocalPlayer
character = player.Character
cam = Workspace.CurrentCamera
mouse = player:GetMouse()
humanoid = character.Humanoid

player.CameraMode = "LockFirstPerson"

humanoid.Running:connect(function(speed)
	if speed > 0 then
		running = true
		while running do
			for frame = 1, #database.Frames.Running do
				if not running then break end
				for i = 0,1,0.1 do
					if not running then break end
					for joint, start in pairs(database.Frames.Running[frame]) do
						local lerp = (frame == #database.Frames.Running and Vector3.new(0,0,0) or start):Lerp(database.Frames.Running[frame+1] and database.Frames.Running[frame+1][joint] or Vector3.new(0,0,0),i)
						character.Torso[joint].C0 = database.Humanoid[joint].C0*CFrame.new(lerp.X,lerp.Y,lerp.Z)
					end
					wait()
				end
			end
		end
	else
		running = false
		for i, joint in pairs(character.Torso:GetChildren()) do
			if joint:IsA("Motor6D") then
				character.Torso[joint.Name].C0 = database.Humanoid[joint.Name].C0
			end
		end
	end
end)

Part of the ModuleScript:

database = {}


database.Frames = {}
database.Frames.Running = {}

database.Frames.Running = {
	{
		["Right Shoulder"] = Vector3.new(0.1,-0.1,0),
		["Left Shoulder"] = Vector3.new(0.1,-0.1,0)				
	};
	{
		["Right Shoulder"] = Vector3.new(0,0,0),
		["Left Shoulder"] = Vector3.new(0,0,0)		
	};
	{
		["Right Shoulder"] = Vector3.new(-0.1,-0.1,0),
		["Left Shoulder"] = Vector3.new(-0.1,-0.1,0)
	}
}

for animation, frames in pairs(database.Frames) do
	table.insert(frames,{})
	table.insert(frames,1,{})
	for joint, _ in pairs(frames[1]) do
		frames[1][joint] = Vector3.new(0,0,0)
		frames[#frames][joint] = Vector3.new(0,0,0)
	end
	setmetatable(frames,{})
	getmetatable(frames).__index = {Joints = {}}
	for joint, _ in pairs(frames[1]) do
		table.insert(frames.Joints,joint)
	end
	
end

return database

There's also a place you can check out: http://www.roblox.com/FPS-Testing-place?id=58724430