Dieses Projekt ist definitiv eines meiner fortgeschrittensten. Ich habe angefangen, einen Web-BMD-Viewer für Twilight Princess (Nintendo GameCube) zu programmieren, weil ich dieses Spiel liebe und es mich als Spieleproduzent fasziniert, Level zu analysieren und in die Details ihrer Erstellung einzutauchen. Dieses Projekt ist für mich eine Möglichkeit, dieser Leidenschaft nachzugehen und ein tieferes Verständnis für das Spiel zu erlangen, das ich liebe. Es ist eine herausfordernde und lohnende Lernerfahrung. Ich bin gespannt, wohin mich dieses Projekt führen wird und welche neuen Entdeckungen ich dabei machen werde. Bis jetzt hat mich dieses Projekt monatelange Recherche gekostet. Eine Recherche, die auf der Arbeit von mehr als 20 anderen Leuten basiert, die recherchiert und ihr Wissen und ihre Erkenntnisse zu rarc, bmd, gcm yaz0, j3d, tev usw. geteilt haben. Ich bin auf eine Person gestoßen, die ich angeschrieben habe, um sie zu würdigen:
Unser Dank geht an: („LordNed“, „thakis“, „Jasper St. Pierre“, „Kiwi“, „Dolphin Emulator Team“, „Gamma“, „Zan“) – für ihre Pionierarbeit!
Wasser, Nebel und animierte Texturen sind derzeit auf der Roadmap
Das Programm wurde mit three.js und webGL programmiert. Es läuft mit konstanten 60fps im Chrome-Browser. Leider kann ich den interaktiven Viewer (Modelle, Räume etc.) nicht mit euch teilen, da ich nicht sehen möchte, wie weit die Grenzen für Fair Use von Forschung reichen. Viel Spaß mit meiner Montage:
https://api.fenixfox-studios.com/assets/d43523dd-5cbe-4da4-9c7d-2d275690050a
BMD und BDL sind die Dateiformate, die Nintendo zum Speichern von Modelldaten in seinen GameCube- und Wii-Spielen verwendet. Sie sind Teil der J3DGraph-Bibliothek von Nintendo, die eine Komponente des größeren JSYSTEM-Toolkits ist. BMD erschien erstmals im Spiel Luigi's Mansion. Es war damals das einzige Modellformat, das in Super Mario Sunshine verwendet wurde. The Wind Waker führte außerdem das BDL-Format ein, das eine Erweiterung von BMD mit einem zusätzlichen Abschnitt für Material-FIFO-Anweisungen namens MDL3 ist. MDL3 wird verwendet, um die Rendering-Effizienz zu verbessern. Super Mario Galaxy 2 war das letzte Spiel, das dieses Modellformat verwendete.
JSYSTEM ist ein proprietäres Toolkit zur Spieleentwicklung, das von Nintendo zum Erstellen von Spielen für seine Konsolen verwendet wird. Es enthält verschiedene Bibliotheken und Tools für Aufgaben wie 3D-Modellierung, Animation und Physik. J3DGraph ist eine Bibliothek innerhalb von JSYSTEM, die Funktionen zur Handhabung von 3D-Grafiken bereitstellt und für die Dateiformate BMD und BDL verantwortlich ist. BMD steht für Binary MoDel und BDL steht für Binary Display List.
Das JSYSTEM-Toolkit wurde Anfang der 2000er Jahre von Reverse Engineers und Game Moddern entdeckt, als sie begannen, den Code von Nintendo GameCube- und Wii-Spielen zu analysieren und zu dekompilieren. Sie stellten fest, dass viele der Spiele ähnliche Codestrukturen und Bibliotheken hatten, was sie die Existenz eines gemeinsamen Entwicklungs-Toolkits vermuten ließ. Nach viel Recherche und Experimenten konnten sie die JSYSTEM-Bibliotheken aus den Spielen identifizieren und extrahieren und begannen, seine verschiedenen Komponenten zu dokumentieren und zurückzuentwickeln, darunter die J3DGraph-Bibliothek und die BMD- und BDL-Dateiformate.
Als das Verständnis für JSYSTEM wuchs, begannen Modder, ihre eigenen Tools für die Arbeit mit dem JSYSTEM-Format zu entwickeln und begannen, ihre eigenen benutzerdefinierten Modelle und Texturen zu erstellen und sogar neue Spiele mithilfe der JSYSTEM-Bibliotheken zu entwickeln. Dies führte zur Gründung einer lebendigen Modding-Community, die bis heute besteht und in der viele Modder ihre Erkenntnisse und Tools online teilen.
An den eigentlichen *.dol- oder *.gcm-Containerformaten war ich zunächst nicht wirklich interessiert, da andere bereits großartige Arbeit geleistet und gebrauchsfertige Tools bereitgestellt hatten (ich habe später selbst einen GCM-Reader erstellt). Nach einigem Suchen fand ich Ordner, die so aussahen, als könnten sie interessante Dinge enthalten, wie Räume und andere Elemente. Große Gebiete, wie Faron Woods, wurden in Blöcke aufgeteilt und in separaten Dateien gespeichert, die später zusammengeführt wurden, um das gesamte Gebiet zu bilden.
Aber ich wollte es einfach angehen. Vielleicht mit etwas Einfachem! Nachdem ich den Großteil des Materials im Ordner entpackt hatte, sortierte ich die Dateien nach Größe und fand ein supereinfaches Objekt. Als ich die Datei in HexWorkshop überprüfte, stieß ich auf Markierungen wie VTX, INF, DRW und SHP. Anhand der Scheitelpunktpositionen konnte ich erkennen, dass es sich um eine flache Schachtel mit einem einfachen Türknauf handelte. Bald wurde mir klar, dass es die Tür vom Tempel am Seebett war.
Ich wusste, wie das Objekt aussehen könnte, und ich wusste, wo ich nach den grundlegenden Informationen wie Scheitelpunktkoordinaten und Texturinformationen suchen musste.
Sie müssen vorsichtig sein, da einige der Informationen für Ihren Fall einfach falsch sind. Bestimmte Attribute waren einfach anders als in den Dokumenten angegeben. Aber ein solches Formatblatt ist alles, was Sie brauchen, um ein 3D-Modell und seine Textur zu extrahieren!
Nach meinem erfolgreichen Versuch, zumindest ein einfaches Objekt zu extrahieren, dachte ich, es wäre an der Zeit, tiefer zu graben und einen ganzen Bereich in Angriff zu nehmen! Bewaffnet mit demselben Algorithmus, den ich gerade geschrieben habe, wählte ich die Datei mit dem Namen R00_00 aus. Ich hoffte, dass es Ordon Village oder Faron Woods sein würde. Aber das war egal, denn alles, was ich bekam, war ein Haufen Müll. Eindeutig ein Fall von falscher Scheitelpunktreihenfolge. Können Sie anhand dieses Bildes erkennen, um welchen Raum es sich handelt?
Form für Form tastete ich mich langsam vor. Hier und da tauchten Klippen und Grabsteine auf. Mir wurde klar, dass ich auf den Friedhof von Kakariko blickte.
Nach einiger Zeit konnte ich dieses Ergebnis erzielen: Bestimmte Objekte fehlten, einige Flächen waren invertiert und nicht eine einzige Textur schien korrekt angewendet worden zu sein.
Die Lösung war etwas verwirrend. Obwohl für bestimmte Formen bestimmte Materialindizes definiert waren, bestand zwischen ihnen keine direkte 1:1-Beziehung. Stattdessen musste man sich die im INF-Abschnitt der BMD-Datei definierte Szenenhierarchie ansehen. Diese Hierarchie bestand aus einem Knotenbaum, der entweder eine Form oder ein Material darstellen konnte. Normalerweise begann die Hierarchie mit einem Material, gefolgt von einigen Formen. Beispielsweise könnte etwas wie (mat1, shp2, shp5, shp6, mat2, shp1, shp12...) angezeigt werden. In diesem Fall würden die Formen 2, 5 und 6 alle Material 1 verwenden und so weiter.
Na ja, großartig, aber jedem, der dieses Spiel jemals gespielt hat, fällt vielleicht auf, dass die Materialien nicht richtig aussehen. Die Farben stimmen nicht, die Materialien gehen nicht ineinander über und es sieht insgesamt ziemlich dunkel aus. An dieser Stelle wäre ich in den umwerfendsten Teil der ganzen Sache eingetaucht. Der GameCube verwendet TEV-Stufen oder Texture Environment-Stufen, um diese Aufgaben zu bewältigen. TEV-Stufen sind für das Mischen von Texturen, das Verwalten von Farben und das Anwenden von Transparenzeffekten verantwortlich. Beachten Sie die Tatsache, dass GameCube Transparenzeffekte, wie wir sie heute kennen, mit zwei Renderdurchgängen und zuerst gerenderten weit entfernten Objekten nicht wirklich unterstützte. Es gibt einige GitHub-Repos, einige Artikel, einige Forenthreads. Sammeln Sie so viele Informationen wie möglich!
Ein weiterer wichtiger Teil, den ich hinzufügen musste, waren die atmosphärischen Effekte wie Nebel, Blüten und Wolken. Bis zu diesem Zeitpunkt konnte ich die Nebel- und Blüteneffekte nicht erfolgreich erzeugen, aber ich habe den Wolkenschatten gefunden und ihn in eine TEV-Bühne zum Mischen eingefügt. Ich suche immer noch nach den richtigen UV-Koordinaten für die Wolken.
Das Endergebnis dieses Raumes würde so aussehen: (Es hat tatsächlich eine ganze Weile gedauert, bis wir so weit gekommen sind)
Dieses Projekt war eine unglaubliche Reise. Indem ich meine Zeit damit verbrachte, herauszufinden, wie kluge Leute technische Einschränkungen der Vergangenheit lösten, konnte ich die komplexe Schönheit von Twilight Princess schätzen lernen. Ich habe gute Fortschritte gemacht, aber es gibt noch eine riesige Liste von Dingen, die ich erkunden und umsetzen muss. Ich habe vor, weiter an diesem Viewer zu arbeiten und Funktionen wie Nebel, BTK (Texture Animation) und andere atmosphärische Effekte hinzuzufügen, um ihn so präzise und immersiv wie möglich zu gestalten.