Theorie zum erstellen eines Schattens auf einer 2D-Ebene

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
paulkoch95
User
Beiträge: 15
Registriert: Samstag 21. Januar 2012, 16:31

Hallo, Community,
ich habe mir in den letzten Tagen Gedanken darüber gemacht wie ich einen Schatten in einerm 2Dspiel realisieren würde, allerdings kein statischer, nein, der Schatten soll dynamisch seine als wenn der Spieler in einem Dunklen Raum Beispielsweise eine Taschenlampe in der Hand hält.
Ich habe angefangen Grafiken zu nehemen und diese in Bezug auf die Spielerposition und der bsp. Blockposition entsprechend zu drehen, zu vergrössern etc.
allerdings kann das ja keine saubere Lösung sein da es ressourcen lastig ist und nicht besonders schön aussieht.
meine Frage, wie würdet bzw wie gestaltet ihr dynamische Schatten in einem 2D Spiel? Also euere Theorie bzw. die dahinter steckende Mathematik da mich das Thema sehr interessiert
und auch Spass macht damit zu experimentieren...
mfg paulkoch95
Stay tuned!
BlackJack

@paulkoch95: Könntest Du ein Beispiel zeigen was Du Dir unter einem dynamischen Schatten vorstellst?
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich musste da irgendwie spontan an das Indie-Spiel Limbo denken, weil es das verallgemeinert auch auf Licht angewandt nutzt abhängig von Position/Bildauschnitt zu rendern.
paulkoch95
User
Beiträge: 15
Registriert: Samstag 21. Januar 2012, 16:31

Hmm, gut meine Erklärung war wolh etwas dürftig,
ich meine es folgendermassen, ich habe eine Taschenlampe in der Hand und gehe um eine Säule, der Schatten ist immer auf der anderen Seite der Säule, is ja klar^^,oder ich stehe in einem raum
und stelle eine lichtquelle auf bsp: http://images.gamedev.net/features/prog ... /fig06.png
mich interessiert die theorie dahinter wie ich so etwas in python/pygame realisieren kann, bzw allgemein die mathematik/theorie dahinter.
mfg paulkoch95
stay tuned!
BlackJack

@paulkoch95: Ich weiss nicht ob das so gut zusammen geht, denn Pygame ist 2D-Pixelgrafik wogegen die Schattenberechnung eher 2D-Vektorgrafik ist. Du müsstest also mindestens noch eine Vektor-Version der Formen der Objekte in den 2D-Kacheln die einen Schatten werfen sollen, für die Berechnungen bereit halten.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich hab mal schnell ein Bild zur Illustration des Sachverhalts hergezaubert:

Bild

Angenommen du willst den Schatten eines Rechtecks darstellen, der von der kreisförmig strahlenden Lichtquelle links im Bild herrührt. Das Licht kommt an einer Seite besagten Rechtecks nicht weiter, mathematisch gesehen schließen zwei Geraden von der Lichtquelle ausgehend diesen Bereich ein. Diese Geraden werden zwischen dem Bildrand und der Lichtquelle aufgespannt und schließen zwei Ecken des Rechtecks ein.

Wenn du alle Ecken gefunden hast an denen das Licht mit einem Objekt kollidieren würde, rechnest du aus wie dafür die passende Gerade aussieht. Da es nur zwei sind, erhälst du ein Trapez, welches du vektorartig schwarz ausfüllst. Und ja, alle benötigten Informationen kann man durchs Lösen linearer Gleichungen herausbekommen, wirklich hohe Mathematik ist dafür nicht nötig.

Verallgemeinert kannst du das in Kombination mit Ausfilterung (Abstände errechnen oder schauen ob der gerade betrachtete Punkt schon im Schatten steht) dafür nutzen alle Schatten zu berechnen.
paulkoch95
User
Beiträge: 15
Registriert: Samstag 21. Januar 2012, 16:31

hmm, ist das mit pygame möglich?
angenommen ich will den schatten aus einer grafik nehmen, geht es dann einfacher, oder erschwert das die sache vllt. sogar?
ansonste danke erstmal, endlich ein ansatz mit dem man arbeiten..^^
danke
mfg paulkoch95
Stay tuned!
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Siehe Blackjacks Erläuterung dazu. Das ist alles 2D-Vektorberechnung. Du benötigst etwas, was die errechneten Formen zu Grafik umsetzt.

