Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

1

23.03.2013, 10:36

Invertierter Bresenham

Hallo Leute ^^

Studienbedingt war oft keine Zeit zu programmieren, jetzt habe ich ein bisschen Zeit gefunden und bin wieder da :)

Im Moment arbeite ich an einer kleinen Voxel-engine, stecke jedoch an einem Problem fest. Und zwar laufe ich mit
dem Bresenham-Algorithmus durch die Zellen (Um alle zu erwischen mit einer Supercover-version die Jede getroffene
Zelle einschließt). Ich kann also wenn ich den Start und Zielpunkt kenne linear durch alle möglichen Zellen iterieren
(im Anhang hellblau markiert).




Allerdings möchte ich jetzt auch bestimmen können, ob eine Zelle (im Bild die rote) von meiner Strecke geschnitten
wird und zwar in O(schnell), am besten in O(1), natürlich möglichst ohne teure Operationen (das übliche halt ^^ ).

Habe schon eine Zeit lang nachgegrübelt aber irgentwie komm ich da auf keine befriedigende Lösung.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

23.03.2013, 11:14

Im Prinzip brauchst du doch nur einen "Strahl vs. Box"-Test.
Dazu gibt's im Internet haufenweise Artikel/Tutorials.
... und mit Bresenham hat das gar nichts zu tun, von daher hat das Thema einen ziemlich unpassenden Namen ;)

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

3

23.03.2013, 11:38

An sich schon, aber das wäre viel zu langsam. Ich kenne durch den Bresenham einige nützliche Werte,
z.b. kann ich die Abweichung des Blocks von der Ideallinie berechnen (Die Errorvariable). Gibt es
da nicht irgenteinen Trick das beschleunigend auszunutzen? ein kompletter Strahl-Box Test in 3D
kostet leider einfach zu viel :(
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

23.03.2013, 11:45

"Spule" den Bresenham einfach zu der entsprechenden Spalte/Zeile vor. Original Bresenham geht ja immer eins weiter, man kann aber auch beliebig weit gehen. Braucht lediglich eine zusaetzliche Division.

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

5

23.03.2013, 12:21

Hmm hmm

Vllt sollte ich ein bisschen mehr ausholen:




Vereinfacht gesagt schieße ich für einige Pixel auf dem Bildschirm einen Strahl in den Raum. Das geht mit dem Bresenham sehr einfach und vor allen schnell, ich verlängere den Vektor Pixelposition minus Auge (natürlich in 3D, also ein Punkt auf der vorderen Ebene des View-Frustrums) in die Ferne und erhalte so meinen Endpunkt, zu dem ich dann vom Auge aus hinlaufe. Soweit sogut. Wenn ich aber beim hinlaufen merke, dass "über" mir ein Voxel ist (hier der Rote Voxel über dem Violetten), dann möchte ich die Projizierte Position auf dem Bildschirm berechnen (fürs Verständnis reicht erstmal eine 2D-betrachtung), in dem Fall wäre das ein Strich (genau genommen suche ich das unterste Pixel dieser Linie).

Da der Bildschirm nicht notwendigerweise parallel zur Y-Achse (bei mir oben) ist, ist das ganze etwas schwieriger. Mein erster Ansatz war, den Bildschirm Stück für Stück entlangzulaufen (und dazu jeweils die neue Endposition in der Ferne zu berechnen), den Bresenham schonmal mit der entsprechenden X-koordinate zu initialisieren und dann solange nach oben zu laufen bis der Fehler wieder im Rahmen liegt. Das ist natürlich sehr langsam, daher suche ich jetzt was schnelleres :)
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

23.03.2013, 13:29

ein kompletter Strahl-Box Test in 3D kostet leider einfach zu viel

Sicher? Sowas geht doch schon ziemlich schnell und vor allem in O(1).
Wenn du 1/dir.x, 1/dir.y, 1/dir.z vorberechnest (dir = Strahlrichtung) bzw. mehrere Tests mit demselben Strahl machst, brauchst du noch nicht einmal eine Division, sondern kommst mit Additionen/Subtraktionen und Multiplikationen aus.
Ich schlage vor, dass du es einfach mal ausprobierst und schaust, ob es wirklich zu langsam ist.

Werbeanzeige