Lichtstrahl mit Sprite Kit?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Lichtstrahl mit Sprite Kit?

    Hallo,

    lässt sich so etwas wie auf dem Bild mit Sprite Kit realisieren? Von einem Objekt wird Licht ausgestrahlt und von anderen Objekten abgefangen.
    Am besten noch mit Kollisionsprüfung um zu wissen welche Objekte im Licht sind.
    Dateien
    • test.png

      (7,23 kB, 324 mal heruntergeladen, zuletzt: )
  • Du kannst im Lichtkegel durch viele Raycasts Schnittpunkte der 'Lichtstrahlen' mit anderen Objekten herausfinden, und diese dann zu einem Polygon verbinden und gefüllt Zeichnen. Habe das schonmal in Love2d gemacht (benutzt glaub gleiche Physics engine wie SpriteKit), und da ging es sehr performant, trotz hinreichend vieler 'Strahlen'.

    Quellcode

    1. - (void)enumerateBodiesAlongRayStart:(CGPoint)start end:(CGPoint)end usingBlock:(void (^)(SKPhysicsBody *body, CGPoint point,CGVector normal, BOOL *stop))block



    LG David

    EDIT: Wenn du bei einem fertigen Projekt spicken willst, dass das auch so (aber ohne SpriteKit) macht + fancy Effekte: github.com/libgdx/box2dlights
  • Das Tutorial geht gleich vor, wie auch oben beschrieben. Nur dank SpriteKit, darfst du die ganze Mathematik schön umgehen, und direkt die genannte Methode verwenden ;)

    EDIT: Ok, er optimiert noch, indem er die Ecken direkt anzielt, finde ich sehr schön :)
    In SpriteKit (besser in Box2d) hast du zumindest bei statischen Objekten eine gute Optimierung beim RayCast
  • Hallo lasergans,

    welches Tutorial meinst du? Habe ich etwas übersehen? Oder meinst du das sight-and-light Tutorial?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von bachelor ()

  • lasergans schrieb:

    Du kannst im Lichtkegel durch viele Raycasts Schnittpunkte der 'Lichtstrahlen' mit anderen Objekten herausfinden, und diese dann zu einem Polygon verbinden und gefüllt Zeichnen. Habe das schonmal in Love2d gemacht (benutzt glaub gleiche Physics engine wie SpriteKit), und da ging es sehr performant, trotz hinreichend vieler 'Strahlen'.

    Quellcode

    1. - (void)enumerateBodiesAlongRayStart:(CGPoint)start end:(CGPoint)end usingBlock:(void (^)(SKPhysicsBody *body, CGPoint point,CGVector normal, BOOL *stop))block


    Mit wie vielen Strahlen hattest du gesucht? Ein Strahl pro Grad? Oder noch viel feiner? Ein Strahl pro Grad stelle ich mir zu grob vor.
    Und noch eine Frage. Die Methode liefert doch nur die PysicsBodies, nicht die Punkte? Muss dann nochmal bei jedem Körper der Schnittpunkt einzeln gesucht werden?

    EDIT: ach ne, ich verstehe die enumerate Methoden immer wieder falsch. Der usingBlock wird für jeden Körper der Kontakt hat, einmal aufgerufen und dabei der Punkt übergeben? Die Punkte muss ich dann einfach in einem Array sammeln?
  • Wobei das Tutorial von ncase.me ja darauf abzielte nicht einen Strahl pro Grad zu senden - zum einen ist es zu grob und zum anderen aus Performance gründen. Stattdessen wurde von jedem Körper in der Scene (kann man auch mit enumerate durchlaufen) ein Strahl vom Ursprung zu jedem seiner Eckpunkte geschickt. Kommt der Strahl dann am Frame der Scene an = freie Bahn.
  • Genau, es liefert dir den Schnittpunkt ;)
    360 Strahlen wird zu grob sein. Bei mir lief es auch noch mit 10 000 flüssig (das sind aber auch übertrieben viele). Versuch es einfach selber mal aus ;)
    Wie viele Strahlen du brauchst, hängt vor allem davon ab, wie weit die Objekte vom Licht entfernt sind.

    LG

    EDIT: Du kannst es ja mal mit der Brute-force Methode (einfach Strahlen alle n°) versuchen, und wenn du an optische oder performancetechnische Grenzen stößt kannst du ja immernoch gezielter arbeiten (direkt Polygonecken anvisieren).
  • Die nächsten 25 Tage bin ich noch mit einer anderen App beschäftigt. Danach werde ich mit mit diesem Thema beschäftigen und hier meine Ergebnisse posten.

    Vielen Dank für die Infos.