Da könnte man eine 2D-Version von "Marching Cubes" implementieren. Marching Squares?Jonathan hat geschrieben: ↑14.10.2024, 12:31 Ich sehe das größere Problem ehrlich gesagt in den Normalen / Tangenten. Die Bitmap ist ja nicht die Geometrie, sondern ein niedrigaufgelöstes Sampling der Geometrie. Betrachtet man die Bitmap als echte Geometrie aus Blöcken dann gibt es nur perfekt senkrechte und perfekt waagerechte Linien, keine Schrägen. Natürlich kann man diese Treppen mit Kugeln kollidieren lassen, aber das Verhalten wird vermutlich nicht das sein, was man erwartet.
Tiny Ore Diver
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.
Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.
This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.
Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.
This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
- TomasRiker
- Beiträge: 71
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Tiny Ore Diver
- Schrompf
- Moderator
- Beiträge: 4952
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Tiny Ore Diver
Ja, heißt Marching Squares, und jetzt klingt ihr mit Euren Bedenken exakt wie der Box2D-Discord, der meine Fragen gar nicht erst zur Kenntnis genommen hat, sondern gleich meinte, ich solle es sein lassen.
Was die Kontaktnormalen angeht, wollte ich das wie bei meinem Survival-Voxel-Spiel damals machen: die 5x5-Umgebung zu ner Normale verwursten. Ich mach aber erstmal Kugel vs. Bitmap, und da hast Du ganz bequem die Kugel-Richtung als Normale. Für Kugeln >> 1px Radius wird das schon ordentlich funktionieren. Kritisch wird's später bei Bitmap vs. Bitmap - da kann man sich Grenzfälle ausdenken, wo jede Heuristik scheitert. Aber erstmal soweit sein und dann sehen wir weiter.
Was die Kontaktnormalen angeht, wollte ich das wie bei meinem Survival-Voxel-Spiel damals machen: die 5x5-Umgebung zu ner Normale verwursten. Ich mach aber erstmal Kugel vs. Bitmap, und da hast Du ganz bequem die Kugel-Richtung als Normale. Für Kugeln >> 1px Radius wird das schon ordentlich funktionieren. Kritisch wird's später bei Bitmap vs. Bitmap - da kann man sich Grenzfälle ausdenken, wo jede Heuristik scheitert. Aber erstmal soweit sein und dann sehen wir weiter.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: Tiny Ore Diver
Aber Marching Cubes hat doch als Eingabe ein Signed Distance Field, und das gibts hier doch nicht, oder?TomasRiker hat geschrieben: ↑14.10.2024, 13:05 Da könnte man eine 2D-Version von "Marching Cubes" implementieren. Marching Squares?
Ich bin da skeptisch. Habs mal eben aufgemalt: Nicht exakt gezeichnet, aber die selbe Kugel triff immer die selbe Ecke von dem mittleren 2-er Steinchen zuerst. Ich nehme an, das meintest du - Kugel mit exakten Quadraten kollidieren lassen und dann annehmen, dass die Berührungsebene tangential zur Kugel liegt.Ich mach aber erstmal Kugel vs. Bitmap, und da hast Du ganz bequem die Kugel-Richtung als Normale. Für Kugeln >> 1px Radius wird das schon ordentlich funktionieren.
Für den selben Kontaktpunkt kannst du jetzt aber sehr unterschiedliche Richtungen rausbekommen, nämlich alles zwischen den zwei roten Linien. Das ist dann doch arg ungenau. In "Wirklichkeit" approximieren die grünen Quadrate aber die blau Linie, wie man sieht ist die korrekte Normale also ungefähr zwischen den zwei maximalen.
Hier wird es jetzt philosophisch, ob die grüne oder die blaue Geometrie die wahre ist. Die meisten Spieler werden aber intuitiv von der blauen ausgehen, nicht von der grünen. Wenn du hundert Bälle gegen diese grüne Wand prallen lässt, springt jeder in eine andere Richtung, auch wenn die Wand "glatt" ist.
Das ist, denke ich, die richtige Lösung. Lokal an die Geometrie eine kontinuierliche Funktion fitten, deren Normale man dann an der Kontaktstelle exakt berechnen kann. So kannst du auch für Runde Objekte sehr glatte (im Sinne von differenzierbare) Normalen bekommen, und nicht nur Stückweis-Lineare Funktionen, bei denen die Normalen dann plötzlich springen, wenn man ein kleines bisschen anders aufkommt.Was die Kontaktnormalen angeht, wollte ich das wie bei meinem Survival-Voxel-Spiel damals machen: die 5x5-Umgebung zu ner Normale verwursten.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- TomasRiker
- Beiträge: 71
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: Tiny Ore Diver
Ja, stimmt. Ist nicht genau das gleiche. Die Idee dahinter wäre ähnlich. Man guckt sich an, welche der 4 Eckpunkte eines Quadrats 1 bzw. 0 sind, und erzeugt dann entsprechend Kanten.Jonathan hat geschrieben: ↑Gestern, 10:35Aber Marching Cubes hat doch als Eingabe ein Signed Distance Field, und das gibts hier doch nicht, oder?TomasRiker hat geschrieben: ↑14.10.2024, 13:05 Da könnte man eine 2D-Version von "Marching Cubes" implementieren. Marching Squares?
- Schrompf
- Moderator
- Beiträge: 4952
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Tiny Ore Diver
Marching Cubes war auch der Vorschlag der Box2D-Community, und nach meinem Wissen macht z.B. Noita das so. Anekdote am Rande: xq hatte mir erzählt, dass die jetzt ihr "FallingEverything"-Engine zur Lizenzierung anbieten. Ich hatte lange mit mir gerungen, ob ich das überhaupt will, aber bevor ich dann überhaupt mit Box2D und dem Kollisionsthema anfing, sendete ich ihnen doch erstmal ne Mail. Immerhin haben die ja all diese Probleme schon gelöst, nämlich mit Marching Squares und Konvex-Zerlegung, wie in dem dort verlinkten Video auch erklärt.
Leider haben sie nie geantwortet. Ist jetzt drei Wochen her oder so, da kommt also wohl nix mehr. Also hab ich selbst angefangen. Und bevor ich 64x pro Sekunde Marching Squares und Konkavkrieg betreibe, wollte ich doch erstmal gucken, ob ich nicht auch Pixel-Kollision in Box2D reingepatcht kriege. Würde ja reichen, wenn ich nur die bewegten Trümmerteile marchen und konvex zerlegen müsste.
Leider haben sie nie geantwortet. Ist jetzt drei Wochen her oder so, da kommt also wohl nix mehr. Also hab ich selbst angefangen. Und bevor ich 64x pro Sekunde Marching Squares und Konkavkrieg betreibe, wollte ich doch erstmal gucken, ob ich nicht auch Pixel-Kollision in Box2D reingepatcht kriege. Würde ja reichen, wenn ich nur die bewegten Trümmerteile marchen und konvex zerlegen müsste.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Chromanoid
- Moderator
- Beiträge: 4271
- Registriert: 16.10.2002, 19:39
- Echter Name: Christian Kulenkampff
- Wohnort: Lüneburg
Re: Tiny Ore Diver
Clonk hat das ganze glaube ich mit wenigen "Testpixeln" gelöst. Die sind dann die Eckpunkte der Gefährte. Das spielt vor allem bei den Loren eine Rolle. Es kann dabei natürlich passieren, dass man den Loren auf einen "Erdspieß" schiebt und die Testpixel links und rechts vom Erdspieß hängen. Dadurch dass Clonk von einem frickeligen Spielgefühl lebt, hat mich das nie gestört. Ich glaube bei den Ubooten in Clonk gibt es mindestens drei Testpunkte. Vielleicht reicht das ja? Ich bin mir allerdings nicht sicher, wie die auf der Basis eine Normale zum schieben der Objekte berechnen. Vermutlich einfach ein paar Lookups entlang der Bewegungsrichtung oder so.