Physik: One-Way-Plattformen – Toleranzwinkel als Feld (Vorgabe 45°) #159

Closed
opened 2026-09-19 11:37:24 +02:00 by meleki · 2 comments
Owner

Aus #155 (offener Punkt 2, dort „als Feld später, falls nötig“; angefordert im Kommentar in #155).

Befund

  • Eine One-Way-Plattform blockiert nur einen Kontakt, dessen Normale höchstens 45° von ihrer blockierenden Seite abweicht. Der Wert ist fest verdrahtet: ONE_WAY_CONE in src/core/properties/collider.ts:118, geprüft in landsOn.
  • landsOn wird an drei Stellen benutzt: Solids (Move und Raycast, src/runtime/systems/solids.ts) und die Entscheidung vor jedem Rapier-Step (src/runtime/physics/PhysicsSystem.ts). Eine Änderung wirkt dadurch automatisch überall gleich.
  • One-Way-Tiles blockieren immer „from above“ und haben heute keine eigenen Felder dafür.

Zu bauen

  • Am Collider neues Feld One-way angle (Grad, 0–90, Vorgabe 45), sichtbar nur bei eingeschaltetem One-way.
  • An der Tile dasselbe Feld, sichtbar nur bei „One-way (from above)“.
  • landsOn bekommt den Winkel statt der Konstante; solidShapesOf gibt ihn mit der blockierenden Seite weiter.
  • Tests gegen beide Systeme: schräge Plattform (Polygon oder gedreht) mit 30° Neigung hält bei 45°, lässt bei 20° durch; Raycast folgt derselben Regel; Vorgabe ändert bestehende Projekte nicht.

Offen (mit Vorschlag)

  1. Grenzen: Vorschlag 0–90°. Bei 90° zählt jeder Kontakt, der nicht von der Gegenseite kommt.
  2. Anzeige im Scene-View (Kegel an der dicken Seite)? Vorschlag: nein, erst wenn es fehlt.
Aus #155 (offener Punkt 2, dort „als Feld später, falls nötig“; angefordert im Kommentar in #155). ## Befund - Eine One-Way-Plattform blockiert nur einen Kontakt, dessen Normale höchstens **45°** von ihrer blockierenden Seite abweicht. Der Wert ist fest verdrahtet: `ONE_WAY_CONE` in `src/core/properties/collider.ts:118`, geprüft in `landsOn`. - `landsOn` wird an drei Stellen benutzt: `Solids` (Move und Raycast, `src/runtime/systems/solids.ts`) und die Entscheidung vor jedem Rapier-Step (`src/runtime/physics/PhysicsSystem.ts`). Eine Änderung wirkt dadurch automatisch überall gleich. - One-Way-Tiles blockieren immer „from above“ und haben heute keine eigenen Felder dafür. ## Zu bauen - Am Collider neues Feld **One-way angle** (Grad, 0–90, Vorgabe **45**), sichtbar nur bei eingeschaltetem One-way. - An der Tile dasselbe Feld, sichtbar nur bei „One-way (from above)“. - `landsOn` bekommt den Winkel statt der Konstante; `solidShapesOf` gibt ihn mit der blockierenden Seite weiter. - Tests gegen beide Systeme: schräge Plattform (Polygon oder gedreht) mit 30° Neigung hält bei 45°, lässt bei 20° durch; Raycast folgt derselben Regel; Vorgabe ändert bestehende Projekte nicht. ## Offen (mit Vorschlag) 1. **Grenzen:** Vorschlag 0–90°. Bei 90° zählt jeder Kontakt, der nicht von der Gegenseite kommt. 2. **Anzeige im Scene-View** (Kegel an der dicken Seite)? Vorschlag: nein, erst wenn es fehlt.
meleki added the new label 2026-09-19 11:37:24 +02:00
admin added this to the Development project 2026-09-19 12:42:48 +02:00
admin removed the new label 2026-09-19 12:42:56 +02:00
  1. passt
  2. scene view anzeige wäre schon schön wenn möglich (kegel an der dicken seite)
1. passt 2. scene view anzeige wäre schon schön wenn möglich (kegel an der dicken seite)
admin moved this to Next in Development on 2026-09-19 12:50:29 +02:00
Author
Owner

Umgesetzt in 5385d9e (Wiki a61c7a8).

