Lane 0: bootstrap MOCAPGOD
git init + .gitignore (weights/capture/queue/out/media excluded), docs/LICENSES.md skeleton with the SMPL gate, PROGRESS.md ledger, and spec/mixamorig_bones.json — 65 mixamorig bones (colon-prefixed) dumped from character_kit/female/female_game.glb via headless Blender. This bone file is the retarget ground truth for Lane C. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
commit
619d35cc79
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# weights + runtime data stay out of git
|
||||||
|
weights/
|
||||||
|
capture/
|
||||||
|
queue/
|
||||||
|
out/
|
||||||
|
clips_out/
|
||||||
|
*.mp4
|
||||||
|
*.bvh
|
||||||
|
__pycache__/
|
||||||
|
.DS_Store
|
||||||
16
CLAUDE.md
Normal file
16
CLAUDE.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# MOCAPGOD
|
||||||
|
|
||||||
|
Private video→mocap→clip pipeline. **Read PLAN.md before doing anything** — it is the
|
||||||
|
work order; lanes execute one per session, acceptance checks are the definition of done.
|
||||||
|
|
||||||
|
Facts:
|
||||||
|
- Fleet: m3ultra (`m3ultra@100.89.131.57`) = pose engine (inference/training);
|
||||||
|
ultra (this Mac) = Blender glue + orchestration + canonical repo; JING5 = capture.
|
||||||
|
- Skeleton canon: mixamorig 65-joint from `~/Documents/character_kit` (see
|
||||||
|
`spec/mixamorig_bones.json` once Lane 0 runs).
|
||||||
|
- Interchange: BVH 30fps + JSON sidecar → anim-only FBX → `merge_anims.py` → GLB banks.
|
||||||
|
- Legal rails are in PLAN.md §Ground rules — SMPL licensing gate in Lane B is a hard
|
||||||
|
stop for a John-decision; no Cascadeur reverse engineering; no Mixamo-as-training-data.
|
||||||
|
- Long jobs: heartbeat convention (`~/.jobs/`); scheduled jobs use /opt/homebrew/bin/python3
|
||||||
|
(TCC); bulk output through `| lm -l 2`.
|
||||||
|
- Progress ledger: PROGRESS.md (create on Lane 0).
|
||||||
227
PLAN.md
Normal file
227
PLAN.md
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
# MOCAPGOD — private video-to-mocap pipeline
|
||||||
|
|
||||||
|
**Mission:** film John with a phone → extract 3D skeleton motion → retarget onto the
|
||||||
|
character_kit mixamorig rigs → clean → export FBX/GLB clips → feed the existing clip-bank
|
||||||
|
pipeline (merge_anims.py → GLB → three.js games + Unreal + 3GOD depot).
|
||||||
|
100% local, 100% owned, zero cloud, zero subscriptions.
|
||||||
|
|
||||||
|
**Written:** 2026-07-17 by Fable, for execution by Opus 4.8 sessions, one lane at a time.
|
||||||
|
Each lane is a self-contained work order with acceptance checks. Lanes A→D are the v1
|
||||||
|
critical path. Lanes E–F are follow-ons. Do NOT start E/F before D ships.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ground rules (read before any lane)
|
||||||
|
|
||||||
|
1. **Fleet roles**
|
||||||
|
- **m3ultra** (`m3ultra@100.89.131.57`, 256GB) — POSE ENGINE. Model inference, any
|
||||||
|
training. Python via conda/uv there. MODELBEAST lives here; mocap becomes a sibling
|
||||||
|
service, same patterns (job dirs, batch keys — see `MESHGOD/scripts/mb_*` for the
|
||||||
|
client convention).
|
||||||
|
- **ultra** (this Mac, M1 Ultra 128GB) — GLUE + DCC. Blender headless retarget/cleanup/
|
||||||
|
export, orchestration, Unreal verification. Owns the canonical repo.
|
||||||
|
- **JING5** (M5 MBP) — capture companion + portable inference later. Not in v1 critical path.
|
||||||
|
2. **Repo:** `~/Documents/MOCAPGOD` on ultra is canonical. Mirror what's needed to m3ultra
|
||||||
|
under `~/Documents/MOCAPGOD` there too; keep model weights OUT of git (`weights/`,
|
||||||
|
`.gitignore` from day one). Init git in Lane 0.
|
||||||
|
3. **Long jobs** follow the heartbeat convention (`~/.claude/skills/jobs/SKILL.md`, status
|
||||||
|
in `~/.jobs/`). Any script expected >10 min gets a heartbeat. Scheduled jobs touching
|
||||||
|
~/Documents use `/opt/homebrew/bin/python3` (TCC — see memory: cron python trap).
|
||||||
|
4. **Verbose output** (installs, model downloads, test runs) pipes through `| lm -l 2`.
|
||||||
|
5. **Legal rails (hard):**
|
||||||
|
- NO reverse-engineering Cascadeur or extracting its weights. Ever.
|
||||||
|
- **SMPL/SMPL-X body model is research-licensed.** Most SOTA video-mocap models emit
|
||||||
|
SMPL params. Using SMPL-family model files in a commercial pipeline needs a
|
||||||
|
Meshcapade commercial license. Two allowed paths — pick per Lane B findings:
|
||||||
|
(a) obtain the license (cheap tiers exist; John decides), or
|
||||||
|
(b) SMPL-free path: use the model's **joint positions/rotations only**, never the
|
||||||
|
SMPL mesh/shape model files, and verify the chosen inference repo's own license
|
||||||
|
permits commercial use of outputs (many are MIT/Apache code with the SMPL file
|
||||||
|
as a separate user-supplied download — the *outputs* are generally ours, but
|
||||||
|
VERIFY per repo and record findings in `docs/LICENSES.md`).
|
||||||
|
- AMASS dataset (if Lane E trains anything): academic license by default — check
|
||||||
|
commercial terms before training anything shipped. Record in `docs/LICENSES.md`.
|
||||||
|
- Mixamo clips: fine to ship in games per Adobe ToS; do NOT use as ML training data.
|
||||||
|
- Everything decided goes in `docs/LICENSES.md` with links + dates.
|
||||||
|
6. **The treaty (interchange contract)** — every lane speaks this or doesn't ship:
|
||||||
|
- Skeleton: **mixamorig 65-joint** as defined by `~/Documents/character_kit`
|
||||||
|
(`female_game.glb` / male base). Canonical bone list generated in Lane 0.
|
||||||
|
- Intermediate motion format: **BVH at 30fps** + sidecar JSON
|
||||||
|
(`{fps, joint_order, root_trajectory, source_video, model, version}`).
|
||||||
|
BVH because Blender imports it natively and it's human-diffable.
|
||||||
|
- Units metres, Y-up, character faces −Z (three.js convention; Unreal yaw-fix happens
|
||||||
|
at UE import, as established in the A_3D_STORE experiments).
|
||||||
|
- Final artifact: FBX (anim-only, Mixamo-style "Without Skin") dropped into
|
||||||
|
`clips_out/`, then merged to multi-clip GLB via character_kit `merge_anims.py`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
[iPhone/JING5 video] LANE A
|
||||||
|
│ (AirDrop/Tailscale to ultra: capture/inbox/)
|
||||||
|
▼
|
||||||
|
[ingest.py — probe, trim, rename, ship to m3ultra] LANE A
|
||||||
|
│
|
||||||
|
▼ ssh/rsync
|
||||||
|
[m3ultra POSE ENGINE: video → 3D joints] LANE B
|
||||||
|
monocular HMR model (GVHMR/WHAM/TRAM-class, chosen in B1)
|
||||||
|
+ hand pass later (E)
|
||||||
|
│ emits motion.bvh + motion.json
|
||||||
|
▼ rsync back
|
||||||
|
[ultra: Blender headless RETARGET] LANE C
|
||||||
|
bvh → mixamorig, foot-contact fix, jitter filter, QC render (turntable mp4)
|
||||||
|
│ emits clip.fbx + qc.mp4
|
||||||
|
▼
|
||||||
|
[CLIP FACTORY] LANE D
|
||||||
|
merge_anims.py → multi-clip GLB → games / 3GOD depot / Unreal import
|
||||||
|
```
|
||||||
|
|
||||||
|
One CLI to rule it: `mocap <video.mp4> --name dj_scratch_01` runs A→D end-to-end.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## LANE 0 — bootstrap (30 min, ultra)
|
||||||
|
|
||||||
|
Deliverables:
|
||||||
|
- git init MOCAPGOD, `.gitignore` (weights/, capture/, *.mp4, out dirs), `CLAUDE.md`
|
||||||
|
(fleet roles, treaty summary, pointers to this PLAN).
|
||||||
|
- `docs/LICENSES.md` skeleton.
|
||||||
|
- `spec/mixamorig_bones.json`: generate by opening
|
||||||
|
`character_kit/female/female_game.glb` in headless Blender and dumping the armature
|
||||||
|
bone names + rest pose. This file is the retarget ground truth.
|
||||||
|
- Acceptance: `python3 -c "import json; json.load(open('spec/mixamorig_bones.json'))"`
|
||||||
|
lists 65 bones; git log shows initial commit.
|
||||||
|
|
||||||
|
## LANE A — capture + ingest (half day, ultra)
|
||||||
|
|
||||||
|
Goal: friction-free path from "John films a move" to "video queued for the pose engine."
|
||||||
|
|
||||||
|
Tasks:
|
||||||
|
1. `docs/CAPTURE.md` — the recording protocol (keep to one page):
|
||||||
|
- Phone landscape on tripod/lean, 1080p60 (4K unnecessary for pose), full body in
|
||||||
|
frame INCLUDING FEET at all times, 2–3m distance, even light, plain-ish background,
|
||||||
|
fitted clothing (baggy = joint error), start/end in T-pose for 1s (calibration +
|
||||||
|
clip trimming anchor), one move per take, 5–30s takes.
|
||||||
|
- Transfer: AirDrop to ultra → `~/Documents/MOCAPGOD/capture/inbox/`.
|
||||||
|
2. `ingest.py` (ultra): watches/scans inbox; per video: ffprobe sanity (fps, duration,
|
||||||
|
resolution), normalize to 30fps h264 via ffmpeg (`-r 30`), rename
|
||||||
|
`YYYYMMDD_<name>.mp4`, rsync to `m3ultra:~/Documents/MOCAPGOD/queue/`, log to
|
||||||
|
`capture/LEDGER.tsv`.
|
||||||
|
3. Acceptance: drop any phone video in inbox → one command → appears in m3ultra queue,
|
||||||
|
ledger row written, malformed/portrait/no-audio files handled with clear errors.
|
||||||
|
|
||||||
|
## LANE B — pose engine (1–2 days, m3ultra) ← the heart
|
||||||
|
|
||||||
|
Goal: `queue/video.mp4` → `out/<name>/motion.bvh` + `motion.json`, world-grounded
|
||||||
|
(root trajectory included, not just pose-in-place).
|
||||||
|
|
||||||
|
Tasks:
|
||||||
|
1. **B1 — model bake-off (do first, half day).** WebSearch for current-best open
|
||||||
|
monocular human motion recovery ("world-grounded HMR", successors to
|
||||||
|
GVHMR / WHAM / TRAM / 4D-Humans — the field moves fast; July 2026 SOTA may be newer).
|
||||||
|
Selection criteria, in order: (1) permissive code license, (2) world-grounded global
|
||||||
|
trajectory, (3) runs on Apple Silicon (MPS or CPU acceptably; CUDA-only repos often
|
||||||
|
port with `map_location` + MPS fallbacks — budget for this), (4) SMPL-dependency
|
||||||
|
status per the legal rails. Install top 2 candidates in separate uv envs, run both on
|
||||||
|
3 test videos (walk, dance move, pick-up-object), eyeball in Blender. Record the
|
||||||
|
decision + benchmarks in `docs/B1_BAKEOFF.md`.
|
||||||
|
2. **B2 — service-ize.** `pose_engine.py`: consumes queue dir, runs chosen model,
|
||||||
|
converts output (SMPL rotations or joints) → mixamorig-ordered BVH @30fps + sidecar
|
||||||
|
JSON per the treaty. Heartbeat convention. The SMPL→mixamorig joint mapping table
|
||||||
|
lives in `spec/smpl_to_mixamorig.json` (write once, verify visually).
|
||||||
|
3. **B3 — jitter pass.** One-Euro or Savitzky–Golay filter on rotations, configurable;
|
||||||
|
root trajectory smoothed separately (preserve intentional locomotion).
|
||||||
|
4. Acceptance: 10s test video → BVH that imports into Blender with a recognizable,
|
||||||
|
right-way-up, non-sliding-through-floor human motion; runtime < 2× realtime on
|
||||||
|
m3ultra; survives a queue of 5 videos unattended (heartbeat proves it).
|
||||||
|
|
||||||
|
Gotchas from experience: check MPS support early — it decides everything; if the model
|
||||||
|
needs SMPL files, STOP and do the licensing decision before proceeding (present both
|
||||||
|
paths to John); keep every model in its own uv env (their dependency trees fight).
|
||||||
|
|
||||||
|
## LANE C — retarget + cleanup (1 day, ultra)
|
||||||
|
|
||||||
|
Goal: `motion.bvh` → clean `clip.fbx` on the character_kit rig + a QC video proof.
|
||||||
|
|
||||||
|
Tasks:
|
||||||
|
1. `retarget.py` (headless Blender, extends the house style of
|
||||||
|
`character_kit/scripts/merge_anims.py`):
|
||||||
|
- Import BVH → constraint-map bones to mixamorig armature from
|
||||||
|
`spec/mixamorig_bones.json` (name-map table in `spec/`, handles `mixamorig:` vs
|
||||||
|
`mixamorig_` variants — this bit us before), bake to keyframes.
|
||||||
|
- Foot-contact fix: detect frames where foot velocity ≈ 0 & height < threshold → IK
|
||||||
|
pin. `# ponytail: threshold heuristic, upgrade to learned contact detection in Lane E if it annoys`.
|
||||||
|
- Trim the T-pose bookends (Lane A protocol guarantees them), root-motion option
|
||||||
|
(in-place vs traveling) as a flag.
|
||||||
|
- Export anim-only FBX (Mixamo "Without Skin" style — merge_anims.py already eats these).
|
||||||
|
2. QC render: 3-second turntable mp4 of the clip on the female_game body, written next
|
||||||
|
to the FBX. **Verify with own eyes** (the rule) — every clip gets its mp4 looked at
|
||||||
|
before entering the bank.
|
||||||
|
3. Acceptance: full chain A→C on one video of John walking produces an FBX that
|
||||||
|
`merge_anims.py` merges into `female_game.glb` without errors, and the QC mp4 shows
|
||||||
|
walking, not soup.
|
||||||
|
|
||||||
|
## LANE D — clip factory + integration (half day, ultra)
|
||||||
|
|
||||||
|
Goal: one command end-to-end; clips land everywhere they should.
|
||||||
|
|
||||||
|
Tasks:
|
||||||
|
1. `mocap` CLI (single script): `mocap capture/inbox/vid.mp4 --name dj_scratch_01
|
||||||
|
[--character female|male|both] [--in-place]` → runs A ingest → waits on B (ssh) → C →
|
||||||
|
drops `clips_out/dj_scratch_01.fbx` + QC mp4, optionally re-merges the character's
|
||||||
|
clip-bank GLB.
|
||||||
|
2. Publish hooks (flags, off by default): `--publish-3god` (depot pattern from procity
|
||||||
|
`publish.py`), `--to-unreal` (import via the established A_3D_STORE deferred-import
|
||||||
|
pattern; see memory: unreal-asset-convergence — slate post-tick, NOT direct
|
||||||
|
AssetImportTask through the bridge).
|
||||||
|
3. `docs/RUNBOOK.md`: the whole flow on one page, written for future-John.
|
||||||
|
4. Acceptance: film a 10s move → ONE command → new clip playable in 90sDJsim dev build
|
||||||
|
AND visible on a character in Unreal. That's the v1 finish line. Take the win, stop.
|
||||||
|
|
||||||
|
## LANE E — ML upgrades (post-v1, m3ultra, MLX territory; each item independent)
|
||||||
|
|
||||||
|
- E1: hand/finger pass (MediaPipe Hands or successor) blended onto body clips —
|
||||||
|
DJ work needs fingers eventually.
|
||||||
|
- E2: custom autoposer — MLP (6 control points → full pose) trained in MLX on
|
||||||
|
licensed/open mocap; our own baby Cascadeur-autopose for procedural NPC posing in
|
||||||
|
games at runtime. Check AMASS commercial terms FIRST (docs/LICENSES.md).
|
||||||
|
- E3: inbetweening/motion generation (current open motion-diffusion lineage) for
|
||||||
|
clip variation + transitions.
|
||||||
|
- E4: quadruped/centaur retarget experiments (front-half human map + back-half horse
|
||||||
|
chain) — feeds the centaur RPG. Cascadeur Pro handles the authored side; this is the
|
||||||
|
generated side.
|
||||||
|
- E5: style filter — train small nets on OUR OWN authored/captured clip library
|
||||||
|
(which we fully own) to stylize mocap output.
|
||||||
|
|
||||||
|
## LANE F — UX (optional, whenever it annoys)
|
||||||
|
|
||||||
|
- Drop-folder daemon (launchd on ultra; remember TCC python path) so AirDropped videos
|
||||||
|
auto-process; notification with QC mp4 when done.
|
||||||
|
- Tiny web dashboard on tailnet listing clips + QC videos (stdlib http.server, house style).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Effort + risk summary
|
||||||
|
|
||||||
|
| Lane | Effort | Risk | Mitigation |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 0+A | ~1 day | trivial | — |
|
||||||
|
| B | 1–2 days | MPS compat; SMPL licensing | bake-off first; legal rails decision gate |
|
||||||
|
| C | 1 day | retarget quality (feet, drift) | contact-fix pass + human QC gate |
|
||||||
|
| D | half day | none new | reuses proven pieces |
|
||||||
|
| E | open-ended | dataset licenses | per-item gates |
|
||||||
|
|
||||||
|
v1 total: **~3–4 focused days of agent work.** Quality expectation: solid for stylized
|
||||||
|
NPC/DJ clips; not Vicon; fingers come in E1. Cascadeur (bought separately) remains the
|
||||||
|
authoring/polish tool — its "animation unbaking" even cleans OUR mocap output, fully
|
||||||
|
within its license.
|
||||||
|
|
||||||
|
## Session protocol for Opus
|
||||||
|
|
||||||
|
One lane per session. Read this file + `CLAUDE.md` + the lane's acceptance checks first.
|
||||||
|
On completion: tick the lane in `PROGRESS.md`, commit, update `docs/` with anything
|
||||||
|
learned, leave gotchas for the next lane. Do not gold-plate; every lane's acceptance
|
||||||
|
check is the definition of done. When blocked on a John-decision (licenses, purchases),
|
||||||
|
write the decision memo in `docs/DECISIONS.md` and stop the lane there.
|
||||||
20
PROGRESS.md
Normal file
20
PROGRESS.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# MOCAPGOD progress ledger
|
||||||
|
|
||||||
|
One lane per session. Tick on completion. See PLAN.md for acceptance checks.
|
||||||
|
|
||||||
|
- [x] **Lane 0** — bootstrap. git + .gitignore, docs/LICENSES.md skeleton,
|
||||||
|
spec/mixamorig_bones.json (65 bones, `mixamorig:` colon-prefixed). — 2026-07-17
|
||||||
|
- [x] **Lane A** — capture + ingest. docs/CAPTURE.md protocol, ingest.py
|
||||||
|
(probe → 30fps normalize → rename → rsync to m3ultra queue → LEDGER.tsv). — 2026-07-17
|
||||||
|
- [ ] **Lane B** — pose engine (m3ultra). Model bake-off, service-ize, jitter pass.
|
||||||
|
- [ ] **Lane C** — retarget + cleanup (Blender). bvh → mixamorig FBX + QC turntable.
|
||||||
|
- [ ] **Lane D** — clip factory. `mocap` CLI end-to-end; games + Unreal integration.
|
||||||
|
- [ ] Lane E — ML upgrades (post-v1, gated).
|
||||||
|
- [ ] Lane F — UX (optional).
|
||||||
|
|
||||||
|
## Notes for the next lane
|
||||||
|
- Ground-truth skeleton naming is **`mixamorig:`** (colon), armature object named `Armature`.
|
||||||
|
Lane C's name-map must handle colon vs underscore variants (PLAN warned about this).
|
||||||
|
- Blender headless entrypoint: `/Applications/Blender.app/Contents/MacOS/Blender --background --python <script>`.
|
||||||
|
- House style for Blender scripts: `~/Documents/character_kit/scripts/merge_anims.py`
|
||||||
|
(note its units warning: mixamorig head sits at ~0.0505 native units — don't rescale via parent).
|
||||||
24
docs/LICENSES.md
Normal file
24
docs/LICENSES.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Licenses & legal findings
|
||||||
|
|
||||||
|
Every third-party model/dataset/tool that touches the pipeline gets a row here with
|
||||||
|
its license, commercial status, link, and the date checked. Skeleton now; Lane B fills
|
||||||
|
the pose-model rows, Lane E fills any training-dataset rows. See PLAN.md §Ground rules.
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
| Component | Version | License | Commercial OK? | Notes | Checked |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| _pose model (Lane B1 winner)_ | — | — | — | fill after bake-off | — |
|
||||||
|
| SMPL / SMPL-X body model | — | research (Meshcapade) | **NO** by default | commercial needs Meshcapade license; or use joints-only path (PLAN §5) | — |
|
||||||
|
| AMASS dataset | — | academic | **verify** before any shipped training | Lane E only | — |
|
||||||
|
| Mixamo clips | — | Adobe ToS | ship-in-game OK; **not** ML training data | — | — |
|
||||||
|
|
||||||
|
## The SMPL gate (hard stop — John decision)
|
||||||
|
|
||||||
|
Most SOTA monocular mocap models emit SMPL parameters. Before any commercial use:
|
||||||
|
- **Path A:** buy a Meshcapade commercial license (cheap tiers exist).
|
||||||
|
- **Path B (SMPL-free):** use only the model's joint positions/rotations, never the SMPL
|
||||||
|
mesh/shape files, AND confirm the inference repo's own code license permits commercial
|
||||||
|
use of outputs.
|
||||||
|
|
||||||
|
Lane B writes the decision to `docs/DECISIONS.md` and stops there if unresolved.
|
||||||
33
spec/dump_bones.py
Normal file
33
spec/dump_bones.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# Lane 0: dump the mixamorig armature (names + rest pose) from character_kit → ground truth.
|
||||||
|
# Run: Blender --background --python spec/dump_bones.py
|
||||||
|
import bpy, json, os, sys
|
||||||
|
|
||||||
|
GLB = os.path.expanduser("~/Documents/character_kit/female/female_game.glb")
|
||||||
|
OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "mixamorig_bones.json")
|
||||||
|
|
||||||
|
bpy.ops.wm.read_factory_settings(use_empty=True)
|
||||||
|
bpy.ops.import_scene.gltf(filepath=GLB)
|
||||||
|
|
||||||
|
arm = next((o for o in bpy.data.objects if o.type == "ARMATURE"), None)
|
||||||
|
if arm is None:
|
||||||
|
sys.exit("no armature in " + GLB)
|
||||||
|
|
||||||
|
def v(x): # round rest coords, they're the reference not gospel
|
||||||
|
return [round(c, 6) for c in x]
|
||||||
|
|
||||||
|
bones = [{
|
||||||
|
"name": b.name,
|
||||||
|
"parent": b.parent.name if b.parent else None,
|
||||||
|
"head": v(b.head_local), # armature-space rest pose
|
||||||
|
"tail": v(b.tail_local),
|
||||||
|
} for b in arm.data.bones]
|
||||||
|
|
||||||
|
json.dump({
|
||||||
|
"source": os.path.relpath(GLB, os.path.expanduser("~/Documents")),
|
||||||
|
"armature": arm.name,
|
||||||
|
"count": len(bones),
|
||||||
|
"units": "metres, Y-up (Blender Z-up native; glTF import applies +90X)",
|
||||||
|
"joint_order": [b["name"] for b in bones],
|
||||||
|
"bones": bones,
|
||||||
|
}, open(OUT, "w"), indent=1)
|
||||||
|
print("===DUMP=== %d bones -> %s" % (len(bones), OUT))
|
||||||
985
spec/mixamorig_bones.json
Normal file
985
spec/mixamorig_bones.json
Normal file
@ -0,0 +1,985 @@
|
|||||||
|
{
|
||||||
|
"source": "character_kit/female/female_game.glb",
|
||||||
|
"armature": "Armature",
|
||||||
|
"count": 65,
|
||||||
|
"units": "metres, Y-up (Blender Z-up native; glTF import applies +90X)",
|
||||||
|
"joint_order": [
|
||||||
|
"mixamorig:Hips",
|
||||||
|
"mixamorig:Spine",
|
||||||
|
"mixamorig:Spine1",
|
||||||
|
"mixamorig:Spine2",
|
||||||
|
"mixamorig:Neck",
|
||||||
|
"mixamorig:Head",
|
||||||
|
"mixamorig:HeadTop_End",
|
||||||
|
"mixamorig:LeftShoulder",
|
||||||
|
"mixamorig:LeftArm",
|
||||||
|
"mixamorig:LeftForeArm",
|
||||||
|
"mixamorig:LeftHand",
|
||||||
|
"mixamorig:LeftHandThumb1",
|
||||||
|
"mixamorig:LeftHandThumb2",
|
||||||
|
"mixamorig:LeftHandThumb3",
|
||||||
|
"mixamorig:LeftHandThumb4",
|
||||||
|
"mixamorig:LeftHandIndex1",
|
||||||
|
"mixamorig:LeftHandIndex2",
|
||||||
|
"mixamorig:LeftHandIndex3",
|
||||||
|
"mixamorig:LeftHandIndex4",
|
||||||
|
"mixamorig:LeftHandMiddle1",
|
||||||
|
"mixamorig:LeftHandMiddle2",
|
||||||
|
"mixamorig:LeftHandMiddle3",
|
||||||
|
"mixamorig:LeftHandMiddle4",
|
||||||
|
"mixamorig:LeftHandRing1",
|
||||||
|
"mixamorig:LeftHandRing2",
|
||||||
|
"mixamorig:LeftHandRing3",
|
||||||
|
"mixamorig:LeftHandRing4",
|
||||||
|
"mixamorig:LeftHandPinky1",
|
||||||
|
"mixamorig:LeftHandPinky2",
|
||||||
|
"mixamorig:LeftHandPinky3",
|
||||||
|
"mixamorig:LeftHandPinky4",
|
||||||
|
"mixamorig:RightShoulder",
|
||||||
|
"mixamorig:RightArm",
|
||||||
|
"mixamorig:RightForeArm",
|
||||||
|
"mixamorig:RightHand",
|
||||||
|
"mixamorig:RightHandThumb1",
|
||||||
|
"mixamorig:RightHandThumb2",
|
||||||
|
"mixamorig:RightHandThumb3",
|
||||||
|
"mixamorig:RightHandThumb4",
|
||||||
|
"mixamorig:RightHandIndex1",
|
||||||
|
"mixamorig:RightHandIndex2",
|
||||||
|
"mixamorig:RightHandIndex3",
|
||||||
|
"mixamorig:RightHandIndex4",
|
||||||
|
"mixamorig:RightHandMiddle1",
|
||||||
|
"mixamorig:RightHandMiddle2",
|
||||||
|
"mixamorig:RightHandMiddle3",
|
||||||
|
"mixamorig:RightHandMiddle4",
|
||||||
|
"mixamorig:RightHandRing1",
|
||||||
|
"mixamorig:RightHandRing2",
|
||||||
|
"mixamorig:RightHandRing3",
|
||||||
|
"mixamorig:RightHandRing4",
|
||||||
|
"mixamorig:RightHandPinky1",
|
||||||
|
"mixamorig:RightHandPinky2",
|
||||||
|
"mixamorig:RightHandPinky3",
|
||||||
|
"mixamorig:RightHandPinky4",
|
||||||
|
"mixamorig:LeftUpLeg",
|
||||||
|
"mixamorig:LeftLeg",
|
||||||
|
"mixamorig:LeftFoot",
|
||||||
|
"mixamorig:LeftToeBase",
|
||||||
|
"mixamorig:LeftToe_End",
|
||||||
|
"mixamorig:RightUpLeg",
|
||||||
|
"mixamorig:RightLeg",
|
||||||
|
"mixamorig:RightFoot",
|
||||||
|
"mixamorig:RightToeBase",
|
||||||
|
"mixamorig:RightToe_End"
|
||||||
|
],
|
||||||
|
"bones": [
|
||||||
|
{
|
||||||
|
"name": "mixamorig:Hips",
|
||||||
|
"parent": null,
|
||||||
|
"head": [
|
||||||
|
-0.789225,
|
||||||
|
9466.236328,
|
||||||
|
-151.250061
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-0.789225,
|
||||||
|
96222.648438,
|
||||||
|
-151.250061
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:Spine",
|
||||||
|
"parent": "mixamorig:Hips",
|
||||||
|
"head": [
|
||||||
|
-0.789225,
|
||||||
|
10329.720703,
|
||||||
|
-235.288574
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-0.789225,
|
||||||
|
111068.320312,
|
||||||
|
-10042.535156
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:Spine1",
|
||||||
|
"parent": "mixamorig:Spine",
|
||||||
|
"head": [
|
||||||
|
-0.789225,
|
||||||
|
11337.109375,
|
||||||
|
-333.333954
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-0.789225,
|
||||||
|
126466.703125,
|
||||||
|
-11543.357422
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:Spine2",
|
||||||
|
"parent": "mixamorig:Spine1",
|
||||||
|
"head": [
|
||||||
|
-0.789225,
|
||||||
|
12488.410156,
|
||||||
|
-445.384796
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-0.789225,
|
||||||
|
142009.34375,
|
||||||
|
-13056.675781
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:Neck",
|
||||||
|
"parent": "mixamorig:Spine2",
|
||||||
|
"head": [
|
||||||
|
-0.789225,
|
||||||
|
13783.625,
|
||||||
|
-571.441833
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-0.789225,
|
||||||
|
85067.46875,
|
||||||
|
-571.441833
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:Head",
|
||||||
|
"parent": "mixamorig:Neck",
|
||||||
|
"head": [
|
||||||
|
-0.789225,
|
||||||
|
14487.500977,
|
||||||
|
-458.759033
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-0.789225,
|
||||||
|
252447.953125,
|
||||||
|
-458.759033
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:HeadTop_End",
|
||||||
|
"parent": "mixamorig:Head",
|
||||||
|
"head": [
|
||||||
|
-0.789225,
|
||||||
|
16837.1875,
|
||||||
|
-82.598572
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-0.789225,
|
||||||
|
254797.640625,
|
||||||
|
-82.598572
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftShoulder",
|
||||||
|
"parent": "mixamorig:Spine2",
|
||||||
|
"head": [
|
||||||
|
442.507721,
|
||||||
|
13706.248047,
|
||||||
|
-574.602051
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
88047.03125,
|
||||||
|
-1489.208984,
|
||||||
|
-1204.128174
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftArm",
|
||||||
|
"parent": "mixamorig:LeftShoulder",
|
||||||
|
"head": [
|
||||||
|
1318.595825,
|
||||||
|
13554.541992,
|
||||||
|
-580.922485
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
208370.921875,
|
||||||
|
-104744.4375,
|
||||||
|
190.466003
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftForeArm",
|
||||||
|
"parent": "mixamorig:LeftArm",
|
||||||
|
"head": [
|
||||||
|
3389.101318,
|
||||||
|
12371.521484,
|
||||||
|
-573.214294
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
231106.125,
|
||||||
|
-111745.664062,
|
||||||
|
-1380.609131
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHand",
|
||||||
|
"parent": "mixamorig:LeftForeArm",
|
||||||
|
"head": [
|
||||||
|
5666.025391,
|
||||||
|
11129.896484,
|
||||||
|
-581.278625
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
40293.351562,
|
||||||
|
-8529.238281,
|
||||||
|
-2522.861572
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandThumb1",
|
||||||
|
"parent": "mixamorig:LeftHand",
|
||||||
|
"head": [
|
||||||
|
5936.674316,
|
||||||
|
10944.513672,
|
||||||
|
-354.756042
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
27611.511719,
|
||||||
|
-3879.083008,
|
||||||
|
17744.591797
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandThumb2",
|
||||||
|
"parent": "mixamorig:LeftHandThumb1",
|
||||||
|
"head": [
|
||||||
|
6153.185547,
|
||||||
|
10796.202148,
|
||||||
|
-173.540527
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
26929.759766,
|
||||||
|
-1141.089844,
|
||||||
|
16353.035156
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandThumb3",
|
||||||
|
"parent": "mixamorig:LeftHandThumb2",
|
||||||
|
"head": [
|
||||||
|
6361.293945,
|
||||||
|
10676.62793,
|
||||||
|
-8.852399
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
26528.636719,
|
||||||
|
3037.48291,
|
||||||
|
14642.342773
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandThumb4",
|
||||||
|
"parent": "mixamorig:LeftHandThumb3",
|
||||||
|
"head": [
|
||||||
|
6562.767578,
|
||||||
|
10600.321289,
|
||||||
|
137.978195
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
26730.089844,
|
||||||
|
2961.184082,
|
||||||
|
14789.208008
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandIndex1",
|
||||||
|
"parent": "mixamorig:LeftHand",
|
||||||
|
"head": [
|
||||||
|
6597.790527,
|
||||||
|
10588.286133,
|
||||||
|
-409.299316
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
25725.089844,
|
||||||
|
458.958984,
|
||||||
|
116.727844
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandIndex2",
|
||||||
|
"parent": "mixamorig:LeftHandIndex1",
|
||||||
|
"head": [
|
||||||
|
6789.022461,
|
||||||
|
10486.916016,
|
||||||
|
-404.033234
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
24523.035156,
|
||||||
|
347.490234,
|
||||||
|
104.93399
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandIndex3",
|
||||||
|
"parent": "mixamorig:LeftHandIndex2",
|
||||||
|
"head": [
|
||||||
|
6966.322266,
|
||||||
|
10385.450195,
|
||||||
|
-398.955414
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
23263.535156,
|
||||||
|
1918.432617,
|
||||||
|
44.464233
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandIndex4",
|
||||||
|
"parent": "mixamorig:LeftHandIndex3",
|
||||||
|
"head": [
|
||||||
|
7129.262695,
|
||||||
|
10300.71875,
|
||||||
|
-394.512909
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
23426.476562,
|
||||||
|
1833.701172,
|
||||||
|
48.906738
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandMiddle1",
|
||||||
|
"parent": "mixamorig:LeftHand",
|
||||||
|
"head": [
|
||||||
|
6628.808594,
|
||||||
|
10601.523438,
|
||||||
|
-560.583801
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
25259.472656,
|
||||||
|
175.857422,
|
||||||
|
-597.073608
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandMiddle2",
|
||||||
|
"parent": "mixamorig:LeftHandMiddle1",
|
||||||
|
"head": [
|
||||||
|
6815.149902,
|
||||||
|
10497.329102,
|
||||||
|
-560.967102
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
26283.472656,
|
||||||
|
-224.355469,
|
||||||
|
-601.661743
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandMiddle3",
|
||||||
|
"parent": "mixamorig:LeftHandMiddle2",
|
||||||
|
"head": [
|
||||||
|
7009.799805,
|
||||||
|
10390.051758,
|
||||||
|
-561.37616
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
25539.234375,
|
||||||
|
3322.921875,
|
||||||
|
-647.295044
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandMiddle4",
|
||||||
|
"parent": "mixamorig:LeftHandMiddle3",
|
||||||
|
"head": [
|
||||||
|
7195.093262,
|
||||||
|
10319.376953,
|
||||||
|
-562.207458
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
25724.527344,
|
||||||
|
3252.24707,
|
||||||
|
-648.126343
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandRing1",
|
||||||
|
"parent": "mixamorig:LeftHand",
|
||||||
|
"head": [
|
||||||
|
6611.787109,
|
||||||
|
10594.608398,
|
||||||
|
-709.329651
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
22724.742188,
|
||||||
|
864.296875,
|
||||||
|
-1340.466309
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandRing2",
|
||||||
|
"parent": "mixamorig:LeftHandRing1",
|
||||||
|
"head": [
|
||||||
|
6772.956543,
|
||||||
|
10497.37793,
|
||||||
|
-715.746765
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
23769.109375,
|
||||||
|
932.27832,
|
||||||
|
-1381.445312
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandRing3",
|
||||||
|
"parent": "mixamorig:LeftHandRing2",
|
||||||
|
"head": [
|
||||||
|
6942.910156,
|
||||||
|
10401.706055,
|
||||||
|
-722.302124
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
19245.6875,
|
||||||
|
-795.93457,
|
||||||
|
-1207.831177
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandRing4",
|
||||||
|
"parent": "mixamorig:LeftHandRing3",
|
||||||
|
"head": [
|
||||||
|
7065.902832,
|
||||||
|
10289.691406,
|
||||||
|
-727.157776
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
19368.681641,
|
||||||
|
-907.949219,
|
||||||
|
-1212.68689
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandPinky1",
|
||||||
|
"parent": "mixamorig:LeftHand",
|
||||||
|
"head": [
|
||||||
|
6523.467773,
|
||||||
|
10637.009766,
|
||||||
|
-853.324585
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
20784.412109,
|
||||||
|
955.730469,
|
||||||
|
-1099.565796
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandPinky2",
|
||||||
|
"parent": "mixamorig:LeftHandPinky1",
|
||||||
|
"head": [
|
||||||
|
6666.083984,
|
||||||
|
10540.208008,
|
||||||
|
-855.844788
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
19741.429688,
|
||||||
|
3601.384766,
|
||||||
|
-1097.077393
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandPinky3",
|
||||||
|
"parent": "mixamorig:LeftHandPinky2",
|
||||||
|
"head": [
|
||||||
|
6796.808594,
|
||||||
|
10470.764648,
|
||||||
|
-858.250488
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
19782.582031,
|
||||||
|
6344.070801,
|
||||||
|
-1120.328857
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftHandPinky4",
|
||||||
|
"parent": "mixamorig:LeftHandPinky3",
|
||||||
|
"head": [
|
||||||
|
6926.664551,
|
||||||
|
10429.489258,
|
||||||
|
-860.820496
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
19912.4375,
|
||||||
|
6302.79541,
|
||||||
|
-1122.898804
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightShoulder",
|
||||||
|
"parent": "mixamorig:Spine2",
|
||||||
|
"head": [
|
||||||
|
-444.086426,
|
||||||
|
13706.254883,
|
||||||
|
-568.281982
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-88050.125,
|
||||||
|
-1489.464844,
|
||||||
|
61.255005
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightArm",
|
||||||
|
"parent": "mixamorig:RightShoulder",
|
||||||
|
"head": [
|
||||||
|
-1320.188232,
|
||||||
|
13554.538086,
|
||||||
|
-561.957397
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-208372.546875,
|
||||||
|
-104744.46875,
|
||||||
|
-2221.170898
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightForeArm",
|
||||||
|
"parent": "mixamorig:RightArm",
|
||||||
|
"head": [
|
||||||
|
-3390.705566,
|
||||||
|
12371.538086,
|
||||||
|
-578.588135
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-231104.859375,
|
||||||
|
-111744.070312,
|
||||||
|
-673.574585
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHand",
|
||||||
|
"parent": "mixamorig:RightForeArm",
|
||||||
|
"head": [
|
||||||
|
-5667.604492,
|
||||||
|
11129.9375,
|
||||||
|
-579.476501
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-39838.847656,
|
||||||
|
-8479.037109,
|
||||||
|
-2616.459961
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandThumb1",
|
||||||
|
"parent": "mixamorig:RightHand",
|
||||||
|
"head": [
|
||||||
|
-5934.709961,
|
||||||
|
10946.12207,
|
||||||
|
-354.75415
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-27219.601562,
|
||||||
|
-3695.910156,
|
||||||
|
17772.466797
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandThumb2",
|
||||||
|
"parent": "mixamorig:RightHandThumb1",
|
||||||
|
"head": [
|
||||||
|
-6148.393066,
|
||||||
|
10799.077148,
|
||||||
|
-174.975739
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-26944.269531,
|
||||||
|
-1260.239258,
|
||||||
|
16634.84375
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandThumb3",
|
||||||
|
"parent": "mixamorig:RightHandThumb2",
|
||||||
|
"head": [
|
||||||
|
-6358.204102,
|
||||||
|
10677.383789,
|
||||||
|
-10.001045
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-25006.152344,
|
||||||
|
505.775391,
|
||||||
|
14820.926758
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandThumb4",
|
||||||
|
"parent": "mixamorig:RightHandThumb3",
|
||||||
|
"head": [
|
||||||
|
-6542.012207,
|
||||||
|
10577.450195,
|
||||||
|
142.787064
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-25190.001953,
|
||||||
|
405.819336,
|
||||||
|
14973.646484
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandIndex1",
|
||||||
|
"parent": "mixamorig:RightHand",
|
||||||
|
"head": [
|
||||||
|
-6565.821777,
|
||||||
|
10625.561523,
|
||||||
|
-408.567749
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-26418.222656,
|
||||||
|
-1912.795898,
|
||||||
|
886.029175
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandIndex2",
|
||||||
|
"parent": "mixamorig:RightHandIndex1",
|
||||||
|
"head": [
|
||||||
|
-6764.312012,
|
||||||
|
10500.107422,
|
||||||
|
-395.788574
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-25917.001953,
|
||||||
|
-92.72168,
|
||||||
|
741.736694
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandIndex3",
|
||||||
|
"parent": "mixamorig:RightHandIndex2",
|
||||||
|
"head": [
|
||||||
|
-6955.79248,
|
||||||
|
10394.117188,
|
||||||
|
-384.206177
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-23732.816406,
|
||||||
|
145.230469,
|
||||||
|
684.78833
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandIndex4",
|
||||||
|
"parent": "mixamorig:RightHandIndex3",
|
||||||
|
"head": [
|
||||||
|
-7123.512207,
|
||||||
|
10291.541992,
|
||||||
|
-373.55481
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-23900.535156,
|
||||||
|
42.655273,
|
||||||
|
695.439697
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandMiddle1",
|
||||||
|
"parent": "mixamorig:RightHand",
|
||||||
|
"head": [
|
||||||
|
-6635.340332,
|
||||||
|
10581.800781,
|
||||||
|
-574.067993
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-24758.15625,
|
||||||
|
2170.779297,
|
||||||
|
803.72583
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandMiddle2",
|
||||||
|
"parent": "mixamorig:RightHandMiddle1",
|
||||||
|
"head": [
|
||||||
|
-6816.533203,
|
||||||
|
10497.678711,
|
||||||
|
-559.903076
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-25262.244141,
|
||||||
|
246.617188,
|
||||||
|
986.281494
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandMiddle3",
|
||||||
|
"parent": "mixamorig:RightHandMiddle2",
|
||||||
|
"head": [
|
||||||
|
-7000.961426,
|
||||||
|
10395.112305,
|
||||||
|
-544.467529
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-21629.75,
|
||||||
|
796.844727,
|
||||||
|
806.360229
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandMiddle4",
|
||||||
|
"parent": "mixamorig:RightHandMiddle3",
|
||||||
|
"head": [
|
||||||
|
-7147.250488,
|
||||||
|
10299.079102,
|
||||||
|
-531.332397
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-21776.039062,
|
||||||
|
700.811523,
|
||||||
|
819.495361
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandRing1",
|
||||||
|
"parent": "mixamorig:RightHand",
|
||||||
|
"head": [
|
||||||
|
-6623.062012,
|
||||||
|
10576.748047,
|
||||||
|
-705.524963
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-23174.042969,
|
||||||
|
1778.883789,
|
||||||
|
-1581.874756
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandRing2",
|
||||||
|
"parent": "mixamorig:RightHandRing1",
|
||||||
|
"head": [
|
||||||
|
-6788.567871,
|
||||||
|
10488.748047,
|
||||||
|
-714.146545
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-23349.103516,
|
||||||
|
714.084961,
|
||||||
|
-1565.905029
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandRing3",
|
||||||
|
"parent": "mixamorig:RightHandRing2",
|
||||||
|
"head": [
|
||||||
|
-6954.165527,
|
||||||
|
10390.993164,
|
||||||
|
-722.717468
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-20906.033203,
|
||||||
|
2007.145508,
|
||||||
|
-1436.617188
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandRing4",
|
||||||
|
"parent": "mixamorig:RightHandRing3",
|
||||||
|
"head": [
|
||||||
|
-7093.674316,
|
||||||
|
10307.145508,
|
||||||
|
-729.937439
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-21045.542969,
|
||||||
|
1923.297852,
|
||||||
|
-1443.837158
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandPinky1",
|
||||||
|
"parent": "mixamorig:RightHand",
|
||||||
|
"head": [
|
||||||
|
-6513.206543,
|
||||||
|
10618.483398,
|
||||||
|
-847.997803
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-22390.753906,
|
||||||
|
2783.484863,
|
||||||
|
-1383.08667
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandPinky2",
|
||||||
|
"parent": "mixamorig:RightHandPinky1",
|
||||||
|
"head": [
|
||||||
|
-6671.937988,
|
||||||
|
10540.050781,
|
||||||
|
-853.450745
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-19410.054688,
|
||||||
|
3466.481445,
|
||||||
|
-1255.519775
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandPinky3",
|
||||||
|
"parent": "mixamorig:RightHandPinky2",
|
||||||
|
"head": [
|
||||||
|
-6799.26709,
|
||||||
|
10469.234375,
|
||||||
|
-857.699768
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-19322.640625,
|
||||||
|
5672.211914,
|
||||||
|
-1328.71875
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightHandPinky4",
|
||||||
|
"parent": "mixamorig:RightHandPinky3",
|
||||||
|
"head": [
|
||||||
|
-6924.52002,
|
||||||
|
10421.283203,
|
||||||
|
-862.085754
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-19447.894531,
|
||||||
|
5624.260742,
|
||||||
|
-1333.104736
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftUpLeg",
|
||||||
|
"parent": "mixamorig:Hips",
|
||||||
|
"head": [
|
||||||
|
886.457642,
|
||||||
|
8985.595703,
|
||||||
|
-193.996872
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-9554.929688,
|
||||||
|
-408262.4375,
|
||||||
|
-1658.337769
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftLeg",
|
||||||
|
"parent": "mixamorig:LeftUpLeg",
|
||||||
|
"head": [
|
||||||
|
781.932251,
|
||||||
|
4813.119629,
|
||||||
|
-208.640701
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-8360.658203,
|
||||||
|
-399833.0,
|
||||||
|
4053.783203
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftFoot",
|
||||||
|
"parent": "mixamorig:LeftLeg",
|
||||||
|
"head": [
|
||||||
|
690.580444,
|
||||||
|
766.657715,
|
||||||
|
-166.041107
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-5178.653809,
|
||||||
|
-67254.273438,
|
||||||
|
107355.617188
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftToeBase",
|
||||||
|
"parent": "mixamorig:LeftFoot",
|
||||||
|
"head": [
|
||||||
|
631.921875,
|
||||||
|
86.424805,
|
||||||
|
909.162231
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-4442.078613,
|
||||||
|
-1651.948608,
|
||||||
|
52295.636719
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:LeftToe_End",
|
||||||
|
"parent": "mixamorig:LeftToeBase",
|
||||||
|
"head": [
|
||||||
|
581.169006,
|
||||||
|
69.043587,
|
||||||
|
1423.025879
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
-4492.523438,
|
||||||
|
-1669.224365,
|
||||||
|
52809.539062
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightUpLeg",
|
||||||
|
"parent": "mixamorig:Hips",
|
||||||
|
"head": [
|
||||||
|
-888.036194,
|
||||||
|
8985.594727,
|
||||||
|
-137.668762
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
9563.602539,
|
||||||
|
-408264.1875,
|
||||||
|
-8409.758789
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightLeg",
|
||||||
|
"parent": "mixamorig:RightUpLeg",
|
||||||
|
"head": [
|
||||||
|
-783.510376,
|
||||||
|
4813.095215,
|
||||||
|
-220.262909
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
8359.009766,
|
||||||
|
-399829.96875,
|
||||||
|
4591.915527
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightFoot",
|
||||||
|
"parent": "mixamorig:RightLeg",
|
||||||
|
"head": [
|
||||||
|
-692.159668,
|
||||||
|
766.664001,
|
||||||
|
-172.128296
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
5172.104004,
|
||||||
|
-67254.085938,
|
||||||
|
109036.03125
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightToeBase",
|
||||||
|
"parent": "mixamorig:RightFoot",
|
||||||
|
"head": [
|
||||||
|
-633.502808,
|
||||||
|
86.396927,
|
||||||
|
919.915161
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
4442.318848,
|
||||||
|
-1651.50293,
|
||||||
|
52424.015625
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mixamorig:RightToe_End",
|
||||||
|
"parent": "mixamorig:RightToeBase",
|
||||||
|
"head": [
|
||||||
|
-582.748291,
|
||||||
|
69.009033,
|
||||||
|
1434.956177
|
||||||
|
],
|
||||||
|
"tail": [
|
||||||
|
4493.073242,
|
||||||
|
-1668.890869,
|
||||||
|
52939.058594
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user