Theorie und Implementierungen von Vektorspielen (Wireframe, Elite-like)?


7

Ich bin daran interessiert, mehr darüber zu erfahren, wie Vektorspiele wie Elite und Star Wars Atari von Grund auf aufgebaut wurden. Die Frage ist nicht, wie Vektorgrafiken mit modernen 3D-APIs wie OpenGL und DirectX implementiert werden können, da dies recht einfach ist und kein Vektor- / Matrixsystem wie bei diesen Spielen von Grund auf neu erstellt werden muss.

Einige Dinge, die ich über diese Spiele vermute:

  • Sie arbeiten auf einem extrem niedrigen Niveau und sind in ASM geschrieben
  • Sie sind echte 3D-Spiele und fälschen sie nicht wie After Burner. Auch nicht wie Wolfenstein 3D. Afterburner verwendete Rotozoom / Raster-Effekte und Wolfenstein 3D verwendete Raycasting und 2D-Skalierung und es ist nicht wirklich 3D, da Sie nicht nach oben gehen können. Selbst wenn Ihnen die Build Engine gefallen könnte, die Duke Nukem 3D verwendet hat, ist alles außer den Wänden nur ein Sprite. Star Fox ist näher dran, da es tatsächliche 3D-Modelle verwendet, aber die Implementierung verwendet den Super-FX-Chip von SNES und verwendet wahrscheinlich Scanline-Tricks. Ich weiß, dass Elite wahrscheinlich auch diese Scanline-Tricks verwendet (zumindest bei einigen Implementierungen wie Elite NES), aber ich bin mir bei SWA nicht sicher, da es einen speziell angefertigten Arcade-Automaten verwendet. In jedem Fall würde ich gerne mehr darüber erfahren.
  • Ihre 3D-Modelle sind tatsächliche 3D-Modelle. Sie werden als Vektoren definiert und entsprechend der Position der Kamera transformiert.

Ich weiß, das Beste wäre, die Quelle von Elite zu zerlegen und zu sehen, wie die Dinge von mir selbst gemacht wurden, aber bevor ich das mache, möchte ich mehr darüber wissen, wie sie gemacht wurden und ob es moderne Open-Source-Projekte gibt, die ähnliche Techniken zeigen . Ich meine nicht Elite-Remakes wie Oolite (das OpenGL und Obj-C verwendet), sondern Projekte, die ähnliche Techniken verwenden und die direkte Verwendung von APIs wie OpenGL vermeiden - jedoch nicht unbedingt Projekte auf niedriger Ebene, die 2D-Bibliotheken wie SDL (ohne OGL) verwenden. sollte zumindest vorerst reichen.

Ich weiß, dass der Quellcode von MESA3D wahrscheinlich viele der Routinen enthält, die Spiele wie Elite und SWA implementiert haben - ich möchte sie nur im Kontext eines Spiels sehen. Ich weiß, dass Elite und SWA im Grunde genommen Rasterisierung implementiert, ihr Format für Modelle und einen Loader erstellt haben (ich bin mir ziemlich sicher, dass zumindest SWA Modelle von Modellierern mit Werkzeugen erstellt hat, obwohl es nicht unmöglich ist, TIE-Kämpfer hart zu codieren es ist schwer, dies genau zu tun) und viele andere Dinge, die mir vielleicht nicht bewusst sind. Aber es ist wirklich zeitaufwändig, sich darauf einzulassen, und mir ist nicht viel von dem, was darin enthalten ist, wichtig. Denken Sie daran, dass Spiele wie Elite aufgrund des geringen ROM- und RAM-Werts von Computern und Konsolen zu dieser Zeit sehr leicht waren.

Ich bin neu in 3D-Grafiken und alle meine Annahmen basieren auf meinen begrenzten Kenntnissen in 3D-Geometrie und Mathematik auf Schulebene. Tut mir leid, wenn ich irgendeinen Bullshit gesagt habe. Aber ich würde wirklich gerne mehr darüber erfahren, wie diese Spiele in jedem Detail funktionieren, und möglicherweise nicht nur "X-Buch kaufen", da ich ziemlich pleite bin. Obwohl ich ein Buch über die Entwicklung von Elite oder ein ähnliches Spiel kaufen würde, falls es existiert. Einige allgemeine Vorschläge würden ausreichen.


Es ist erwähnenswert, dass Elite und Star Wars auf sehr unterschiedliche Weise funktionierten. Elite verwendete die Software-Rasterisierung von 3D-Modellen in Pixel, während Star Wars auf einer Vektoranzeige lief, die nicht einmal Pixel hatte. Stattdessen zeichnete der Anzeigestrahl beliebig farbige Linien direkt auf den Bildschirm, konnte sie jedoch nicht ausfüllen.
Trevor Powell

Haben sie nicht Bresenham-Linien (oder DDA-Linien) für projizierte Punkte gezeichnet (können auf ähnlichen Dreiecken abgeleitet werden)?
user712092

Antworten:


3

Die Frage ist nicht, wie Vektorgrafiken mit modernen 3D-APIs wie OpenGL und DirectX implementiert werden können, da dies recht einfach ist und kein Vektor- / Matrixsystem wie bei diesen Spielen von Grund auf neu erstellt werden muss.

Vektoren sind buchstäblich nur eine Liste von Zahlen. Matrizen sind nur ein Gitter von Zahlen. Der interessante Teil ist die Mathematik, die Sie für sie verwenden, aber das Zeug ist auch trivial - schnappen Sie sich einfach ein Mathematikbuch auf Schulebene, in dem solche Dinge erklärt werden. Dies sind nur etwa 50 bis 100 Codezeilen. Überschätzen Sie den Aufwand hier also nicht.

Sie sind echte 3D-Spiele und fälschen sie nicht wie After Burner. Auch nicht wie Wolfenstein 3D.

Wolfenstein 3D ist meistens echtes 3D, da Raycasting wohl "realer" ist als der übliche geometrische Ansatz, den wir verfolgen. Sie erkennen jedoch zu Recht, dass es sich um ein anderes Modell handelt und nicht um ein Modell, an dem Sie hier interessiert sind.

Ich weiß, das Beste wäre, die Quelle von Elite zu zerlegen und zu sehen, wie die Dinge von mir selbst gemacht wurden

Lass dich nicht besonders auf Elite ein. Es wird nichts Besonderes verwendet - die Software-Rasterisierung ist ziemlich gleich, egal welche Software es getan hat. Sie nehmen jedes Objekt und transformieren alle seine Koordinaten in den Weltraum. Anschließend transformieren Sie alle diese Weltraumkoordinaten relativ zum Betrachter so, dass sie sich im Ansichtsraum befinden, und projizieren sie dann in 2D, sodass sie sich im Bildschirmraum befinden. Jede Transformation ist im Grunde nur eine Rotation und eine Übersetzung, und die Projektion ist normalerweise kaum mehr als eine Division, wenn Sie die richtigen Annahmen treffen.

Es gibt einige andere knifflige Teile, an die ich mich nicht sofort erinnern kann, wie das Entfernen der unsichtbaren Flächen, aber ich denke, dass dies nur mit der Reihenfolge der Scheitelpunkte möglich ist - rendern Sie eine Linie zwischen zwei verbundenen Scheitelpunkten, wenn sie im Uhrzeigersinn auf dem Bildschirm angezeigt werden Raum, und nicht, wenn sie nicht sind. (Zum Beispiel.)

Es ist nicht unmöglich, TIE-Kämpfer hart zu codieren. Es ist schwierig, dies genau zu tun

Die meisten dieser Modelle hatten nur etwa 20 oder 30 Eckpunkte - leicht im Bereich der Hardcodierung. Ich gehe davon aus, dass die ursprünglichen Autoren die Modelle zuerst auf Millimeterpapier gezeichnet und dann die Scheitelpunktwerte in den Code kopiert haben.


Also war meine Vermutung für die Rasterung richtig? Wenn ich das, was Sie gesagt haben, richtig verstanden habe, ist es der Standard-3D-Programmierung mit OpenGL nicht unähnlich. Matrixmultiplikationen und dergleichen, richtig? Aber ich muss das Keulen der Rückseite und die Z-Pufferung herausfinden. Kennen Sie gute Open-Source-Implementierungen der Rasterisierung? Ich denke, der Algorithmus ist nicht so schwierig, aber ich spiele gerne mit Code herum, um Dinge zu verstehen. Ich möchte nichts kopieren (auch weil ich ein modifiziertes Z80-ASM verwende, das sehr spezifisch ist), aber es ist immer noch schön eine Art Referenz haben.
EliteIsAwesome

Sicher, jedes Software-Rendering von Vektorgrafiken ist per Definition eine Rasterisierung. Ich kenne keinen Beispielquellcode, aber sobald Sie die Eckpunkte im Bildschirmbereich haben, können Sie die Linien mit dem Bresenham-Algorithmus zeichnen. Was das Backface-Culling und das Z-Buffering betrifft, hat Elite keine "Gesichter", sondern nur Kanten, und es wurde sicherlich kein Tiefenpuffer verwendet - es gab einfach nicht genug Speicher dafür und nur diese Technik begann Mitte der 90er Jahre wirklich für Spiele verwendet zu werden.
Kylotan

Ja, ich wusste, dass Z-Buffering relativ später kam, hätte stattdessen "Z-Culling" sagen sollen. Ich denke, ich muss einen der einfacheren Algorithmen verwenden. Vielen Dank, dass Sie mich auf Bresenhams Algorithmus hingewiesen haben. Er sieht recht günstig aus.
EliteIsAwesome

2

Sie suchen nach vertexbasiertem 3D , das beliebige (uneingeschränkte) Geometrien im 3D-Raum unterstützt. Raytracing im ursprünglichen Sinne ist echtes 3D, da es unbegrenzte Freiheitsgrade (DoF) unterstützen kann. Raycasting (im Sinne der Spielentwicklung und nicht im ursprünglichen Sinne, der dem Raytracing mit Ausnahme der Strahlrichtung ähnlich ist ) schränkt jedoch Freiheitsgrade ein, z. Höhenkarte basierend auf der in Comanches Voxel Raycaster oder Wolfenstein, bei dem sich der Spieler tatsächlich in einem reinen 2D-Raum bewegt. All 3D - Engine , die durch Achsen willkürliche Geometrien ohne Einschränkung unterstützt , ist nur eine Darstellung im Bildraum von einer Art des Modells einer 3D-Welt, unabhängig von dieser Darstellung.

Sie arbeiten auf einem extrem niedrigen Niveau und sind in ASM geschrieben

In Elites Fall war es, wie Sie wahrscheinlich wissen, ja. Teile anderer, ähnlicher Spiele wurden in jedem Fall sicher in ASM- oder Maschinencode-Anweisungen geschrieben, wenn man die anspruchsvolle mathematische Verarbeitung ohne die heutigen ALUs berücksichtigt. Da es nur kleine Teile einer Codebasis gibt, die wirklich leistungskritisch sind, ist es denkbar, dass einige weniger kritische Teile davon (z. B. 3D Construction Kit und die von ihm erstellten Spiele) in C ++ geschrieben wurden. Angesichts der begrenzten Ressourcen, insbesondere auf Computern vor der 16-Bit-Ära, ist es jedoch eher eine Mischung aus Assembler- und Rohmaschinencode (Sie könnten tatsächlich große Sequenzen von Nullen und Einsen eingeben und diese als Datenträger auf der Festplatte speichern Programm - Himmel hilf dir, wenn du einen Fehler gemacht hast).

Ihre 3D-Modelle sind tatsächliche 3D-Modelle

Weitere Hinweise zum Erstellen solcher Spiele von Grund auf neu:

Mathe, vor allem anderen. Um authentisch zu sein, würden Sie Festkomma-Mathematik verwenden. Was Sie auf der mathematischen Seite implementieren können, bestimmt, welche Art von Spiel Sie machen können. Zeitraum. Ich kann Ihnen garantieren, dass dies die Philosophie ist, die Braben und Bell zur Elite gebracht haben. Prototypisieren, optimieren, spülen und wiederholen. Sehen Sie, was möglich ist. Dann gestalte dein Spiel nach dem, was du möglich gemacht hast. Dies wird auf heutigen Systemen nicht der Fall sein, da wir bereits wissen (am unteren Ende), was möglich ist. Finden Sie (und verstehen Sie vorzugsweise die Mathematik dahinter - aber dies ist nicht zu 100% notwendig) Implementierungen der Grundbausteine: 3D-Vektoren, Rotationsmatrizen, Quaternionen (ich denke, sie haben früher die Eulersche Rotation bevorzugt, aber nicht sicher, Quaternionen sind es trotzdem billiger zu berechnen) und dergleichen. Auch das'Unterschätzen Sie nicht die Auswirkungen und die effiziente Datenstruktur auf die Leistung!

Als nächstes schreiben Sie den Code. Implementieren Sie diese Strukturen und Operationen (sowie die zugehörigen Strukturen und Logik für Ihr umfassenderes Spiel), als solche) in einer höheren Sprache wie C ++ oder noch besser (schneller), C. Optimieren Sie dann von dort aus nach Bedarf in asm-Blöcke. Da ich davon ausgehe, dass Sie dies auf x86 oder einer anderen modernen Architektur tun möchten, sollte dies für Ihre Zwecke ausreichen. Wenn Hardware aus der 16-Bit-Ära wie Motorola 68000-basierte Systeme verwendet wird, verwenden Sie häufig C und Refactor in ASM. Wenn 8-Bit-Hardware, C für begrenzte Bits machbar ist, würde ich denken, aber Sie werden wahrscheinlich gnadenlos in ASM umgestalten. Wenn Sie auf 8-Bit- oder 16-Bit-Systemen arbeiten, müssen Sie sich mit den Architekturen, den zunehmend undurchsichtigen Tricks, die auf diesen Plattformen verwendet werden, usw. vertraut machen. Daher würde ich diese Route nicht empfehlen, da es sich buchstäblich um eine handelt dunkle Kunst heutzutage (obwohl es überraschenderweise immer noch Gemeinschaften gibt, die sich für diese meist nicht mehr existierenden Systeme entwickeln).

Ihre gründliche Untersuchung der Techniken der alten Schule ist lobenswert. Du wirst auf jeden Fall mit einer Aufwertung von nur am Ende , wie viel imaginably konnte mit der Hardware vorgenommen werden wir heute haben.


Einige ähnliche Spiele, an die ich mich erinnere, abgesehen von 3DCK, die Sie sich ansehen können:

  • Dunkle Seite
  • Starglider
  • Interphase
  • Virus (großartiges kleines Spiel)
  • Conqueror (dieselbe Engine wie Virus, die auf einer einzigen Tastatur mit einem Kumpel, einem Mann, dem Panzerkanonier und einem, dem Fahrer, gespielt wurde, tolle Erinnerungen)
  • Söldner (nur wenige Monate nach Elite veröffentlicht)
  • Damokles (und andere Söldner-Fortsetzungen und Missionsscheiben)
  • Novell NetWars für x86-Architektur (kann sogar noch auf so etwas wie Dosbox ausgeführt werden, obwohl die Ausführung im Netzwerk meiner Meinung nach ein authentisches Setup erfordern würde)

Da es sich bei den auf Ray Casting basierenden Engines nicht um echte 3D-Motoren handelt, bezog ich mich nur auf die Tatsache, dass die meisten von ihnen nur einen zweidimensionalen Raum darstellten. Elite erlaubte eine 360 ​​° -Bewegung und das ist für mich die Definition eines 3D-Spiels. Die Definition der 3D-Darstellung ist flexibler, da stimme ich voll und ganz zu! Edit: Ich wollte mich bei Ihnen für Ihre gründliche Antwort bedanken. Wenn Sie interessiert sind, entwickle ich meine kleine Elite-ähnliche Demo auf Gameboy. Viel Glück mit Ihrem Voxelmotor!
EliteIsAwesome

Hey, ja, ich habe diesen Abschnitt verfeinert und neu verfeinert. Ich weiß, was Sie gemeint haben. Ich kann Ihnen sagen, dass Sie gute Nachforschungen angestellt haben, bevor Sie diese Frage gestellt haben. Was dein Spiel betrifft, bin ich sehr interessiert, gibt es einen Feed oder etwas, das ich abonnieren kann?
Ingenieur

Ich versuchte mein Bestes. Ich hatte bereits vor, mich intensiv mit Mathematik zu beschäftigen. Können Sie mir neben den bereits erwähnten Fächern weitere Fächer vorschlagen, die ich in Betracht ziehen sollte? Keine Angst vor ihnen!
EliteIsAwesome

Einfach überarbeitet - Beschreibung von Raytracing vs. Raycasting. Es ist eine wichtige Unterscheidung. Raycasting im ursprünglichen Sinne war nur eine Optimierung des Raytracing, aber später bedeutete "Raycaster" Spiele, die im 3D-Stil von Wolfenstein / Doom / Duke Nukem implementiert wurden. Was Mathe betrifft, war meine noch nie beeindruckend. Aber Sie können auch mit den von mir erwähnten Themen eine bemerkenswerte Menge tun. Schauen Sie sich außerdem 3D Math für Spielprogrammierer und Datenstrukturen für Spielprogrammierer an. GPU Gems-Serie und Paul Bourkes Webseiten für Computergeometrie.
Ingenieur

OK danke. Obwohl ich denke, es wird mir schwer fallen, umfangreiche Berechnungen in eine Reihe von Registern und etwas Speicher zu übersetzen! Ich habe keine Blogs / Feeds zu meinem Projekt, da ich sehr wenig getan habe - das Quellmaterial ist sehr knapp, aber ich denke, deshalb fand ich es so charmant. Wenn ich jemals etwas daraus mache, werden Sie wahrscheinlich davon hören, da ich höchstwahrscheinlich für Sekunden hierher kommen muss! Weitere
Informationen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.