Überlegung zu Raycasting/Raytracing: 3D-Objekte

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Skabus

Betreff: Überlegung zu Raycasting/Raytracing: 3D-Objekte

BeitragMo, März 15, 2010 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Da ich seit einiger Zeit mit C++ und SDL ein Spiel remaken will habe ich mir bereits zu einer Sache den Kopf zerbrochen, da aber selbst in meinen dicken Büchern nichts steht und auch im Inet dazu kein wirklicher
Ansatz zu finden ist, wollte ich euch schlaue Köpfe mal fragen ob ihr eine Idee habt.

Hier erstmal ein Bild:

user posted image

Ich habe mir sagen lassen, dass dieses Spiel mittels Raycasting-Technologie umgesetzt wurde.
Allerdings passt etwas nichts ins Bild.Bzw. behaupten dass immer alle Orte an denen ich etwas von
Raycastern lese:

Dieses Spiel nutzt, wie massenweise anderer die nach Wolfenstein 3D kamen, komplexe 3D-Objekte.

Da ich das Spiel gerne mindestens 1:1 umsetzen will möchte ich nicht auf 2D-Ersatzobjekte zurückgreifen.
Hat jemand(ich sprech hier speziell Noobody an, aber ich weiß dass es genug andere Spezies hier auf dem gebiet gibt) eine Idee wie sich das umsetzen lassen würde?

Also nur einen logischen ANSATZ, da mein raycaster bereits zu komplexe Strukturen angenommen hat,
machts keinen Sinn hier konkreten Code zu verfassen(außer Pseudocode).

Mein Ansattz wäre: Zeichne zunächst die 3D-Blöcke, danach zeichne in die Szene die 3D-Objekte
und zeichne dann mit den 2D-Objekte an die richtige Stelle.

3D-Routine für die Blockwände und die 2D-Objekte habe ich bereits.Aber wie soll ich mit der Raycasting-Methode 3D-Objekte faken?Ich habe mir überlegt, dass man ja dafür eine Hybridlösung nutzenn könnte,
also die Raycastingmethode mit einem abgespeckten Raytracer verbinden, der das Zeichnen
des komplexen 3D-Objektes übernimmt.Aber ist das wirklich möglich?Wenn ja: Wie?

Ihr kennt das ja: Ich bin euch wie immer für all eure Hilfe und Hinweise dankbar Very Happy

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Goodjee

BeitragMo, März 15, 2010 1:02
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, die 3dobjekte bestehen ja aus polygonen, die wiederum aus vertices.

die 3dkoordinaten der vertices kannst du ja in 2dkoordinaten umwandeln und die polygone mit der textur gefüllt zeichnen, genau wie deine grafikkarte das sonst für dich übernimmt.

für die tiefe könntest du dann vllt einfach einen tiefenbuffer anlegen - auch wie deine grafikkarte - den erstmal mit den tiefen der pixel vom raycasten füllen und dann die polygone drüber zeichnen wenn sie näher am bildschirm sind
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Skabus

BeitragMo, März 15, 2010 1:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das ist soweit schonmal ein guter Ansatz, eröffnet aber die offenkundige Frage, in wie fern ich dann die 3D-Informationen verarbeiten soll.

Da die Objekte ja auch komplex texturiert werden müssen, stellt sich mir da eindeutig die Frage wie ich diese
darauf anwenden soll.

Das Projekzieren der 3D-Koordinaten auf ein 2D-Abbild habe ich damals schonmal für nen Pseudo-3D-Objekt
mit dem Windows GDI gemacht.

Stellen sich wie gesagt nur 2 Probleme:

Wie soll das 3D-Objekt korrekt in die Raycsting-Szene eingebaut werden?
Wie soll die Texturierung von statten gehen?

Ich hab da zwar schon einige einleutende Antworten, aber ich bin mir nicht 100%tig sicher^^"


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, März 15, 2010 1:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Soweit mir bekannt ist, lässt Raytracing keine Brücken oder Überhänge zu (siehe Sofa), alles was darüber hinaus geht, müsste dann mithilfe eines Raytracers gemacht werden, oder eben durch das Rendern einer Grafikkarte. Also nicht von der Kamera ausgehend, sondern als sortierte Reihenfolge direktes zeichnen auf den Backbuffer.

