Ray Casting

Moderator: Rockford

Benutzeravatar
Mathy
Beiträge: 1170
Registriert: 18.06.2021 11:13
Wohnort: Heerlen, NL
Has thanked: 478 times
Been thanked: 261 times
Kontaktdaten:

Re: Ray Casting

Beitrag von Mathy »

.
Hallo Leute

Hat schon jemand diesem Link auf AtariAge erwähnt?

Tschüß

Mathy

PS hab' ich mir nicht durchgelesen. Ob was brauchbares drin ist kann ich also nicht sagen.
Wer oder was hat denn da geblitzt?

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Ray Casting

Beitrag von Dr. Irata »

Hallo Mathy,
ja der Link wurde erwähnt und ist mir bekannt. Es gibt viele interessante Informationen zum Ray Casting - auch gute Beispiele für den A8 mit echt tollen Umsetzungen, leider kocht da jeder so seine eigene Suppe und läßt wenig Infos raus, wie man das am besten speziell für den A8 macht.

Gerade jetzt stoße ich auf das nächste Problem und finde da so gut wie keine Informationen zum A8: Die Texturen!

Mittlerweile verstehe ich ganz gut, wie das funktionieren kann und wie es andere für den A8 gemacht haben. Es gibt aber noch ein paar Probleme. Hauptproblem ist wohl, daß angrenzende Sichtstrahlen ein Wandteil mehrfach treffen können und dieser dann entsprechend mehrfach gezeichnet wird. Für eine einfarbige Wand kein Problem - das tritt ja auch nur bei nahen Wänden auf und entsprechend der Nähe wird die Wand höher und breiter gezeichnet, allerdings würde das bei einer Textur blöd aussehen. Ich muss also genau wissen welcher Sichtstrahl die Wand nochmal trifft und dann entsprechend eine andere Textur nehmen. Im Grunde ist es so: Wenn die Wand nah ist, dann sieht ein Sichtstrahl nur einen kleinen Teil dieser Wand und stellt diesen dann dar. Der nächste Sichtstrahl trifft aber in der 2D-Matrix genau die gleiche Wand (hier vielleicht mit einer 1 gecodet) muss sie aber ganz anders darstellen von der Textur her... das muss ich jetzt ausarbeiten!

Vielleicht gibt es da auch ganz andere viel bessere und einfachere Lösungen - wenn ja, dann her damit ;-)

Das Thema läßt mich gerade nicht los ist aber höchst komplex. Die tollen Vorbilder zeigen aber, daß es mit dem A8 geht und also mache ich weiter. Ich werde für mich jetzt aber etwas den Druck rausnehmen und das ganz entspannt weiterentwickeln bis es gut und schön ist - incl. Texturen...
Das Projekt will ich dann zunächst so weiterentwickeln, das man es als 3D-Engine verwenden kann. Den Code möchte ich final optimieren und dann für alle freigeben...

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Ray Casting

Beitrag von Dr. Irata »

... mein größtes Problem ist im Moment eigentlich, daß ich nicht genau weiß, wie ich am besten eine Textur zeichnen kann - also mit welchem Programm, wo ich dann die entsprechenden Bitcodes für den Atari bekomme... am besten noch alles auch vergrößern oder verkleinern als Option!

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Ray Casting

Beitrag von Dr. Irata »

... gerade beim Kaffee ist mir etwas cooles aufgefallen:

Da habe ich ewig mit den Problemen rumgemacht: Wie bestimme ich d - also den Abstand vom Auge zum Treffer in der 2D Matrix und wie korrigiere ich den Effekt der Distorsion - als diesen Fish Eye Effekt. In den Tutorials wird das mit cos tan usw gemacht. Ich habe d zunächst über eine Näherung von Pythagoras berechnet - also statt d = Wurzel aus dx*dx+dy*dy habe ich ja folgendes genommen: d = dy - dx/2 wenn dx <dy oder d = dx - dy/2 wenn dx>dy. Das klappt ganz gut und läßt sich schnell berechnen. Dann kommt je nach Winkel des jeweiligen Sichtstrahls noch die Korrektur der Distorsion: d(korrekt) = cos alpha * d. Dann hat man die korrekte Entfernung. Die Korrektur habe ich via Tabelle gemacht.
So weit so gut.....
Jetzt habe ich herausgefunden: Das brauche ich alles gar nicht!!! d = dx (für den Fall dx>dy) oder d = dy (für den Fall dx<dy) thats it !!!!!! Nix berechnen, nix nähern!
Ich hatte schon die ganze Zeit das Gefühl, daß ich hier zwei Schritte mache, die sich irgendwie am Ende aufheben. Und genau so ist es.
Dateianhänge
IMG_7154.jpg
IMG_7153.jpg
Zuletzt geändert von Dr. Irata am 21.09.2023 09:21, insgesamt 1-mal geändert.

