Weitere Scene Object properties #76

Closed
opened 2026-09-13 13:24:47 +02:00 by admin · 1 comment

Neben enabled, position, offset...

  • scale (number, default: 1.0)
  • rotation (number, default: 0.0)
  • mirror x (toggle, default: false)
  • mirror y (toggle, default: false)
Neben enabled, position, offset... - scale (number, default: 1.0) - rotation (number, default: 0.0) - mirror x (toggle, default: false) - mirror y (toggle, default: false)
admin added this to the Development project 2026-09-13 13:29:00 +02:00
admin moved this to Next in Development on 2026-09-13 14:03:46 +02:00
Owner

Befund und Umsetzung

Entscheidung (User): Welt-Transform als Matrixkette wie in Godot/Unity — Kinder drehen und skalieren mit, Collider lernen Rotation.

Was gebaut ist

Vier neue Zeilen als Properties (TRANSFORM_PROPS): scale (ein Faktor, Default 1), rotation (Grad, im Uhrzeigersinn positiv), mirrorX, mirrorY — im Inspector als Block TRANSFORM nach POSITION, auf Sprite, Text, Collider und Container. Kamera und Behavior haben keine (die Kette platziert sie, die Kamera-View bleibt aufrecht). Als Properties bekommen sie Override/Reset/Apply, Laden alter Projekte, Rueckschreiben nach Play und den Properties-Node geschenkt.

Die Kette ist eine Matrixkette: sumAlongChain (Kommentar woertlich: "only because the hierarchy has no rotation or scale") ist durch composeAlongChain ersetzt (TRS je Ebene, core/model/matrix.ts, core/properties/transform.ts). Zeichnen ueber placeNode (Rotation + Vorzeichen-Scale, eine Aehnlichkeit braucht nie Skew), Gizmo als Polygon, Cull/Labels/objectRect ueber die AABB, Drag rechnet ins Elternsystem. Umhaengen und Create container halten das Aussehen (carriedTransform).

Collider sind orientierte Kaesten: SAT fuer Box/Box, Box-Kreis im Box-Rahmen. axisSeparation/axisCorrection sind durch exitDistance ersetzt (Boxen geschlossen, Box-Kreis per Bisektion; die alten Zahlen 60/58 bleiben). moveAndSlide bewegt achsweise in den eigenen Achsen des Objekts.

Geprueft, nicht behauptet

./check.sh === CHECK EXIT 0 ===, 866 Tests (857 + 9: Matrix, Kette, Carry, Gruppieren, OBB)
e2e Modul 29 (neu) 16 Checks; Module 28+29 gegen das Commit-Bundle: ALL PASSED – 65; verkettet 1-12,24,25,28,29: ALL PASSED – 467
Pixel 100x40 rot: Rotation 90 → Rahmen 40x100, rot 40 unter der Mitte; Scale 2 → 80x200; Mirror X tauscht die Haelften eines Zwei-Farben-Bilds byte-genau, Mirror Y laesst sie
Vererbung Kind bei lokal (100,0): nach Drehung des Elternteils 100 unter ihm, selbst gedreht; Drag 30 px nach unten → lokal x = 130
Physik Wand mit 140x60-Collider um 90 Grad gestellt: der Mover parkt bei -80 statt -120

Gegenproben, jede beisst an ihrer Stelle: Carry stumpf → genau 2 Unit-Tests; Box-Achsen ohne Winkel → genau 3; placeNode ohne Rotation + Collider ohne Winkel, neu gebaut → genau 5 e2e-FAILs (Rahmen, far, beide Spiegel, Collider wieder -120).

Grenzen

Rotation wird nicht auf 0-360 normiert; Scale 0 macht die Matrix singulaer (Inverse faellt auf reine Translation zurueck); die Kette loest pro Redraw je Objekt die Vorfahren auf — nicht gemessen, bei Hunderten Objekten vermutlich egal.

Commit 016e83c, Wiki 359b366 (Scene editing, Colliders, Concepts, Behaviors, Development 758 — Basis 742 gemessen in CI-Lauf 21).

## Befund und Umsetzung **Entscheidung (User):** Welt-Transform als Matrixkette wie in Godot/Unity — Kinder drehen und skalieren mit, Collider lernen Rotation. ### Was gebaut ist **Vier neue Zeilen als Properties** (`TRANSFORM_PROPS`): `scale` (ein Faktor, Default 1), `rotation` (Grad, im Uhrzeigersinn positiv), `mirrorX`, `mirrorY` — im Inspector als Block TRANSFORM nach POSITION, auf Sprite, Text, Collider und Container. Kamera und Behavior haben keine (die Kette platziert sie, die Kamera-View bleibt aufrecht). Als Properties bekommen sie Override/Reset/Apply, Laden alter Projekte, Rueckschreiben nach Play und den `Properties`-Node geschenkt. **Die Kette ist eine Matrixkette:** `sumAlongChain` (Kommentar woertlich: "only because the hierarchy has no rotation or scale") ist durch `composeAlongChain` ersetzt (T*R*S je Ebene, `core/model/matrix.ts`, `core/properties/transform.ts`). Zeichnen ueber `placeNode` (Rotation + Vorzeichen-Scale, eine Aehnlichkeit braucht nie Skew), Gizmo als Polygon, Cull/Labels/`objectRect` ueber die AABB, Drag rechnet ins Elternsystem. Umhaengen und `Create container` halten das Aussehen (`carriedTransform`). **Collider sind orientierte Kaesten:** SAT fuer Box/Box, Box-Kreis im Box-Rahmen. `axisSeparation`/`axisCorrection` sind durch `exitDistance` ersetzt (Boxen geschlossen, Box-Kreis per Bisektion; die alten Zahlen 60/58 bleiben). `moveAndSlide` bewegt achsweise in den eigenen Achsen des Objekts. ### Geprueft, nicht behauptet | | | |---|---| | `./check.sh` | `=== CHECK EXIT 0 ===`, **866 Tests** (857 + 9: Matrix, Kette, Carry, Gruppieren, OBB) | | e2e Modul 29 (neu) | 16 Checks; Module 28+29 gegen das Commit-Bundle: **ALL PASSED – 65**; verkettet `1-12,24,25,28,29`: **ALL PASSED – 467** | | Pixel | 100x40 rot: Rotation 90 → Rahmen 40x100, rot 40 unter der Mitte; Scale 2 → 80x200; Mirror X tauscht die Haelften eines Zwei-Farben-Bilds byte-genau, Mirror Y laesst sie | | Vererbung | Kind bei lokal (100,0): nach Drehung des Elternteils 100 unter ihm, selbst gedreht; Drag 30 px nach unten → lokal x = 130 | | Physik | Wand mit 140x60-Collider um 90 Grad gestellt: der Mover parkt bei -80 statt -120 | **Gegenproben, jede beisst an ihrer Stelle:** Carry stumpf → genau 2 Unit-Tests; Box-Achsen ohne Winkel → genau 3; `placeNode` ohne Rotation + Collider ohne Winkel, neu gebaut → genau 5 e2e-FAILs (Rahmen, far, beide Spiegel, Collider wieder -120). ### Grenzen Rotation wird nicht auf 0-360 normiert; Scale 0 macht die Matrix singulaer (Inverse faellt auf reine Translation zurueck); die Kette loest pro Redraw je Objekt die Vorfahren auf — nicht gemessen, bei Hunderten Objekten vermutlich egal. Commit `016e83c`, Wiki `359b366` (*Scene editing*, *Colliders*, *Concepts*, *Behaviors*, *Development* 758 — Basis 742 gemessen in CI-Lauf 21).
admin moved this to Done in Development on 2026-09-13 17:56:50 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#76