Zitat:
Dieses Spiel nutzt, wie massenweise anderer die nach Wolfenstein 3D kamen, komplexe 3D-Objekte.

Auch Doom I+II, Duke Nukem 3D, Heretic, Hexen I+II nutzen keine komplexen 3D-Modelle zur Darstellung von Gegnern oder anderen Objekten. Alles zur Kamera gerichtete Sprites in den genannten Spielen. Das erste mir bekannte Spiel mit echten 3D-Objekten war Descent 3D.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Skabus

BeitragMo, März 15, 2010 2:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah danke, bin da nicht so fit, hab aber bei System Shock, Decent und ein paar anderen auch bereits
3D-Objekte gesehen, allerdings natürlich nur statische, Gegner sind meistens/immer mit Sprites gemacht.
Die sind ja auch net das Problem eben nur diese 3D-Objekte...

Und welche Vorgehensweise würdest du empfehlen?den Raycaster mit nem Raytracer für das Rendern
der 3D-Objekte benutzen, oder lieber mit "echtem" 3D drüberzeichnen?

Obwohl ich ja nur diesen Raycasting-Kram angefangen habe, weils unmöglich ist diesen pixligen grobkörnigen Grafikstil mit modernen 3D-Engines umzusetzen, naja und weil ich lange weile hab XDD


Wie kompliziert wäre es nen Raytracer zu schreiben der so einfache 3D-Objekte darstellen kann?
Käme ja ohne Licht, Schatten und dem ganzen Gedöns aus, es soll halt nur aussehen wie oben.

Sorry wenn ich zuviel frage^^"

MFG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, März 15, 2010 2:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst natürlich winzige Texturen 3 bis 4 mal verdoppelt vergrößern und so abspeichern. Diese Texturen dann mit Mode=256 laden und anzeigen. Nachteil ist natürlich der unnötige Speicherverbrauch auf der Festplatte und Grafikkarte, und natürlich die sinnlos verschwendeten Recourcen beim rendern der Szene.

Oder aber auch von Blitz3D weg kommen und mit BlitzMax weiter arbeiten. Denn da hast du mehr Möglichkeiten über die art des renderns. Zumindets hab ich da schonmal einen Rendermodus gesehen, wo genau das ganze so pixelig dargestellt wurde. Eventuell gibt es auch einige Zusatz-DLLs für Blitz3D die verwendet werden können.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Skabus

BeitragMo, März 15, 2010 2:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich arbeite ja wiegesagt mit C+ und SDL, da bleibt mir recht wenig Spielraum, da ich mich auf SDL beschränken möchte.

Ich habe sowohl mit Blitz3D als auch mit BlitzMax maximal effektive FPS von 5 - 8 gehabt.Da blieb nicht
viel zusätzliches für Transparenz,Fenster, Türen, etc.

Mit SDL hab ich selbst mit Texturen und Sprites effektive FPS von 100 - 200 FPS(effektiv deswegen, weil die FPS stark schwankt,solange wie "nur" zwischen hohen FS schrankt ist der Effekt nicht das Problem, da man es ja mit nem Limiter beschränken kann, bringt aber nix wenn die FPS dann zwischen 8 und z.B. 60 schwanken, klar ist das auf jedem PC anders, aber es sollte zumindest auf nem Netbook mit 800 Mhz stabil laufen und das tutBlitz3D und BlitzMax einfach nicht leisten zumindest net so wie ich das probiert habe....)

Wie ich schon sagte: Nen theoretischer Ansatz reicht mir vollkommen, da ich von raytracern null Ahnung habe
und ich mir net sicher bin, ob ich wenn ich jetzt mit google und Co. losziehe nur solche Referenzen finde die
mir superduper-ultra raytracing-verfahren an den Kopf knallen wollen xD


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Noobody