Benutzeravatar
Kveldulfur
Beiträge: 649
Registriert: 17.08.2021 02:32
Has thanked: 251 times
Been thanked: 177 times
Kontaktdaten:

Re: Ray Casting

Beitrag von Kveldulfur »

Moin!

Ich wache hin und wieder Nachts auf, weil mir (im Traum?) eine Lösung für ein Programmierprobleme eingefallen ist.
Aber eine mathematische Gleichung war da noch nicht drunter. Schade, dass ich kein Kaffee trinke, was dass auslösen könnte... :mrgreen:

Bin gespannt auf Deine fertige Engine.

Grüße
Janko

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Texturen

Beitrag von Dr. Irata »

Im Moment hänge ich fest und manchmal hilft es weiter, sich mit anderen auszutauschen!
Die Texturen machen mir Schwierigkeiten...

Das Problem ist folgendes:
Im Moment berechne ich ja den Abstand d vom Standort des Betrachters in der Matrix zum Wandteil was vom jeweiligen Sichtstrahl getroffen wird.
Je nach Abstand zum Wandtreffer wird das Objekt höher gezeichnet (naher Treffer) oder weniger hoch (entfernter Treffer). Nun müsste das Objekt auch in der Breite wachsen oder schrumpfen - je nach Entfernung.
Dazu kommt jetzt, daß gerade nahe Objekte von den Sichtstrahlen teil mehrfach getroffen werden - beim Abstand 1 (also ganz nah) bis zu 9 mal. Hier zeichnet er also dann quasi 9 x das gleiche Wandobjekt in entsprechender Höhe. Für diese "Nähe" brauche ich also quasi für das gleiche Trefferobjekt 9 verschiedene Wandteile, die dann nebeneinander gezeichnet werden und die dann eine spezielle Textur (z.B. Steinmuster) ergeben. Gehe ich von der Wand zurück, dann wird das gleiche Wandstück vielleicht nur noch 7 x getroffen und entsprechend muss die gleiche Textur dann halt kleiner mit 7 verschiedenen Wandteilen gezeichnet werden. Diese Wand würde dann ähnlich aussehen nur halt etwas kleiner, was ja auch gewollt ist. Jedes Wandteil ist dann vom Aufbau auch noch abhängig von der Trefferdistanz und entsprechend unterschiedlich. Abgesehen von der erheblichen Speichermenge, muss man diese Wandteile auch erstmal erstellen und in Tabellen vorhalten... und dann richtig ansteuern!
Dazu müsste ich auch in der Matrix die jeweilig getroffene Zelle markieren, so daß ich erkenne, ob sie gerade schon getroffen wurde oder nicht. Wenn die gleiche Zelle getroffen wird, dann wird z.B. der 2. Teil der Textur dieser Wand genommen - vorher müsste ich aber auch genau wissen, wie oft denn diese Zelle am Ende wirklich getroffen wird, damit ich entscheiden kann, ob ich von diesem Wandteil den 9 er Block nehme oder z.B. den 7 er .... andererseits müsste schon die errechnete Entfernung d genau das definieren..... alles auf jeden Fall mega aufwendig und ich überlege, ob es nicht viel einfacher ginge... irgendein Kniff. Dass es gut geht, beweisen die Beispiele die schon programmiert worden sind.

Und manchmal nutzt eine gute Näherung viel mehr und funktioniert genauso gut.

Bei der ganzen Überlegung ist mir dann dazu auch noch aufgefaallen, daß meine schöne einfache Theorie mit d und Vermeidung der Distorsion falsch ist.
Leider.... wäre auch zu schön gewesen!!
d = xneu funktioniert nicht, wenn man sich dreht im Achsensystem der Matrix - man muss tatsächlich über den Pythagoras dx bestimmen und dann via cos alpha die Distorsion rausrechnen: dx = xneu + yneu/2. (wenn yneu < xneu)..... die Näherung für Pythagoras. Dann d = dx * cos alpha
Man kann es auch anders machen: beta ist der Winkel des zentralen Sichtstrahls im Koordinatensystem der Matrix und also bekannt: d = xneu * cos alpha / cos (alpha+beta)
Der Witz an der Sache ist allerdings: Mein eigentlich falscher sehr einfacher Ansatz für d funktioniert..... ich habe das gerade nochmal getestet und sicherlich sind die Abstände am Ende nicht so ganz richtig, es fällt aber gar nicht auf. Also lasse ich es erstmal und beschäftige mich weiter mit dem Problem der Texturen... vielleicht fällt mir das dann auf die Füße, wenn ich die Texturen erfolgreich umsetze. Vielleicht kann es aber auch so bleiben!

Und genau das ist es mit den Texturen... es muss doch viel einfacher gehen. Irgendwo ist sicherlich ein guter Kniff versteckt, wie ich die Texturen viel einfacher auf die Wände bekomme, als ober angedacht......