Überhaupt, ich habe den Eindruck, dass du nicht wirklich verstehst was nötig ist, um das alles wie von dir vorgestellt umzusetzen.
paulkoch95
User
Beiträge: 15
Registriert: Samstag 21. Januar 2012, 16:31

das habe ich ja gelesen, somit hatte sich die frage eig. auch schon erledigt, aber fragen schadet ja nie, oder?
andereseits denke ich schon das ich verstehe was nötig ist, ich programmiere schon länger in python und nicht ganz solange in verbindung
mit pygame.
mir ging es jetzt darum die theorie hinter der schattenberechnung KOMPLETT zu verstehen, ich habe aber das gefühl das deine (@webspider)erklärung mich zu
dem ansatz gebrach hat den ich brauche...
mfg paulkoch95
stay tuned
deets

Das Problem ist schon noch ein bisschen komplexer. Es geht ja nicht nur darum, ein Schattenvolumen zu berechnen. Genauso wichtig ist es, die Abschattung auf den angestrahlten Gegenstaenden zu berechnen. Simples Beispiel: ein Quader von oben betrachtet (was ja dein Szenario ist) sieht im Lichtkegel komplett anders aus als eine Halbkugel.

Ohne eine art Light- oder Depth-Map deiner Objekte auf Pixel-Ebene wirst du da nicht weiterkommen.
paulkoch95
User
Beiträge: 15
Registriert: Samstag 21. Januar 2012, 16:31

dass es komplizierter wird, war schon klar, wär ja auch zu schön sonst :).
ich versuch aber erstmal eine klaren schlagschatten auf eine würfle , ohne schattenüberlagerung oder bewegungsänderung..
mfg paulkoch95
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Der Artikel von dem dein Beispielbild herstammt ist diesbezüglich auch ganz interessant und führt einiges an Optimierungsvorschlägen auf: gamedev.net
paulkoch95
User
Beiträge: 15
Registriert: Samstag 21. Januar 2012, 16:31

ich weiss, der artikel ist seeehr umfangreich^^
er erklärt auch ganz gut die theorie, zwar anhand einer anderen programmiersprache, aber das ist für
die theorie ja gleichgültig.
allerdings habe ich noch eine andere frage, kann man linien in pygame zeichnen, indem man ihnen nur den startwinkel angibt und dann die länge?
die normale linie kann ja nur die start und endposition als attribut nehmen nicht aber die länge, es ist eig. auch überflüssig interessant wäre es trotzdem
ungefähr nach dem schema:

Code: Alles auswählen

#Pseudocode
pygame.draw.(aa)line(s)(untegrund, startpos, steigungswinkel (bsp alpha = 30°),länge,breite)
mfg paulkoch95
stay tuned!
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Nie etwas von Polarkoordinaten und Trigonometrie gehört? Und ja, für Spieleprogrammierung ist es enorm hilfreich die mathematischen Kenntnisse aufzufrischen, sonst kommt man nicht wirklich weit :D
paulkoch95
User
Beiträge: 15
Registriert: Samstag 21. Januar 2012, 16:31

trigonometrie, ja, grad in mathe^^
polarkoordinaten, noch nie von gehört, wird aber ja irgendwann mal zeit..:D
meine frage war ja auch eher ob es bereits eine exist. funktion dafür gibt.
mfg paulkoch95
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Nein, gibt es nicht. Das hätte dir ein Blick in die Dokumentation schneller beantwortet als hier abzuwarten, weswegen ich dir erklärt hab was du kennen musst um etwas mit Polarkoordinaten arbeitendes nutzen zu können.
paulkoch95
User
Beiträge: 15
Registriert: Samstag 21. Januar 2012, 16:31

ich hatte ja vorher schon in d. python dokumentation geguckt, in die englische sowie in die deutsche, aber manchmal
übersieht man ja was.
also danke an dieser stelle für den link zu den polarkoordinaten.
mfg paulkoch95
Antworten