BeitragMo, März 15, 2010 8:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ob das Bild nun wirklich komplett mit Raycasting gemacht wurde, wage ich zu bezweifeln. Es kommt aber auch auf die Definition drauf an. In Visual Comptuting ist Raycasting einfach Raytracing, aber limitiert auf primäre Strahlen (nur 1 Strahl pro Pixel, keine Reflexionen, Schatten etc.). In der Spieleprogrammierung aber versteht man unter Raycasting meistens aber einfach Spaltenrenderer, die nicht einzelne Pixel, sondern Spalten von Pixeln bearbeiten.

Ob das Bild mit einem Spaltenrenderer gemacht wurde, ist schwer zu sagen. Rein theoretisch ist das schon möglich (sogar der interne Renderer von Blender zeichnet per Spalte, wenn möglich), aber ziemlich kompliziert. Als Alternative einen Raytracer zu verwenden, scheint mir dann aber auch ein wenig übertrieben (und wäre wohl auch nicht sooo performant), daher wäre meine Empfehlung, einfach einen simplen 3D-Rasterizer zu schreiben, der ähnlich der Grafikkarte Dreiecke auf den Bildschirm zeichnet. Das ist relativ flott (ging sogar in Blitz3D in Echtzeit Razz ) und auch nicht wahnsinnig kompliziert. Falls du da nicht weiterkommst, kann ich dir auch einen passenden Code dazu schicken.


Rein theoretisch könntest du ja alles auch mit z.B. OGL machen und direkt von der Grafikkarte rendern lassen. Wenn du dann noch (bi-)lineares Filtering ausschaltest, bekommst du auch den schönen Retropixeleffekt.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Skabus

BeitragMo, März 15, 2010 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank Noobody^^

Ich werd erstmal versuchen mit OGL nen Objekt in meine Raycasting-Szene zu rendern und schau dann
ob mir das Ergebnis gefällt, ansonsten versuch ich mich mal selbst an nem Rasterizer.

Vielen Dank^^

Wenn du dazu nen Beispiel hast, immer gerne her damit Very Happy


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Goodjee

BeitragMo, März 15, 2010 17:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Skabus hat Folgendes geschrieben:

Wie soll das 3D-Objekt korrekt in die Raycsting-Szene eingebaut werden?
Wie soll die Texturierung von statten gehen?


1. ich würde da genauso vorgehn wie es deine grafikkarte auch tun würde.
schritt eins: raycasten so wie bisher, nur dass du für jeden pixel den du malst in einem anderen buffer(zweidimensionales array) die tiefe speicherst, also die entfernung zum bildschirm.
schritt zwei: die polygone einmalen wenn sie näher am bildschirm sind als der bisherige pixel an der stelle
dann müssten die 3dobjekte perfekt in deine raycastingszene integriert sein

2. für das texturieren gehst du im prinzip auch wie deine grakavor, du hast halt uvkoordinaten für die texturen und interpolierst halt dazwischen die uvkoordinaten. wie das genau geht müsste ich auch nochmal nachgucken Very Happy
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Skabus

BeitragMo, März 15, 2010 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm das ist alles klasse, würd ich auch sofort so machen, allerdings fehlt mir nen bissle das Wissen wie genau
das ganze funktioniert...

Gibts da irgendwas was ich mir anschauen könnte?Ich hab leider auf meiner Suche nichts brauchbares gefunden...

Allein schon die Frage: Wie soll ich die Vertices zu Edges zusammenfassen/Zusammenzeichnen?
Das bereitet mir etwas Probleme^^"

Wenn ihr mir da noch nen bissle helfen könntet, wäre ich echt froh^^


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Goodjee

BeitragMo, März 15, 2010 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, theoretisch sind polygone ja immer dreiecke, also kannst du dir zum beispiel eine klasse Triangle machen, die dann z.B. so aussieht:

Code: [AUSKLAPPEN]

class Triagle
-v1:float[5]
-v2:float[5]
-v3:float[5]

+draw()


wobei die 5dimensionenen x,y,z,u und v sind.
in der drawmethode werden die 3dkoordinaten dann zu 2dkoordinaten umgerechnet, wie das geht meintst du wüsstest du schon, und das so entstehende 2ddreieck ausgemalt. methoden dreiecke zu füllen sollten auch auffindbar sein.

