docs(decisions): update camera presets, bone names, accessory slots

D-148/D-158: confirm three camera presets (frontal -5°, dramatic -30°,
top-down 0°), supersede 45° isometric. Update asset organization doc
with verified Quaternius bone names, add wrist_l/r and earring_l/r
accessory slots, fix eyebrow naming convention (short names, no prefix).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-20 07:48:57 +01:00
co-authored by Claude Opus 4.6
parent 23ec1ddebd
commit f34e6362c4
3 changed files with 32 additions and 28 deletions
+1 -1
View File
@@ -494,7 +494,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
### D-148: 30° low-angle camera with 45° map rotation — supersedes D-019
- **Date:** 2026-03-17
- **Decision:** The default gameplay camera is an orthographic Camera3D at **30° tilt** (60° from horizontal) with the tile map rotated **45°** into a diamond grid. Not faked in art — an actual Camera3D tilt. Art direction reference: Hades, Divinity: Original Sin. Camera tilt cycle (T key in prototype): top-down → 45° isometric → 30° low-angle. 30° is the confirmed default. The 45° map rotation gives natural depth cues and the classic diamond-grid isometric layout.
- **Decision:** The default gameplay camera is an orthographic Camera3D at **30° tilt** (60° from horizontal) with the tile map rotated **45°** into a diamond grid. Not faked in art — an actual Camera3D tilt. Art direction reference: Hades, Divinity: Original Sin. Three camera angle presets: **frontal (-5°)** (default for character editor/mugshot, see D-158), **dramatic/low-angle (-30°)** (gameplay default), **top-down (0°)** (overhead view). Camera tilt cycle (T key in prototype): top-down ↔ dramatic. 30° is the confirmed gameplay default. The 45° map rotation gives natural depth cues and the classic diamond-grid isometric layout. ~~45° isometric preset superseded — not part of the confirmed set.~~
- **Rationale:** The 30° angle (versus 45° or top-down) gives significantly more character front visibility and wall depth. Players can see faces, clothing, and character detail rather than primarily hat and shoulder. The diamond grid provides natural spatial depth cues without requiring Z-ordering hacks. The T-key prototype confirmed 30° as the most readable angle at gameplay scale.
- **Architecture note:** Unlike D-019's amendment (which faked tilt in sprite art), this is a real Camera3D setting. The 45° map rotation is a Transform3D applied to the tile grid root — it does not affect simulation coordinates, which remain axis-aligned. Vision cone math and all server-side systems remain in unrotated space; the client applies the visual rotation.
- **Raised by:** Team Leader (Jeroen) — confirmed during Sprint 28 character visuals spike review
+1 -1
View File
@@ -343,7 +343,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
### D-158: Frontal camera angle is default for character editor / mugshot UI
- **Date:** 2026-03-18
- **Decision:** The character editor and mugshot UI use a frontal camera angle (0° tilt, eye-level) by default. Gameplay camera defaults to dramatic (-30°) or isometric (-45°).
- **Decision:** The character editor and mugshot UI use a frontal camera angle (-5° tilt, near eye-level) by default. Three confirmed camera presets: frontal (-5°, editor default), dramatic/low-angle (-30°, gameplay default), top-down (0°, overhead). ~~Isometric (-45°) superseded — not part of the confirmed set.~~
- **Rationale:** Frontal view is the natural angle for inspecting a character's face and outfit in an editor context. Identified during the Quaternius aesthetic spike — the frontal preset immediately felt right for close inspection while the tilted angles serve gameplay readability.
- **Raised by:** Jeroen, during spike validation.
- **Cross-reference:** [D-146](#d-146-character-creation-preview--tile-scale-sprite-with-heavy-zoom) (character creation as separate context), [D-155](#d-155-character-editor-supports-full-360-rotation) (editor rotation)
@@ -190,10 +190,10 @@ client/assets/characters/
mutton_chops_mask.png
...
eyebrows/
eyebrows_regular.glb # Source tier eyebrows
eyebrows_female.glb
eyebrows_teen.glb
eyebrows_thick.glb
regular.glb # Source tier eyebrows (short names — no prefix)
female.glb
teen.glb
thick.glb
...
clothing/
<item_id>/ # One directory per clothing item
@@ -304,21 +304,21 @@ These are the segment suffixes in filenames:
| Segment | File suffix | Bones covered | Notes |
|---|---|---|---|
| Head | `seg_head` | Head | |
| Neck | `seg_neck` | Neck | |
| Torso (full) | `seg_torso` | Spine, Spine1, Spine2 | Default; swappable |
| Torso (upper only) | `seg_torso_upper` | Spine1, Spine2 | For low-cut shirts, tank tops |
| Upper arm left | `seg_arm_upper_l` | LeftArm (shoulder to elbow) | |
| Upper arm right | `seg_arm_upper_r` | RightArm | |
| Lower arm left | `seg_arm_lower_l` | LeftForeArm | |
| Lower arm right | `seg_arm_lower_r` | RightForeArm | |
| Hand left | `seg_hand_l` | LeftHand + finger bones | |
| Hand right | `seg_hand_r` | RightHand + finger bones | |
| Upper leg left | `seg_leg_upper_l` | LeftUpLeg (hip to knee) | |
| Upper leg right | `seg_leg_upper_r` | RightUpLeg (hip to knee) | |
| Lower leg left | `seg_leg_lower_l` | LeftLeg (knee to ankle) | |
| Lower leg right | `seg_leg_lower_r` | RightLeg (knee to ankle) | |
| Foot left | `seg_foot_l` | LeftFoot + toe bones + ankle overlap | Extends past ankle bone; 1-ring vertex overlap with lower leg segment |
| Foot right | `seg_foot_r` | RightFoot + toe bones + ankle overlap | Extends past ankle bone; 1-ring vertex overlap with lower leg segment |
| Neck | `seg_neck` | neck_01 | |
| Torso (full) | `seg_torso` | spine_01, spine_02, spine_03 | Default; swappable |
| Torso (upper only) | `seg_torso_upper` | spine_02, spine_03 | For low-cut shirts, tank tops |
| Upper arm left | `seg_arm_upper_l` | upperarm_l (shoulder to elbow) | |
| Upper arm right | `seg_arm_upper_r` | upperarm_r | |
| Lower arm left | `seg_arm_lower_l` | lowerarm_l | |
| Lower arm right | `seg_arm_lower_r` | lowerarm_r | |
| Hand left | `seg_hand_l` | hand_l + finger bones | |
| Hand right | `seg_hand_r` | hand_r + finger bones | |
| Upper leg left | `seg_leg_upper_l` | thigh_l (hip to knee) | |
| Upper leg right | `seg_leg_upper_r` | thigh_r (hip to knee) | |
| Lower leg left | `seg_leg_lower_l` | calf_l (knee to ankle) | |
| Lower leg right | `seg_leg_lower_r` | calf_r (knee to ankle) | |
| Foot left | `seg_foot_l` | foot_l + ball_l/ball_leaf_l + ankle overlap | Extends past ankle bone; 1-ring vertex overlap with lower leg segment |
| Foot right | `seg_foot_r` | foot_r + ball_r/ball_leaf_r + ankle overlap | Extends past ankle bone; 1-ring vertex overlap with lower leg segment |
| Eyes | `seg_eyes` | Attached to Head bone (small mesh) | |
| Eyebrows | `seg_eyebrows` | Attached to Head bone (small mesh) | |
@@ -417,19 +417,23 @@ unambiguous at a glance.
Format: `<slot>_<descriptor>.glb`
Slots: `hat`, `goggles`, `mask`, `backpack`, `belt`, `earring`, `necklace`, `held_l`, `held_r`.
Slots: `hat`, `goggles`, `mask`, `backpack`, `belt`, `earring_l`, `earring_r`, `necklace`, `wrist_l`, `wrist_r`, `held_l`, `held_r`.
Each slot maps to a specific bone for BoneAttachment3D:
- `hat` -> Head bone
- `goggles` -> Head bone
- `mask` -> Head bone
- `backpack` -> Spine2 bone
- `belt` -> Hips bone
- `earring` -> Head bone
- `held_l` -> LeftHand bone
- `held_r` -> RightHand bone
- `backpack` -> spine_03 bone
- `belt` -> pelvis bone
- `earring_l` -> Head bone
- `earring_r` -> Head bone
- `necklace` -> Head bone
- `wrist_l` -> lowerarm_l bone
- `wrist_r` -> lowerarm_r bone
- `held_l` -> hand_l bone
- `held_r` -> hand_r bone
Examples: `hat_hardhat`, `goggles_welding`, `backpack_small`, `held_r_wrench`.
Examples: `hat_hardhat`, `goggles_welding`, `backpack_small`, `earring_l_stud`, `wrist_l_watch`, `held_r_wrench`.
### Recolor Masks