opengym3d
Health Uyari
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Basarisiz
- rm -rf — Recursive force deletion command in .github/workflows/render.yml
- rm -rf — Recursive force deletion command in .github/workflows/spike.yml
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
Open-source 3D exercise animation library — Blender renders in CI, Three.js viewer on Pages
OpenGym3D
Open-source interactive 3D exercise library — a gym-animations.com
alternative where Blender never runs on your machine. Push a pose file to GitHub;
CI runs headless Blender, exports an animated .glb + thumbnail, and deploys the
Three.js viewer to GitHub Pages. Zero servers, zero cost, PC off.
How it works
exercises/squat.json (pose keyframes + muscle metadata — the source of truth)
│ git push
▼
GitHub Actions (ubuntu runner)
│ downloads Blender 4.5 LTS (cached), runs pipeline/build_exercise.py -b -noaudio
▼
site/assets/squat.glb (skinned rig + baked animation, ~50 KB)
site/assets/squat.png (Cycles CPU thumbnail, mid-rep frame)
│ actions/deploy-pages
▼
https://assiamahs.github.io/opengym3d/
(Three.js: orbit, play/pause, scrub, speed, muscle highlights)
Key insight: an interactive viewer needs GLB exports, not renders. Exporting
geometry + baked animation takes seconds on CPU — no GPU cloud (RunPod/Vast.ai)
required. Cycles is only used for the little thumbnail per exercise.
Motion: real capture, not hand-keyed poses
Every live exercise is driven by motion capture, from one of three lanes
the spec's "mocap" field names (details in docs/ASSET_PIPELINE.md):
| Lane | Spec value | Lives in | Licence | In the sold pack? |
|---|---|---|---|---|
| CC0 pack | cc0/mesh2motion/human-addon-animations.glb#Pushup |
motions/cc0/ |
CC0 | yes |
| Your own video | video/lunge.json (from pipeline/video_mocap.py) |
motions/video/ |
yours | yes |
| Mixamo | mixamo/air_squat.fbx |
private opengym3d-mocap checkout |
Adobe terms | no |
CI imports the clip headless and retargets it onto the MakeHuman rig by
aiming each bone at the source bone's posed world direction, frame by frame,
carrying the source roll so limbs never flip. A phone clip goes through
Google MediaPipe Pose on your Mac first (pipeline/video_mocap.py, $0,
on-device) and comes out as the same per-bone directions. Specs without amocap field are "status": "draft": kept for their muscle map and form
steps, hidden from the render and the site until they get motion.
assets/ASSET_LIBRARY.json lists every human, motion and implement with its
licence; python3 pipeline/asset_library.py check exercises shows which
renders may ship. Mixamo's terms allow the clips inside a project but not as
redistributed files, so those renders are app-only and the pack takes the
CC0 and own-capture ones.
Joint QA and the rig inspector
A render finishing proves nothing about the rig. Every exported GLB carries
the full skeleton and the baked clip, so CI grades the export itself withpipeline/qa_glb.py (stdlib, no Blender): bone-length drift along each limb,
knee/elbow range, roll flips between adjacent frames, root-relative pops,
planted-foot slide, implement-to-hand distance on every frame, and loop
closure. Critical failures keep the exercise out of the public manifest
— a barbell exercise never ships with empty hands, an arm whose forearm
flips 150° mid-rep never reaches the grid. The report is printed in the run
log and written next to the asset as <id>.glb.qa.json.
inspect.html on the site is the same skeleton, drawn: joint markers
coloured by verdict, hinge angles and hand-to-implement gaps live, front /
side / 3-4 / back / top, frame stepping, a 12-frame strip shot from any
angle, the CI contact sheet, and a QA table whose failing rows seek to the
frame. Excluded exercises stay inspectable there.
python3 pipeline/qa_glb.py site/assets/*.glb # grade, write reports, exit 1 on FAIL
python3 pipeline/make_manifest.py exercises site/exercises.json site/assets
Add or tune an exercise — from your phone
- Open
exercises/on github.com and edit any JSON (or copy one to a new file). - Commit. CI rebuilds and redeploys automatically (~3 min).
Pose format: keyframes at t (0→1 of one rep), per-bone euler rotations in degrees.thigh.* applies to .L and mirrors to .R. loc on pelvis is a world-space
offset in meters (how squats drop the hips).
Bone names: pelvis, spine, chest, neck, head, upper_arm.L/R, forearm.L/R, hand.L/R, thigh.L/R, shin.L/R, foot.L/R.
Muscles in primary / secondary drive the red/orange body-part highlights
(see MUSCLE_BONES in pipeline/build_exercise.py).
Run locally (optional)
blender -b -noaudio -P pipeline/build_exercise.py -- exercises/squat.json /tmp/out
python3 -m http.server -d site 8000 # after copying website/* + assets into site/
Roadmap
| Version | What | Built on |
|---|---|---|
| v0 | Procedural capsule figure, FK pose keyframes, GLB + viewer, full CI pipeline | Blender 4.5 LTS, Three.js r170 |
| v1 | Real anatomical human (male, muscle 1.0), MakeHuman rig, muscles painted via skin-weight territories, A-pose-proof aim retargeting | MPFB2 — the maintained successor to MB-Lab (MB-Lab is archived) |
| v1.5 (this) | Real mocap: Mixamo fitness clips retargeted onto the MakeHuman rig in CI; hand-keyed specs demoted to drafts | Mixamo |
| v2 | Record yourself doing a lift on your phone → animation, no hand-keying | BlendArMocap (MediaPipe → Rigify) or freemocap |
| v3 | Anatomical muscle visualization: per-muscle activation, contraction shading | MuSkeMo + animated normal maps |
| v4 | Full library: hundreds of exercises, search/filter, MP4/GIF export, embed API | this pipeline, scaled |
Layout
exercises/ one JSON per exercise: metadata + pose keyframes
pipeline/ build_exercise.py (Blender headless), qa_glb.py (joint QA), make_manifest.py
website/ static Three.js viewer + inspect.html rig inspector (no build step)
.github/ render & deploy workflow
Tests
python3 -m unittest discover -s tests # stdlib only, ~0.05s
The pose maths needs Blender, but the bugs that actually break the site are
plain data — a muscle name the painter doesn't know, an unsorted rep, a
"Dumbbell" exercise with no prop. CI runs these first and gates the render on
them, so a typo fails in seconds instead of after a 40-minute Blender job.
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi