Hallo Besucher, der Thread wurde 6,3k mal aufgerufen und enthält 7 Antworten

letzter Beitrag von sauhund am

Wie realisiert man Pseudo-3D in C++ ?

  • Hallo ;)


    ich hab' mal wieder ne Frage *seufz*


    Ihr kennt doch sicher die alten Atari Klassiker wie Dungeon Master oder Das schwarze Auge... Eye of the Beholder etc pp. Die Liste der Knaller ist sehr groß. Meine Begeisterung ebenso ;)


    Was ich mich aber frage ist nach welchem Prinzip sie das Pseudo-3D für die Dungeons realisiert haben? Also wie nennt sich das?
    Ich bin schon seid Tagen am googeln aber finde nix spezifisches. Habe schon in einigen C++ Foren nachgefragt aber da wurde mir nur raycasting angeboten, was aber definitiv erst später benutzt wurde, für Spiele ala Wolfenstein 3D und sowas.
    So richtig viel Beachtung wird diesen alten Titeln in den großen C++Foren ja auch nicht geschenkt weshalb es mich auch nicht wirklich wundert das ich dort auf meine Anfragen nur spärliche und unzureichende Antworten bekommen habe.


    Tja nun ja, zumindest in diesem Forum sollten ja wohl hoffentlich ein paar Leute zu finden sein die wissen wie sowas geht *hoff* Immerhin hat hier ja auch Protovision ein Unterforum... also müssten doch Leute sein die was von der Materie verstehen ;)


    Also; hat jemand nen Schimmer wie man sowas realisiert und kann mir Tipps dazu geben, einen Link zu einem entsprechenden Tutorial, oder irgendwas anderes hilfreiches in der Richtung?


    Grüße,
    Schoki ;)


    btw, wer mag kann mir auch mailen: gedankensalat@web.de


    Edit: ha! und selbst der C64 hat sowas inzwischen zu bieten... Newcomer sieht genau nach dem aus was ich gerne hätte *g*



    Quelle: http://www.protovision-online.de

  • nun ja, genau wissen tu ichs auch nicht aber ich vermute mal (bsp. NEWCOMER), daß die Grafik aus einem Zeichensatz besteht also 8*8 Pixel großen definierbaren Zeichen. Mit echt 3D hat das also gar nichts zu tun. Das Programm schaut einfach in einer 2D-Map nach, (Blickrichtung berücksichtigen!) wo welche Wände zu zeichnen sind (unsichtbare, verdeckte können aussortiert werden) und zeichnet dann die Wände aus den 8*8 Charactern. Fertig ist das Schnitzel. Ob das stimmt, weiß ich allerdings nicht, so würde ich das eben angehen.

  • Zitat

    Mit echt 3D hat das also gar nichts zu tun.

    davon ging ich aus als ich "pseudo-3D" schrieb :)


    Zitat

    Das Programm schaut einfach in einer 2D-Map nach, (Blickrichtung berücksichtigen!) wo welche Wände zu zeichnen sind (unsichtbare, verdeckte können aussortiert werden) und zeichnet dann die Wände aus den 8*8 Charactern. Fertig ist das Schnitzel. Ob das stimmt, weiß ich allerdings nicht, so würde ich das eben angehen.


    Ja, so in etwa habe ich mir das bisher auch gedacht. Also eine Map nach Schachbrett-Muster sollte da wohl die Grundlage bilden. Wie man jetzt aber ein Bild aus Fragmenten, das sich nach den informationen die mit den einzelnen Zellen der Map enthalten, zusammensetzt ist mir noch ein kleines Rätsel.
    Hachja.. naja an schweren Aufgaben soll man ja wachsen... hoffe ich zumindest *g*

  • das ganze ist relativ simpel, das mit der 2d map und so stimmt soweit. die einfachste variante wäre eine 2d map in der jedes "kästchen" jeweils angibt was an dieser stelle sein soll (im einfachsten falle entweder nichts oder eine wand). wenn du nun einen kompletten screen zeichnen willst gehst du auf deiner map erstmal in blickrichtung X schritte vorwärts, wobei X die "sichtweite" ist. beim c64 und fullscreen (text) screen bietet sich da zb X=13 an. nun hast du jedes grafikelement (wand frontal, wand links, wand rechts) in 13 verschiedenen vergrösserungsstufen im speicher... um das bild aufzubauen löschst du erstmal den screen, bzw kopierst boden und decke (bzw himmel) rein. danach baust du von hinten nach vorne das bild auf, in dem du von der stelle zu der du in der map vorher nach vorne gegangen bist wieder rückwärts zu deinem aktuellen standpunkt gehst, und bei jedem schritt die jeweils in der map stehenden sachen in der jeweilgen vergrösserungsstufe in den screen kopierst.


    das ganze ist natürlich sehr ineffezient (weil eine menge übermalt wird), zeigt aber das prinzip und funktioniert auch ganz gut wenn es nicht echtzeit sein muss. raum für optimierungen gibts natürlich auch ne menge, zb könnte man das ganze mit einem simplen raycaster verbinden und dann das bild ohne viel übermalen von vorne nach hinten aufbauen.


    mmh macht das sinn? :)


    ansonsten mal auf der 1541 test-demo disc guckn, das "labyrinth" program dadrauf macht sowas ähnliches in basic

  • Eine interessante Lösung für den C64 stellt Todd S. Elliott in seinem Artikel Creating 3-D Dungeon Crawls in C-Hacking #13 dar.


    http://www.ffd2.com/fridge/chacking/c=hacking13.txt


    Nachteil dieser Methode (und auch die auf der C1541-Demo-Disk) liegt darin dass nur 90° Winkel erlaubt sind.



    (Screenshot vom Atari)


    Texturen sind nicht möglich und die Sicht in die 3D-Welt wird limitiert (max. 3-4 Felder vorwärts und nur 1 Feld seitwärts).


    Newcomer scheint mit Pseudo-Texturen zu arbeiten sowie vorgefertigten 3D-Elementen, die, basierend auf einer 2D-Map, einfach in den Schirm gezeichnet werden.


    Der gezeigte Screenshot zeigt nur 90°-Winkel ... also eher kein Raycasting.


    Der Vorteil der genannten Methodik ist die Vermeidung umständlicher Berechnungen für die orthogonale Projektion.



    ---


    Wesentlich flexibler erscheint mir Raycasting zu sein.
    Erstmals eingesetzt 1989 bei HOOVER-3D von ID-Soft/Apogee, mit einfacher CGA-Grafik und uneingeschränkt lauffähig auf einem 80286 mit 8 MHz und einfacher HGA oder CGA-Grafikkarte.


    Zu Raycasting in C / C++ gibt es doch so viele schöne Tutorials.


    Hier mal eines :
    http://student.kuleuven.be/~m0216922/CG/raycasting.html


    und noch ein schönes :
    http://www.permadi.com/tutorial/raycast/index.html