Was sich ändert

  • Neues Feld One-way angle am Collider und an der Tile: 0–90°, Vorgabe 45°. Ein Kontakt blockiert, wenn seine Normale höchstens um diesen Winkel von der blockierenden Seite abweicht. Ohne gesetzten Wert ist der Grenzwert bitgenau derselbe wie vorher, bestehende Projekte verhalten sich gleich (per Test belegt).
  • Die Regel gilt gleich für Move, Raycast und Dynamic Bodies in Rapier.
  • Tiles mit verschiedenen Winkeln verschmelzen nie zu einem Rechteck, jede Gruppe behält ihren Winkel.
  • Scene-View (Punkt 2): Kegel in der Mitte der dicken Seite, ±Winkel, für Collider und One-Way-Tiles.
  • Inspector: Blocks from und One-way angle erscheinen nur bei eingeschaltetem One-way, über die neue Schema-Option shownWith. Graph-Nodes und Speicherformat sehen die Felder weiter immer.

Korrektur am Testplan: Eine gedrehte 30°-Plattform zeigt keinen Unterschied, weil ihre blockierende Seite mitdreht. Der Winkel wirkt nur bei Flächen, die schräg zur Seite stehen. Getestet wird deshalb mit einem Polygon-Keil mit 25° Neigung und Above (25° statt 30°, weil bei Friction 0,5 ab ca. 26,6° gerutscht wird).

Bekannte Grenze: Bei ungleichmäßig skalierten Objekten wird der Kegel im Scene-View mitverzerrt. Die Kollision rechnet trotzdem richtig.

Tests

  • 13 neue Unit-Tests (tests/core/one-way-angle.test.ts), Bewegung und Raycast jeweils in beiden Systemen: Keil hält bei 45° und 25°, lässt bei 20° durch; bei 90° blocken auch die Seiten; zwei Tile-Winkel bleiben getrennt; die Kegelkante zählt noch als Treffer; Dynamic Box ruht bei 45° und fällt bei 20°.
  • Gegenprobe: 7 eingebaute Fehler, alle gefangen.
  • e2e 43a: 1 neuer Check (Felder vor dem Einschalten weg, danach da).

CI zu 5385d9e (Logs gelesen): Gate Task 148 – 110 Testdateien grün, CHECK EXIT 0; Suite Task 149 – ALL PASSED – 1075 checks, Smokes 24 / 19 / 21. Die Summe 1075 ist damit gemessen.

Umgesetzt in `5385d9e` (Wiki `a61c7a8`). **Was sich ändert** - Neues Feld **One-way angle** am Collider und an der Tile: 0–90°, Vorgabe 45°. Ein Kontakt blockiert, wenn seine Normale höchstens um diesen Winkel von der blockierenden Seite abweicht. Ohne gesetzten Wert ist der Grenzwert bitgenau derselbe wie vorher, bestehende Projekte verhalten sich gleich (per Test belegt). - Die Regel gilt gleich für `Move`, Raycast und Dynamic Bodies in Rapier. - Tiles mit verschiedenen Winkeln verschmelzen nie zu einem Rechteck, jede Gruppe behält ihren Winkel. - **Scene-View** (Punkt 2): Kegel in der Mitte der dicken Seite, ±Winkel, für Collider und One-Way-Tiles. - **Inspector:** *Blocks from* und *One-way angle* erscheinen nur bei eingeschaltetem One-way, über die neue Schema-Option `shownWith`. Graph-Nodes und Speicherformat sehen die Felder weiter immer. **Korrektur am Testplan:** Eine gedrehte 30°-Plattform zeigt keinen Unterschied, weil ihre blockierende Seite mitdreht. Der Winkel wirkt nur bei Flächen, die schräg zur Seite stehen. Getestet wird deshalb mit einem Polygon-Keil mit 25° Neigung und *Above* (25° statt 30°, weil bei Friction 0,5 ab ca. 26,6° gerutscht wird). **Bekannte Grenze:** Bei ungleichmäßig skalierten Objekten wird der Kegel im Scene-View mitverzerrt. Die Kollision rechnet trotzdem richtig. **Tests** - 13 neue Unit-Tests (`tests/core/one-way-angle.test.ts`), Bewegung und Raycast jeweils in beiden Systemen: Keil hält bei 45° und 25°, lässt bei 20° durch; bei 90° blocken auch die Seiten; zwei Tile-Winkel bleiben getrennt; die Kegelkante zählt noch als Treffer; Dynamic Box ruht bei 45° und fällt bei 20°. - Gegenprobe: 7 eingebaute Fehler, alle gefangen. - e2e 43a: 1 neuer Check (Felder vor dem Einschalten weg, danach da). **CI zu `5385d9e`** (Logs gelesen): Gate Task 148 – 110 Testdateien grün, `CHECK EXIT 0`; Suite Task 149 – `ALL PASSED – 1075 checks`, Smokes 24 / 19 / 21. Die Summe 1075 ist damit gemessen.
admin moved this to Done in Development on 2026-09-19 13:39:19 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#159