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!
Theorie zum erstellen eines Schattens auf einer 2D-Ebene
@paulkoch95: Könntest Du ein Beispiel zeigen was Du Dir unter einem dynamischen Schatten vorstellst?
-
- 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!
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!
@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.
Ich hab mal schnell ein Bild zur Illustration des Sachverhalts hergezaubert:
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.
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.
-
- 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!
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!
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.
Überhaupt, ich habe den Eindruck, dass du nicht wirklich verstehst was nötig ist, um das alles wie von dir vorgestellt umzusetzen.
-
- 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
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
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.
Ohne eine art Light- oder Depth-Map deiner Objekte auf Pixel-Ebene wirst du da nicht weiterkommen.
-
- 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
ich versuch aber erstmal eine klaren schlagschatten auf eine würfle , ohne schattenüberlagerung oder bewegungsänderung..
mfg paulkoch95
Der Artikel von dem dein Beispielbild herstammt ist diesbezüglich auch ganz interessant und führt einiges an Optimierungsvorschlägen auf: gamedev.net
-
- 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:
mfg paulkoch95
stay tuned!
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)
stay tuned!
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
-
- 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..
meine frage war ja auch eher ob es bereits eine exist. funktion dafür gibt.
mfg paulkoch95
polarkoordinaten, noch nie von gehört, wird aber ja irgendwann mal zeit..
meine frage war ja auch eher ob es bereits eine exist. funktion dafür gibt.
mfg 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
übersieht man ja was.
also danke an dieser stelle für den link zu den polarkoordinaten.
mfg paulkoch95