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

![]() |
SkabusBetreff: Überlegung zu Raycasting/Raytracing: 3D-Objekte |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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: ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group