Physik: Raycast-Node (Treffer, Punkt, Normale, Distanz) #153

Closed
opened 2026-09-18 22:57:39 +02:00 by meleki · 3 comments
Owner

Aus #144 („Später“). Ein Node, der einen Strahl schießt und meldet, was er trifft — für Sichtlinie, Boden-Check, Laser, Hitscan.

Befund

  • Heute gibt es keine Abfrage „was liegt an Punkt / entlang einer Linie“. Ein Boden-Check geht nur über Move (blocked y) oder einen Trigger-Collider.
  • Rapier kann castRayAndGetNormal und intersectionsWithRay, mit Filter nach Gruppen, Ausschluss-Collider und Prädikat. Aber: Rapier rechnet in f32 und sieht nur den Stand des letzten Physik-Steps (beides gemessen in #147/#150), und im Editor-Run gibt es kein Rapier-Welt-Objekt.
  • Unsere Geometrie in collider.ts/convex.ts kennt Box, Kreis, Kapsel und konvexe Polygon-Teile (#151) in f64. Ein Strahl gegen diese Formen ist ein überschaubarer Satz Schnitttests.

Zu bauen

  • Node Raycast (Action mit Flow, damit klar ist, wann er rechnet): Eingänge Start x/y, Richtung x/y (oder Winkel), Länge, „Ignore self“, optional Ebene (#152). Ausgänge hit, object, point x/y, normal x/y, distance.
  • Getroffen werden blockierende Collider und die Tilemap (inkl. Umriss-Tiles). Trigger optional per Schalter.
  • Die Rechnung in unserer f64-Geometrie über dieselben Colliderlisten wie Solids, damit Editor-Run und Play gleich antworten und der Stand immer aktuell ist.
  • Debug: Strahl im Editor-Run kurz einzeichnen.
  • Tests: Treffpunkt/Normale gegen alle vier Formen und Tilemap, gegen beide Systeme; Strahl von innen; Strahl streift Ecke.

Offen (mit Vorschlag)

  1. Eigene Geometrie oder Rapier? Vorschlag: eigene (Gründe oben). Rapier nur, falls die Colliderzahl das messbar nötig macht.
  2. Nur der erste Treffer oder alle? Vorschlag: erst nur der erste; „Raycast all“ mit Liste als eigener Node später.
  3. Hängt an den Kollisionsebenen? Vorschlag: Raycast zuerst ohne Ebenen-Filter bauen und den Eingang nachziehen, sobald #152 steht.
Aus #144 („Später“). Ein Node, der einen Strahl schießt und meldet, was er trifft — für Sichtlinie, Boden-Check, Laser, Hitscan. ## Befund - Heute gibt es keine Abfrage „was liegt an Punkt / entlang einer Linie“. Ein Boden-Check geht nur über `Move` (`blocked y`) oder einen Trigger-Collider. - Rapier kann `castRayAndGetNormal` und `intersectionsWithRay`, mit Filter nach Gruppen, Ausschluss-Collider und Prädikat. **Aber:** Rapier rechnet in f32 und sieht nur den Stand des letzten Physik-Steps (beides gemessen in #147/#150), und im Editor-Run gibt es kein Rapier-Welt-Objekt. - Unsere Geometrie in `collider.ts`/`convex.ts` kennt Box, Kreis, Kapsel und konvexe Polygon-Teile (#151) in f64. Ein Strahl gegen diese Formen ist ein überschaubarer Satz Schnitttests. ## Zu bauen - Node **Raycast** (Action mit Flow, damit klar ist, wann er rechnet): Eingänge Start x/y, Richtung x/y (oder Winkel), Länge, „Ignore self“, optional Ebene (#152). Ausgänge **hit**, **object**, **point x/y**, **normal x/y**, **distance**. - Getroffen werden blockierende Collider und die Tilemap (inkl. Umriss-Tiles). Trigger optional per Schalter. - Die Rechnung in unserer f64-Geometrie über dieselben Colliderlisten wie `Solids`, damit Editor-Run und Play gleich antworten und der Stand immer aktuell ist. - Debug: Strahl im Editor-Run kurz einzeichnen. - Tests: Treffpunkt/Normale gegen alle vier Formen und Tilemap, gegen beide Systeme; Strahl von innen; Strahl streift Ecke. ## Offen (mit Vorschlag) 1. **Eigene Geometrie oder Rapier?** Vorschlag: eigene (Gründe oben). Rapier nur, falls die Colliderzahl das messbar nötig macht. 2. **Nur der erste Treffer oder alle?** Vorschlag: erst nur der erste; „Raycast all“ mit Liste als eigener Node später. 3. **Hängt an den Kollisionsebenen?** Vorschlag: Raycast zuerst ohne Ebenen-Filter bauen und den Eingang nachziehen, sobald #152 steht.
admin added this to the Development project 2026-09-18 23:03:37 +02:00
admin moved this to Next in Development on 2026-09-19 11:07:26 +02:00

folgende issues anlegen falls noch nicht passiert:

  • Physik: "Raycast all" mit Liste als eigener Node
  • Raycast mit Kollisionsebenen mit Verweis auf #152
folgende issues anlegen falls noch nicht passiert: - Physik: "Raycast all" mit Liste als eigener Node - Raycast mit Kollisionsebenen mit Verweis auf #152
Author
Owner

Umgesetzt in 6a31f5e, zusammen mit #155 und #149. Die Vorschläge aus „Offen“ sind so übernommen.

Was gebaut ist

  • Node Raycast (Action mit Flow): Start, Richtung, Länge, „Ignore owner“ (Vorgabe an), „Hit triggers“. Ausgänge hit, object, collider, point x/y, normal x/y, distance.
  • Getroffen werden blockierende Collider aller vier Formen und die Tilemap samt Umriss-Tiles. One-Way-Collider nur von ihrer blockierenden Seite.
  • Gerechnet in unserer f64-Geometrie (src/core/properties/ray.ts) über dieselben Listen wie Solids: Editor-Run und Play antworten gleich und immer zum aktuellen Stand, nicht zum letzten Rapier-Step.
  • Debug: Im Editor-Run zeichnet der Scene-View jeden Strahl 0,25 s — grün mit Punkt bis zum Treffer, grau ohne.

Tests

  • tests/core/raycast.test.ts: Treffpunkt und Normale gegen alle Formen und die Tilemap, Strahl von innen, streifende Ecke, beide Systeme. Ein Polygon-Quadrat liefert bei 900 Zufallsstrahlen dasselbe wie die Box.
  • e2e-Modul 43: der gezeichnete Strahl im Editor-Run.
  • Lokal: npm run check → 1560 Tests, CHECK EXIT 0; GM_STEPS=39-43 → ALL PASSED – 99 checks. CI zu 6a31f5e lief beim Schreiben noch — Nachtrag folgt.

Folge-Issues

Umgesetzt in `6a31f5e`, zusammen mit #155 und #149. Die Vorschläge aus „Offen“ sind so übernommen. ## Was gebaut ist - Node **Raycast** (Action mit Flow): Start, Richtung, Länge, „Ignore owner“ (Vorgabe an), „Hit triggers“. Ausgänge **hit**, **object**, **collider**, **point x/y**, **normal x/y**, **distance**. - Getroffen werden blockierende Collider aller vier Formen und die Tilemap samt Umriss-Tiles. One-Way-Collider nur von ihrer blockierenden Seite. - Gerechnet in unserer f64-Geometrie (`src/core/properties/ray.ts`) über dieselben Listen wie `Solids`: Editor-Run und Play antworten gleich und immer zum aktuellen Stand, nicht zum letzten Rapier-Step. - Debug: Im Editor-Run zeichnet der Scene-View jeden Strahl 0,25 s — grün mit Punkt bis zum Treffer, grau ohne. ## Tests - `tests/core/raycast.test.ts`: Treffpunkt und Normale gegen alle Formen und die Tilemap, Strahl von innen, streifende Ecke, beide Systeme. Ein Polygon-Quadrat liefert bei 900 Zufallsstrahlen dasselbe wie die Box. - e2e-Modul 43: der gezeichnete Strahl im Editor-Run. - Lokal: `npm run check` → 1560 Tests, `CHECK EXIT 0`; `GM_STEPS=39-43` → `ALL PASSED – 99 checks`. CI zu `6a31f5e` lief beim Schreiben noch — Nachtrag folgt. ## Folge-Issues - „Raycast all“ mit Liste (Punkt 2): #157 - Filter nach Kollisionsebenen (Punkt 3, nach #152): #158
admin moved this to Done in Development on 2026-09-19 11:53:37 +02:00
Author
Owner

Nachtrag CI zu 6a31f5e: grün, selbst in den Job-Logs nachgelesen. Gate (Task 144): 109 Testdateien grün, CHECK EXIT 0. Suite (Task 145): ALL PASSED – 1073 checks – die Summe 1073 in README und Wiki ist damit gemessen. Smokes 24 / 19 / 21, alle grün.

**Nachtrag CI zu `6a31f5e`:** grün, selbst in den Job-Logs nachgelesen. Gate (Task 144): 109 Testdateien grün, `CHECK EXIT 0`. Suite (Task 145): `ALL PASSED – 1073 checks` – die Summe 1073 in README und Wiki ist damit gemessen. Smokes 24 / 19 / 21, alle grün.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#153