für die texturen könntest du mal hier vorbei gucken: http://en.wikipedia.org/wiki/Texture_mapping

ich hoffe ich konnte wenigstens ein bsischen helfen

edit: folgendes qbasictutorial beschäftigt sich auch mit 3dgrafik mittels 2dfunktionen: http://www.o-bizz.de/qbtuts/3dtut1.zip
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Noobody

BeitragMo, März 15, 2010 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Skabus hat Folgendes geschrieben:
Ich werd erstmal versuchen mit OGL nen Objekt in meine Raycasting-Szene zu rendern

Kann man in SDL mit einem OGL-Kontext zeichnen und gleichzeitig einen bearbeitbaren Buffer benutzen? Ich dachte nicht, dass das geht - du müsstest dann gleich alles in 'echtem' 3D machen. Ich glaube aber nicht, dass das der Sinn deines Projekts ist Razz

Skabus hat Folgendes geschrieben:
Hm das ist alles klasse, würd ich auch sofort so machen, allerdings fehlt mir nen bissle das Wissen wie genau das ganze funktioniert...

Grundlegend kann man das ganze in ein paar simple Schritte aufteilen:
- Vertizes transformieren: Vom globalen Koordinatenraum in den lokalen Koordinatenraum der Kamera transformieren. Wenn du dich auf allen 3 Achsen drehst, wirst du um Matrizen nicht drumrumkommen, aber wenn der Spieler, wie man aus deinem Screenshot vermuten kann, sich nur um die Y-Achse drehen kann, ist es denkbar einfach. Dazu muss man nur von der Position der Vertizes die Kameraposition subtrahieren und sie alle um -Yaw um die Y-Achse drehen.

- Vertices projizieren: Mit der Projektionsformel, die hier im Forum herumschwirrt, die Vertizes auf den Bildschirm projizieren.

- Culling: Vertices, die ausserhalb des Bildschirms liegen, wegschneiden, damit man nicht unnütz Performance verbrät. Wichtig: Bei Dreiecken, die nur vom Bildschirm angeschnitten werden, muss man sie kurzzeitig in einen sichtbaren und einen nicht sichtbaren Teil (=zwei neue Dreiecke) aufteilen, damit sie korrekt gerendert werden.

- Rasterizing: Das ist der schwierigste Part. Prinzipiell schneidet man das Dreieck vom mittleren Vertex aus horizontal in zwei, damit man ein Dreieck mit flacher Unterseite und eines mit einer flachen Oberseite erhält. Danach geht man Zeile für Zeile durch und zeichnet die Textur ein. Das ist nochmal ein ziemlich kniffliger Part, da man nicht linear die UV-Koordinaten zwischen den drei Vertizes interpolieren kann, sondern die Inverse der Z-Koordinate einbeziehen muss, damit keine verzerrte (=affine) Textur gezeichnet wird.

Anfangen kannst du mit einem affinen Rasterizer (toller Artikel dazu) und den dann auf perspektivisches Texture Mapping erweitern (nicht so toller Artikel dazu, aber leider der Beste, den ich finden konnte).

Damit kann man dann ziemlich tolle Retro-Effekte erreichen:
user posted image
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Skabus

BeitragMo, März 15, 2010 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Noobody hat Folgendes geschrieben:
Skabus hat Folgendes geschrieben:
Ich werd erstmal versuchen mit OGL nen Objekt in meine Raycasting-Szene zu rendern

Kann man in SDL mit einem OGL-Kontext zeichnen und gleichzeitig einen bearbeitbaren Buffer benutzen? Ich dachte nicht, dass das geht - du müsstest dann gleich alles in 'echtem' 3D machen. Ich glaube aber nicht, dass das der Sinn deines Projekts ist Razz


Ja siehste, doof wie ich bin hab ich das erst gemerkt als ichs schon drin hatte XD

Naja zumindest ist meine Engine so modular dass des nur ne Sache von 5 Minuten war^^

Ich werd mir eure Quellen mal ansehen, vielen Dank, das schöpft neuen Mut Very Happy


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group