Euch einen schönen Sonntag und beste Grüße aus dem sonnigen Hamm!
Peter

Benutzeravatar
pps
Beiträge: 566
Registriert: 18.06.2021 23:05
Has thanked: 122 times
Been thanked: 225 times
Kontaktdaten:

Re: Ray Casting

Beitrag von pps »

Hmm, vielleicht kann man ja zählen, wie oft ein Teil vom Strahl getroffen wird und dann eine entsprechende Textur zeichnen.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Ray Casting

Beitrag von Dr. Irata »

... so ähnlich war mein Plan. Das Problem ist dann aber noch die schräge Wand. Diese Textur müsste sich dann auch noch in Abhängigkeit der jeweiligen Entfernung ändern... oder ist da mein Denkfehler??

Benutzeravatar
Dr. Irata
Beiträge: 946
Registriert: 24.08.2021 14:40
Has thanked: 113 times
Been thanked: 275 times
Kontaktdaten:

Re: Ray Casting

Beitrag von Dr. Irata »

Frohe Deutsche Einheit wünsche ich uns allen!

In den letzten Tagen war ich nicht untätig und habe sehr viel geknobelt, gerechnet, gezeichnet und immer wieder alles in meinen Gedanken hin und her überlegt...
In der Summe muss man wohl sagen: Es scheint fast vermessen, einen feinen 3D Shooter mit Raycasting-Technik und Textur für sen A8 hinzubekommen... allerdings gibt es einige Beispiele, die zeigen, daß es eingeschränkt funktionieren kann - das motiviert mich letztlich seit einem halben Jahr und ich habe da ja auch schon ganz gute Fortschritte erzielen können!
Die Texturen bringen mich aber echt an Grenzen....
Es scheint fast zu komplex die ganzen Probleme hier so darzustellen, daß man es nachvollziehen kann.

Mein Problem ist der Mehrfachtreffer einer Matrixzelle in Abhängigkeit des Winkels des jeweiligen Sichtstrahls und der Entfernung zum Betrachter. Ein wirklich klares Muster habe ich da nicht finden können und wahrscheinlich gibt es das auch gar nicht... die vielen verschiedenen Treffermuster jedenfalls überschreiten die Kapazität des A8. Da muss ich andere Lösungen finden.

Meine Ausleseroutine ist ok und kann so bleiben - ich werde allerdings noch einen Zähler einbauen, um die Trefferanzahl des jeweiligen Sichtstrahls pro Zelle abzuspeichern. Klingt einfach, ist es aber nicht. Jede Zelle, die getroffen wird muss markiert werden und bei einem weiteren Treffer zählt man die Anzahl - trifft der nächste Sichtstrahl eine andere Zelle, muss die alte Zelle rückgespeichert werden, damit man die Matrix nicht verändert. Das muss ich jetzt als nächsten Schritt umsetzen.

Die anschließende Printroutine - also die optische Ausgabe der 2-D-Matrix als 3-D-Raum auf den Bildschirm muss komplett neu gemacht werden.
Im Moment arbeite ich das FieldOfView quasi von links nach rechts ab und zeichne die Mauern mit entsprechender Höhe (je nach Trefferdistanz d) auf den Bildschirm. Diese Methode geht mit der Textur nicht!
Ich muss von der Mitte anfangen - also vom Zentralsichtstrahl, von hier zeichne ich erst das FoV nach links - je nach Anzahl der Treffer nehme ich. dann die entsprechende Mauer. Wenn z.B. der Zentralstrahl auf ein Feld 7 x trifft (bedeutet auch die Wand ist nah und wird groß), dann suche ich die Mauer mit 7 Einheiten und zeichne sie. Wenn das Feld daneben z.B. 5x getroffen wird, ist die Höhe der Mauer zwar gleich, die Breite aber nicht, hier nehme ich ein Mauerteil mit entsprechend 5 Teilen... usw.
Sobald das FoV links vom Zentrahlstrahl gezeichnet worden ist, muss der Bereich rechts vom Zentrahhlstrahl abgearbeitet werden.
Mehr als 9x wird eine Zelle nicht getroffen - jedes Wandteil einer bestimmten Wandart hat also 9 verschiedene Ausprägungen... so könnte es funktionieren.

LG
Peter

Benutzeravatar
Mathy
Beiträge: 1170
Registriert: 18.06.2021 11:13
Wohnort: Heerlen, NL
Has thanked: 478 times
Been thanked: 261 times
Kontaktdaten:

Re: Ray Casting

Beitrag von Mathy »

.
Hallo Leute

Erhards Frage zu Dr. Iratas Artikel in Magazin #155 und die Reaktionen darauf findet ihr jetzt hier in einem neuen Thread.

Tschüß

Mathy
Wer oder was hat denn da geblitzt?

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast