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.
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).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Neben enabled, position, offset...
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 denProperties-Node geschenkt.Die Kette ist eine Matrixkette:
sumAlongChain(Kommentar woertlich: "only because the hierarchy has no rotation or scale") ist durchcomposeAlongChainersetzt (TRS je Ebene,core/model/matrix.ts,core/properties/transform.ts). Zeichnen ueberplaceNode(Rotation + Vorzeichen-Scale, eine Aehnlichkeit braucht nie Skew), Gizmo als Polygon, Cull/Labels/objectRectueber die AABB, Drag rechnet ins Elternsystem. Umhaengen undCreate containerhalten das Aussehen (carriedTransform).Collider sind orientierte Kaesten: SAT fuer Box/Box, Box-Kreis im Box-Rahmen.
axisSeparation/axisCorrectionsind durchexitDistanceersetzt (Boxen geschlossen, Box-Kreis per Bisektion; die alten Zahlen 60/58 bleiben).moveAndSlidebewegt achsweise in den eigenen Achsen des Objekts.Geprueft, nicht behauptet
./check.sh=== CHECK EXIT 0 ===, 866 Tests (857 + 9: Matrix, Kette, Carry, Gruppieren, OBB)1-12,24,25,28,29: ALL PASSED – 467Gegenproben, jede beisst an ihrer Stelle: Carry stumpf → genau 2 Unit-Tests; Box-Achsen ohne Winkel → genau 3;
placeNodeohne 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, Wiki359b366(Scene editing, Colliders, Concepts, Behaviors, Development 758 — Basis 742 gemessen in CI-Lauf 21).