A reusable ManimGL creature system for educational animation, storytelling, mathematics visualization, telecom demonstrations, and AI teaching content.
The purpose of this project is not to build a generic animation framework.
The purpose is to build:
- one connected creature
- one reusable architecture
- one public API
- one believable movement system
- one reusable audio system
- one educational mascot platform
The creature must behave like:
ONE ROOT
ONE BODY
ONE SKELETON
ONE ORGANISM
Not:
many disconnected objects
Every body part belongs to a single hierarchy.
Nothing floats independently.
Nothing moves independently.
Everything is connected.
Only one import is considered public.
from mathlab_creature import build_creatureEverything else is internal.
External code should never directly import:
Eyes
Nose
Mouth
Arm
Leg
Hand
Foot
FaceRig
ArmRig
LegRig
BodyRigThese are implementation details.
The creature is organized around a connected hierarchy.
CreatureRoot
β
βΌ
BodyCore
β
βΌ
Spine
β
βββ Head
β βββ Eyes
β βββ Nose
β βββ Mouth
β
βββ Left Shoulder
β βββ Left Arm
β
βββ Right Shoulder
β βββ Right Arm
β
βββ Pelvis
βββ Left Leg
βββ Right Leg
Every object has exactly one parent.
Movement propagates downward.
Audio is a separate subsystem.
Audio is NOT part of the creature hierarchy.
Project
βββ Creature System
βββ Audio System
Audio may be used by:
- scenes
- actions
- narration
- procedural sound
- teaching demonstrations
The creature must still function without audio.
Audio is optional.
mathlab_creature/
βββ api/
βββ config/
βββ core/
β βββ audio/
βββ creature/
βββ scenes/
Public interface.
creature_api.py
Provides:
build_creature()This is the only supported public entry point.
Visual and behavioral constants.
colors.py
sizes.py
defaults.py
timings.py
logging_config.py
Contains:
- colors
- dimensions
- proportions
- timing constants
- logging settings
No hardcoded values should exist inside creature parts.
Reusable low-level utilities.
geometry.py
anchors.py
layout.py
motion.py
transforms.py
kinematics.py
debug_draw.py
input_controller.py
logger.py
naming.py
Purpose:
- geometry helpers
- transform math
- local/world coordinate systems
- naming
- debugging
- utility functions
Audio subsystem.
audio_config.py
audio_server.py
helpers.py
procedural.py
sound_registry.py
timing.py
Purpose:
- procedural sounds
- sound effects
- future narration
- future voice support
- educational audio demonstrations
This subsystem remains independent from creature hierarchy.
Contains the creature implementation.
Not intended for external use.
Contains root systems.
creature_root.py
skeleton.py
body_core.py
Responsibilities:
- root ownership
- hierarchy ownership
- center of mass
- breathing
- sway
- balance
- body coordination
Contains body components.
head
eyes
nose
mouth
arms
hands
legs
feet
joints
Body parts are NOT independent objects.
They are connected pieces of a single creature.
Internal control layers.
body_rig.py
face_rig.py
arm_rig.py
leg_rig.py
Used only during creature construction and coordination.
Not intended for external use.
Animation behaviors.
idle_action.py
blink_action.py
look_action.py
walk_action.py
step_action.py
turn_action.py
wave_action.py
point_action.py
hop_action.py
Actions operate on the connected creature.
Actions never directly manipulate disconnected body parts.
movement_controller.py
rotation_controller.py
visibility_controller.py
camera_controller.py
Responsibilities:
- movement
- rotation
- visibility
- camera coordination
All global movement must originate from CreatureRoot.
Contains example scenes.
Current primary development scene:
test_creature_scene.py
Purpose:
- verify build_creature()
- verify hierarchy
- verify movement
- verify actions
- verify transforms
This is the primary validation scene during development.
Global movement belongs only to:
CreatureRoot
Never:
Eye
Hand
Leg
Foot
Nose
Mouth
Example:
Bad:
eye.shift(...)
hand.rotate(...)
leg.move_to(...)Good:
creature.move(...)Each object owns:
Local Transform
relative to its parent.
World position is derived from:
Parent World Transform
+
Local Transform
Child objects never directly control world space.
Eyes remain attached to head.
Nose remains attached to face.
Mouth remains attached to face.
Hands remain attached to arms.
Feet remain attached to legs.
Nothing floats.
Nothing detaches.
Everything remains connected.
The creature should feel:
- connected
- grounded
- stable
- reusable
- educational
- believable
Not:
- over-engineered
- disconnected
- chaotic
- unnecessarily complex
manimgl
numpy
pyo
Render the primary creature validation scene.
manimgl scenes/tests/test_creature_scene.py TestCreatureSceneONE ROOT
ONE BODY
ONE SKELETON
ONE ORGANISM
Everything else derives from that.