Groove Animator - Lightweight and Virtual Animation Playback

Groove Animator is a custom keyframe player that works much like Roblox’s Animator class. It is totally virtual, so no instances are required for it to run, and it can be manually stepped, giving you full power over your animation playback. There’s also no CDN required to play the animations!

Features:

  • Virtual Animations: No instance overhead.
  • Blend Masking: Composite multiple animations together.
  • Keyframe Flexibility: Supports custom sequences and binary storage for fast loading.
  • Custom Easing: Extendable easing styles for tailored animation curves.
  • Roblox-Friendly: Integrates naturally with Roblox rigs and workflows.

Example Usage:

local GrooveAnimator = require(game.ReplicatedStorage.GrooveAnimator)

-- Source rig
local rig = script.Parent.Rig

-- Create and play a track from an existing KeyframeSequence
local grooveTrack = GrooveAnimator.newTrack(GrooveAnimator:ImportKeyframeSequence(rig.AnimSaves["Bounce"]))
grooveTrack:Play()

-- Set up a controller
local grooveController = GrooveAnimator.newController()
grooveController:AddTrack(grooveTrack)

-- Attach the rig for automatic updates
local grooveRig = grooveController:AttachRig(rig)

-- Step animations each frame
game:GetService("RunService").Heartbeat:Connect(function(deltaTime)
    grooveController:Step(deltaTime)
end)

Examples:
Animation compositing:

Skinned Mesh Support:

R6/R15 support:

Custom Easing Style using @tyridge77’s Graph Editor

Performance:
Stepping the poses of an R6 character (7 poses per keyframe) takes just over 0.02 ms:

Using the rig utility to visualize the animation doubles the computation time required, coming in at just under 0.04 ms:

Get it here:

Test Place (Run with F8, run mode):
GrooveAnimator.rbxl (610.1 KB)

13 Likes

Nice but you should include performance stats for people too , as well as showcase LOD stuff if that’s implemented

4 Likes

Hey thanks for the feedback! I can certainly get some performance stats. LOD’s is beyond the scope of this, at least for right now. In its current state, this animator is designed to be generic such that it must be manually stepped.

In the examples provided, it is stepping on Heartbeat and automatically updating the attached Rigs every frame. For my personal project though, I am using this to update a virtual rig, that is then composited with a Rig managed by a Roblox AnimationController

1 Like