Explosion_der_Spiele/assets/3DModelle/README.md
copilot 5f117db28d Document how to open the scale lab and save model_scales.json.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 12:06:45 +02:00

50 lines
2.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 3D-Modelle
> **Git:** `.glb`/Textures unter `3DModelle/` sind lokal (Forgejo HTTP 413). Mit Git-LFS nachziehen, sobald verfügbar.
```
3DModelle/
_inbox/ # optional drop zone
props/ # button, table, …
houses/ # house, house_b, broken, … | massour = fest
animals/ # cat, chimp, giraffe, …
```
## Auto-Sort
GLBs in die **Root** oder `_inbox/` legen (Umbenennen ok). Nach **~45s ohne Änderung**:
```bash
python3 scripts/tools/organize_3d_models.py --watch --import
```
Sortiert nach Namen → `props/` / `houses/` / `animals/`, zieht Texturen mit, fixt `.import`.
Einmal sofort: `python3 scripts/tools/organize_3d_models.py --force --import`
**Random-Dorf:** Häuser außer `massour/`; Tiere außer `cow/` (Kuh = Masseur **im Dorf**).
**Größen:** Spieler = **1,74 m** (`SpriteFit.WORLD_PLAYER_HEIGHT`); Häuser ~8,5 m, Kuh ~1,5 m, Tiere artgerecht (Katze ~28 cm … Giraffe ~3,4 m). Scale-Lab / `data/model_scales.json` überschreibt Fits.
## Scale Lab (Editor)
Open **`scenes/dev/scale_lab.tscn`** in Godot (File → Open, or drag into viewport). Not in the main game flow.
1. Pick a model in the list (all GLBs under `animals/`, `houses/`, `props/`).
2. Compare against the **measuring wall** (0.1 m ticks, labels every meter, red mark at **1.74 m**) and the blue **player capsule**.
3. Adjust `fit_height` / `fit_max_width` → live preview via `ModelProp`.
4. **Save** writes **`data/model_scales.json`**. Village, massage studio, and every `ModelProp` with `use_scale_catalog` read that file at runtime.
5. **Reset defaults** restores built-in SpriteFit tables (save again to persist).
Keys are `category/folder` (e.g. `animals/chimp`). Missing keys fall back to `SpriteFit` constants.
## Editor-Vorschau (WYSIWYG)
Ohne Play sehen, wo Billboards und 3D-Props landen:
| Was | Script | Verhalten im Editor |
|-----|--------|---------------------|
| Billboards | `BillboardSprite` (`@tool`) | Quad + Texture; **yaw** zur **Editor-Kamera** (`get_viewport().get_camera_3d()`) |
| NPCs / Enemies / Player | `InteractableNPC`, `HittableEntity`, `PlayerController`, … | Laden Texture/Höhe aufs Kind-Billboard (kein Kampf-/Quest-Code) |
| ModelProps | `ModelProp` (`@tool`) | Lädt GLB, `fit_height` / Katalog; Mesh-Child **ohne** `owner` (wird nicht mitgespeichert) |
| Dorf-Random-Spawns | `village.gd` (`@tool`) | Export **`editor_preview_spawns`** (default an): deterministische Stand-ins an `HOUSE_SLOTS` / `ANIMAL_SLOTS` + Masseur/Kuh/Progress. Prefix `_EditorPreview_*`. Runtime freut sie vor dem echten Random-Spawn. |
**Tipps:** Dorf-Szene öffnen → 3D-Viewport drehen → Billboards folgen der Editor-Kamera. Preview aus = nur feste Scene-Kinder (Tisch, NPCs). Speichern persistiert keine Preview-Meshes.