2D, depth-driven 2.5D, and full 3D

A painted rig can turn in depth without becoming a complete 3D character. The route matters: Core can project actual rotation of a declared surface, Parts chooses a particular projection, and a Three.js scene can host the result.

Capability matrix

These are release-scoped capabilities, checked on 2026-10-27. VERIFIED names an existing playback record and its pins; UNVERIFIED means that combination has no playback evidence here; UNSUPPORTED means the named path does not provide it. A released producer or a green compiler gate alone is not a playback result. On narrow screens, scroll the table horizontally.

RouteRequired inputProducing package / versionControls or rangeOutputVerified playback
Cut-out 2DPainting, layered PSD or See-through layers, corrected config; or authored rig/motion specs and part PNGsParts 1.68.0 → Core 2.74.0Bone transforms, weighted meshes, authored motion; range depends on art and rigNative model + Spine 4.3 exportVERIFIED: recorded Parts idle in Play 1.12.0. This older fixture does not establish every current producer/player pairing.
2D body retarget, with optional depth cuesCleaned body-18 joints, built rig, explicit bone map; depth-derived ordering also needs depth data and target bindingsPose 1.2.1 → Coreclean --depth walk|run; opt-in retarget --draw-order depth, --leg-scale, --plant-feet, --stance, --depth-scaleMotion spec, report, gated native model + Spine exportVERIFIED: swing, Pose 0.35.0 / Core 2.61.0 in Play 1.12.0. UNVERIFIED: these 1.2.1 opt-ins in that playback fixture.
Core depth-driven 2.5D rotationAuthored specs; mesh with a drawing-sized greyscale depth sheet, explicit near / zScale, or a declared cylinder radius; feature depths for bone deriveCore 2.74.0Authored yaw / pitch degrees and axis; default narrowing:true; mesh fold ceiling and feature edge-on limits are construction-specificCompiled 2D deform / bone keys in native model + Spine exportUNVERIFIED: this release's depth-sheet route across Play, adapters and official runtimes. See the projection contract; the standalone preview is a different path.
Released Parts depth-sheet head turnRegistered layer sheets; opt-in config.depth polarity / scale; config.turn.roles with a surface, plus unit / rear parts as neededParts 1.68.0 → Coreyaw_dial / pitch_dial, turn / tilt; default band ±15° yaw / ±12° pitch; narrowing:falseRig/motion specs and depth-sheet companion → native model + Spine exportUNVERIFIED: this producer's depth output with Play, adapters or official runtimes. Release scope is documented in the Parts contract.
Standalone depth previewIts shipped precompiled scene, textures and depth samples, prepared from one painting and its depth mapFrozen preview bundle, separate from npm producersPointer: nominal ±15° yaw / ±12° pitch at gain 1; gain, pivot, gaze and rear counter controlsPreview-specific scene JSON / compressed geometry and browser bundleVERIFIED: the standalone WebGL demo documented with that bundle. UNSUPPORTED: loading this scene format directly as a Play model or Spine export.
Full 3D character reconstruction / toon relightingWould require unseen surfaces, volume and lighting/material information beyond these painted inputsUNSUPPORTED by the routes aboveNo unrestricted orbit or relight control in these producersNo complete 3D character model from these pathsUNSUPPORTED: treating the Three.js adapter as a reconstruction producer. Its supported scene placement is described below.

What the turn means

Core evaluates a rotation, then projects it into the picture. Its mesh transform and bone derive contracts include both u·(cos θ − 1) narrowing and −z·sin θ depth shift. A depth sheet supplies each mesh vertex's z; a radius supplies a cylinder's z. Bone derive can also key the separate foreshortening scale. This is more than sliding each layer at one ordering depth.

Parts 1.68.0 deliberately keeps the front-view proportions. Its shipped producer sets narrowing:false on surface and feature displacement: sine-depth movement remains, cosine narrowing is omitted. The standalone preview also uses sine-depth displacement, but has its own dense geometry and controller. Neither describes every Core turn.

Depth supplies no unseen drawing. Wider Parts bands require a declared alternate face drawing; a Core surface's fold ceiling is a geometric limit, not a guarantee that the face looks right. The face construction guide explains why larger turns can need different eye, cheek and neck art. Pose's depth and feet options estimate constrained cues from 2D joints; they do not reconstruct a rotating 3D body.

Pick the playback path

  • Native model: Play loads skeleton.model.json (rigc-compiled/3) and image pages. It does not load the Spine export. Engine adapters consume Play's posed frames. The recorded walk verifies adapters 0.1.1 with Play 1.10.0; it does not verify new depth producers with today's releases.
  • Spine export: skeleton.json + skeleton.atlas and image pages go to an official Spine runtime or the editor. That is a separate integration; matching file names do not establish feature parity. Use the existing licensing guidance for each path.
  • Three.js host: Three 0.1.1's contract permits translating, rotating and scaling a flat Group in perspective or orthographic scenes, with ordinary 3D occlusion. Its slot vertices remain (x, y, 0) and its shader has no lighting: painted shading and tint are not reconstructed normals or toon relighting.