Skripting und Modding - Institut für Verteilte Systeme
Transcription
Skripting und Modding - Institut für Verteilte Systeme
Seminar 3D-Modellierung und virtuelle Präsenz My-HL Scripting / Modding / Programmierung von 3D-Objekten - Ausarbeitung Dominik Jäger 1 Inhaltsverzeichnis 1 Einleitung........................................................................................................................................ 3 2 Modding.......................................................................................................................................... 3 2.1 Begriffserklärung..................................................................................................................... 3 2.1.1 Erweiterungsset................................................................................................................ 3 2.1.2 Mod.................................................................................................................................. 3 2.1.2.1 Mutator..........................................................................................................................3 2.1.2.2 Partial / Total Conversion............................................................................................. 4 2.1.2.3 Standalone..................................................................................................................... 4 2.1.2.4 Engine........................................................................................................................... 4 2.2 Die Entstehung.........................................................................................................................4 2.2.1 Geschichte........................................................................................................................ 4 2.2.2 Kommerzieller Erfolg...................................................................................................... 4 2.2.3 Unterstützung in Spielen.................................................................................................. 5 2.3 Fallbeispiele............................................................................................................................. 5 2.3.1 Bekannte Mods................................................................................................................ 5 2.3.2 Half-Life...........................................................................................................................6 2.3.3 Half-Life 2: Garry's Mod................................................................................................. 7 3 Editing............................................................................................................................................. 7 3.1 Inhalte...................................................................................................................................... 8 3.1.1 Arten von Spielinhalten................................................................................................... 8 3.1.2 Strukturierung von Spielinhalten..................................................................................... 9 3.2 Editoren..................................................................................................................................10 3.2.1 Half-Life: Worldcraft / Hammer....................................................................................10 3.2.2 Modding in Second Life................................................................................................ 11 4 Scripting........................................................................................................................................ 12 4.1 Beispiele für Skriptsprachen..................................................................................................12 4.1.1 QuakeC...........................................................................................................................12 4.1.2 Python............................................................................................................................ 12 4.1.3 Python in Blender...........................................................................................................13 4.1.4 Scripting in Second Life: Linden Scripting Language...................................................14 4.2 Programmierung von 3D-Objekten....................................................................................... 14 4.2.1 Programmierung in 3D-Umgebungen............................................................................14 4.2.2 Spezielle 3D-Objekte..................................................................................................... 15 4.2.3 Modifizieren von 3D-Objekten...................................................................................... 16 4.3 Beispiele.................................................................................................................................16 4.3.1 Türe................................................................................................................................ 17 4.3.2 Portal.............................................................................................................................. 17 5 Quellenangaben............................................................................................................................. 18 5.1 Bilder..................................................................................................................................... 18 5.2 Informationen.........................................................................................................................18 2 1 Einleitung Dieses Dokument ist eine Ausarbeitung des Themas „Scripting / Modding / Programmierung von 3D-Objekten“ aus dem Seminar „3D-Modellierung und virtuelle Präsenz“ im Sommersemester 2007 an der Universität Ulm, Institut für verteilte Systeme. Der Titel des Themas enthält drei Themenbereiche, die hier folgendermaßen behandelt werden: Modding ist das Hauptthema dieser Ausarbeitung und stellt einen roten Faden durch alle Themengebiete dar. Deshalb beginnt dieses Dokument auch mit einem allgemeinen Abschnitt über Modding bevor in einem zusätzlichen Themengebiet namens „Editing“ die verschiedenen Aspekte der Modifikation von Spielinhalten behandelt werden. Hier werden auch einige Beispiele bekannter Editoren für Spielinhalte vorgestellt. Scripting kann ebenso wie Editing als ein Werkzeug für die Realisierung von Mods betrachtet werden. Daher wird dieser Bereich nach dem Kapitel „Editing“ als drittes behandelt. Die Programmierung von 3D-Objekten bezieht sich auf die Möglichkeiten, die man unter anderem mit Scripts hat, in 3D-Umgebungen mit Objekten verschiedenster Art umzugehen. Dieser Abschnitt stellt eine Vertiefung des Abschnitts über Scripting dar, wobei die behandelten Grundlagen aber auf beliebige Programmiersprachen übertragbar sind. 2 Modding 2.1 Begriffserklärung Es haben sich neben dem Begriff „modding“ noch einige weitere ähnliche bzw. synonyme Begriffe eingebürgert, deren Unterschiede im folgenden erläutert werden. 2.1.1 Erweiterungsset Erweiterungssets sind Erweiterungen des Spiels, die vom Hersteller des Spiels vertrieben werden, um das Spielerlebnis mit neuen Inhalten zu verlängern. Diese Erweiterungen benötigen in der Regel eine Installation des Hauptspiels, um lauffähig zu sein und werden zu einem niedrigeren Preis als das Original angeboten. So kann mit relativ wenig Entwicklungsaufwand der kommerzielle Erfolg des Originalspiels fortgeführt werden. Von der technischen Umsetzung her werden solche Erweiterungen in heutigen Spielen genau so realisiert wie auch Mods. Für die Unterscheidung dieses Begriffs von einem Mod gibt es mehrere Gründe. Zum einen werden bei Erweiterungssets meist nur relativ wenige Änderungen am Spielprinzip vorgenommen und stattdessen vorrangig die Geschichte des Originalspiels fortgesetzt. Außerdem werden Erweiterungssets vom Hersteller des Spiels oder einer lizesierten zweiten Firma gezielt für den kommerziellen Spielemarkt entwickelt. 2.1.2 Mod Der Begriff „mod“ ist eine Abkürzung von „modification” (dt. Modifikation) und somit „modding“ eine Abkürzung von „modifying“ (dt. modifizieren, ändern). Modding ist also ein Vorgang der Modifikation einer Sache. In dem hier behandelten Kontext ist mit Modding das Modifizieren von Computerspielen gemeint und wird im folgenden entsprechend verwendet. Im Gegensatz zu Erweiterungssets ist eine Mod eine von Spielern abgeänderte Versionen eines Spiels. Obwohl schon einige wenige Mods den Sprung zum kommerziellen Produkt geschafft haben, werden diese nicht von Anfang an vom Hersteller des Spiels unterstützt. Stattdessen sind Mods anfangs häufig nur Hobby-Projekte von Fans des Spiels. [3] 2.1.2.1 Mutator Der Begriff „Mutator“ wurde z.B. von der Unreal Tournament Reihe geprägt. Er bezeichnet eine minimale Änderung in der Spielkonfiguration. Meistens wird nur ein Parameter wie z.B. Schussstärke oder Gravitation verändert, um das Spielerlebnis abwechslungsreicher zu gestalten. 3 2.1.2.2 Partial / Total Conversion Eine Mod bezeichnet man als „Partial Conversion“, wenn nur einige Inhalte des Originalspiels geändert und alle anderen aus dem Originalspiel übernommen wurden. Wurden alle oder zumindest die meisten Inhalte modifiziert, kann die Mod als „total conversion“ bezeichnet werden. Eine total conversion Mod ändert zumindest das Spielprinzip und die meisten im geänderten Spiel vorkommenden Inhalte, kann aber den Quellcode des Hauptprogramms unverändert lassen. 2.1.2.3 Standalone Eine Mod bezeichnet man als „Standalone-Mod“, wenn ihre Installation bereits alle zum Spielen benötigten Dateien beinhaltet und somit das Originalspiel nicht vorausgesetzt wird. 2.1.2.4 Engine Die „engine“ bezeichnet das Kernprogramm eines Spiels. Ändert eine Mod dieses Kernprogramm, was die Verfügbarkeit des Originalquellcodes voraussetzt, bezeichnet man diese als „Engine-Mod“. 2.2 Die Entstehung 2.2.1 Geschichte Modifikationen von Spielen haben ihren Ursprung in der Spieler-Community. Schon zu C64 Zeiten versuchten Spieler mit ausreichenden Programmierkenntnissen, Originalspiele nach ihren Vorstellungen abzuändern. Zu dieser Zeit brachten die Spiele im Gegensatz zu heute noch keine eingebaute Unterstützung für solche Vorhaben mit und die Änderungen mussten direkt im Sourcecode des Spiels erfolgen. Eines der ersten Spiele auf dem PC, dass die Erstellung eigener Levels ermöglichte war Doom. Die Werkzeuge waren damals allerdings noch wenig ausgereift und schwer zu bedienen. Tiefer gehende Modifikationen, z.B. an der Spiellogik erforderten weiterhin eine Änderung des Sourcecodes, welcher allerdings bereits seit Jahren vom Hersteller offen gelegt wurde. Dies hat bereits einige engine-mods hervorgebracht, welche z.B. die Grafik auf einen neueren Stand gebracht haben. Auf diesen engine-mods aufsetzend entstanden dann auch viele Mods, die weit über das erstellen eigener Levels hinausgehen und teilweise noch heute weiter entwickelt werden. Diese Entwicklung hatte zur Folge, dass Mods vor allem im Genre der firstperson-shooter sehr populär geworden sind. In den Jahren nach der Veröffentlichung von Doom gab es einige weitere Spiele des selben Herstellers, welche eine immer bessere Unterstützung für Mods boten. So gab es für das Spiel Quake bereits eine einfache Skriptsprache namens QuakeC, welche in einem späteren Kapitel noch näher betrachtet wird. Diese ermöglichte bereits weitreichende Änderungen an der Spiellogik, der Spielphysik und vielem mehr ohne dass eine Änderung am Quellcode des Hauptprogramms notwendig war. Auch der Quellcode dieses Spiels und der seines Nachfolgers Quake 2, was eines der Spiele mit den meisten Mods überhaupt ist, wurde bereits offen gelegt. Da die Entwicklung einer großen Mod sehr aufwendig ist, schließen sich oft mehrere Spieler zu einer Gruppe zusammen, um die Mod zu realisieren. Hier wird dann in der Regel eine ProjektWebsite ins Leben gerufen, über die sich die Gruppe koordinieren und Beta-Versionen ihrer Mod veröffentlichen kann. So können verschiedene Aspekte der Entwicklung auf die entsprechenden Talente in der Gruppe aufgeteilt werden. Dieser Prozess ist vergleichbar mit der Entwicklung einer open source Anwendung, wobei hier allerdings die Erstellung und das Design von Spielinhalten im Vordergrund steht. 2.2.2 Kommerzieller Erfolg Die Half-Life Mod „Counter-Strike“ ist das Paradebeispiel einer kommerziell erfolgreichen Mod. Sie konnte das Originalspiel im online multi-player Bereich deutlich übertrumpfen und ist bis heute eines der meist gespielten Mods. Angesichts des großen Erfolgs der Mod im online Bereich 4 entschloss sich der Hersteller von Half-Life, Valve Software, das Entwickler-Team zu unterstützen und die Mod kommerziell zu vertreiben. Dies ist ein gutes Beispiel dafür, wie eine Gruppe von Hobby-Entwicklern mit einer guten Idee eine Einstiegschance in die Spiele-Industrie erhalten konnte. Dem Beispiel folgend werden heute viele talentierte Entwickler aus der Modding-Szene von Spielefirmen eingestellt. So entstanden in jüngster Vergangenheit bereits kommerzielle Nachfolger ehemals frei erhältlicher Mods als eigenständiges Spiel. Ein Beispiel hierfür ist die Mod „Enemy Territory“, welche ehemals für das Spiel „Return to Castle Wolfenstein“ entwickelt wurde und jetzt vom ursprünglichen Entwicklerteam, welches inzwischen ebenfalls vom Hersteller des Originals übernommen wurde, als eine Art Strategiespiel im QuakeUniversum unter dem Namen „Enemy Territory: Quake Wars“ weitergeführt wurde. Diese Beispiele sollen vermitteln, wie weitläufig die Möglichkeiten im Bereich Modding sind und welchen enormen Einfluss Mods auf die Spieleindustrie genommen haben. [1], [2] 2.2.3 Unterstützung in Spielen Der kommerzielle Erfolg vieler Mods trug dazu bei, dass in heutigen Spielen einiger Genres die Unterstützung von Mods obligatorisch geworden ist. Aber das vereinfachen von Änderungen an Spielinhalten bringt auch direkt für den Hersteller des Spiels Vorteile. So erfordert das einfache Umschalten zwischen verschiedenen Inhalten eine gewisse Modularisierung in der Architektur des Programms und der Strukturierung der Inhalte sowie eine möglichst gute Trennung von Programm und Inhalten. Dies erleichtert auch die Herstellung und Einbindung eigener Erweiterungen sowie die lizensierte Weiterverwendung der engine durch andere Hersteller. Viele Hersteller veröffentlichen sogar ganze software development kits mit den selben Editoren und Hilfsanwendungen, die auch vom Hersteller selbst für die Erstellung der Spielinhalte verwendet wurden. 2.3 Fallbeispiele Im Folgenden werden einige Beispiele für Mods gezeigt, anhand deren individuellen Eigenschaften die zuvor eingeführten Begriffe näher erläutert werden. Die Beispiele in diesem Kapitel stammen aus dem Genre der Ego-Shooter, da dieses, wie schon zuvor erwähnt, eine Art Vorreiter-Rolle in der Unterstützung von Mods einnimmt. 2.3.1 Bekannte Mods Das wohl bekannteste Mod ist die auf Half-Life basierende Total Conversion „Counter-Strike“. Sie bietet neben eigenen Maps, Models, Waffen und Texturen auch einen völlig neuen Spielmodus. Dieser beinhaltet die Auseinandersetzung zwischen zwei Teams, den Terroristen und einer Anti-Terror Einheit. Während man je nach Art der Map als Terrorist eine Bombe an einem festgelegten Zielort deponieren bzw. Geiseln nehmen muss, versucht man in der Anti-Terror Einheit, Bomben zu entschärfen bzw. Geiseln zu befreien. Der Gewinner einer Runde erhält eine Belohnung in Form von Geld, welches über ein Kaufen-Menü in neue Waffen und Ausrüstungsgegenstände investiert werden kann. Dies verschafft gewinnenden Teams einen Vorteil in der nächsten Runde. Ein derart komplexes Spielprinzip war im MehrspielerModus des Originalspiels Half-Life nicht enthalten. Abbildung 1: Spielcover - Eine weitere bekannte Mod ist „Desert Combat“, eine Total Conversion des Counter-Strike Spiels Battlefield 1942, welches, wie der Name schon sagt, im 2. Weltkrieg angesiedelt ist. Desert Combat [5] versetzt die Inhalte dieses Spiels in das 21. Jahrhundert. Beispielsweise wurden Propellerflugzeuge durch Düsenjäger ersetzt. Manche Mods sind bereits für mehrere Spiele erschienen. So zum Beispiel die Mod „Team Fortress“ [4], welche neben neuen Maps und Models auch verschiedene neue Spielmodi im 5 Mehrspieler-Bereich einbringt, die ähnlich wie in Counter-Strike einen Wettstreit zwischen zwei Teams vorsehen. Ein Beispiel dafür ist der wohl sehr bekannte Spielmodus „Capture the Flag“, bei dem die Teams versuchen, die Flagge des jeweils anderen Teams in die eigene Basis zu überführen, ohne die eigene Flagge zu verlieren. Ein weiterer Modus, involviert das einnehmen von Basen, wobei das Team gewinnt, welches als erstes alle Basen einnehmen konnte. Des weiteren gibt es anders als bei Counter-Strike mehrere Soldaten-Klassen wie z.B. Grenadier, Scharfschütze, Sanitäter, Techniker und Spion, aus denen die Spieler wählen müssen. So ergibt sich eine interessante Aufgabenteilung innerhalb der Teams. All dies sind Mods, die man ohne es vorher zu wissen kaum von einem eigens entwickelten Spielen unterscheiden kann. Obwohl diese Mods fast alle Inhalte ändern, zeigen sie jedoch lange nicht alle Möglichkeiten der Modifikation auf. Hierfür lohnt es sich, einige unbekanntere Mods zu betrachten, die weit ausgefallenere Änderungen aufweisen. Eine kleine Auswahl solcher Mods wird im folgenden Abschnitt vorgestellt. 2.3.2 Half-Life Das Spiel Half-Life ist eines der Spiele mit den meisten Mods überhaupt. Es bat zu der Zeit seiner Veröffentlichung bereits eine sehr gute Unterstützung für die Erstellung von Mods. Welche Möglichkeiten HalfLife hierzu bietet, wird in einem späteren Kapitel noch im Detail besprochen. Diese Tatsache führte dazu, dass bereits früh Mods für dieses Spiel verfügbar waren. Viele der zahlreichen Half-Life Mods sind lediglich Partial Conversions des Hauptspiels, die sich auf die Änderung ganz bestimmter Inhalte beschränken. Oft sind diese Änderungen sehr ausgefallen und zeigen so eindrucksvoll, was im Bereich Modding alles möglich ist. Anhand der folgenden Beispiele wird dies verdeutlicht. Die Mod „Snow War Half-Life“ ändert das Spiel dahingehend, dass anstatt Abbildung 2: Spielcover sich mit Schusswaffen zu bekriegen, eine Half-Life Schneeballschlacht veranstaltet wird. Die geworfenen Schneebälle müssen zuvor auf einer Schnee-bedeckten Oberfläche aufgenommen werden. Dies zeigt, wie einfach ein unterhaltsames Spielprinzip durch wenige Änderungen realisiert werden kann. Wie man im Screenshot links sehen kann, sind ebenfalls die Models geändert. Beispielsweise kann man das Spiel in Gestalt eines Weihnachtsmann oder Schneemannes bestreiten. Abbildung 3: Screenshot - Eine Mod, die mehr in die Richtung Rollenspiele Snow War abzielt, ist „Wizard Wars Half-Life“. In dieser Mod werden Zaubersprüche und ähnliches als Waffen eingesetzt. Die eigenen Maps bestehen aus mittelalterlicher Architektur und die Models sind Zauberer. Im Bild links kann man ein Burg-Level sehen, in welchem das Spiel stattfindet. Die Hände, die hier einen Totenschädel schweben lassen, sind technisch gesehen nicht Teil des Models sondern gehören zusammen mit dem Schädel zur Waffen-Geometrie. Dem so genannten Abbildung 4: Screenshot Wizard Wars „Head Up Display“ kurz „HUD“, welches Daten des Spielers anzeigt wurde hier ebenfalls ein neues Design verpasst. Ein Beispiel für einen einfallsreichen Spielmodus ist die Mod „Science and Industry Half-Life“, in der man versucht, Wissenschaftler in die eigene Forschungseinrichtung zu entführen, wo diese für das eigene Team nach besseren Waffen forschen. Wer mehr Wissenschaftler in seiner Gewalt hat, besitzt dadurch einen Vorteil durch bessere Ausrüstung. Im Screenshot links sieht man, wie der Transport der entführten Wissenschaftler in die eigene Basis realisiert wurde. Da viele Inhalte wie Models und Texturen Abbildung 5: Screenshot - aus Half-Life unverändert übernommen wurden, spricht man auch hier Science & Industry lediglich von einer Partial Conversion. Im folgenden abschließenden 6 Beispiel ist dies anders und es wurde fast alles geändert. „Worms Half-Life“ ist eine Mod, welche das Spieldesign von dem bekannten Spiel „Worms“ ab geschaut hat. Wie man auf dem Screenshot sehen kann, wurde hier außer dem zugrunde liegenden Genre nichts sichtbares übernommen. Die Models sind Würmer, welche sich dem Vorbild entsprechend mit Waffen wie Dynamit bekriegen. Es gibt eigene Maps mit eigenen Texturen und auch das Head Up Display wurde angepasst. Abbildung 6: Screenshot Worms Half-Life 2.3.3 Half-Life 2: Garry's Mod Wie sein Vorgänger ist auch Half-Life 2 ein Spiel mit weitreichenden Modifikationsmöglichkeiten. Das Ausmaß dieser Möglichkeiten zeigt sich eindrucksvoll in einer Mod namens „Garry's Mod“. Diese Mod verwandelt das Hauptspiel in einen so genannten Sandbox-Editor für das Spiel selbst. Ein Sandbox-Editor ist ein Editor, der die Spiel-Engine benutzt, um geänderte Spielinhalte nach dem WYSIWYG Prinzip genau wie im Spiel selbst darzustellen. In Garry's Mod können Inhalte wie bewegliche Objekte, Fahr- und Flugzeuge gebaut werden. Außerdem kann die Physik beeinflusst werden und es gibt sogar die Möglichkeit, Models via Ragdoll-Physik zu bearbeiten. Mit diesen Möglichkeiten können bereits erstaunlich viele Dinge realisiert werden. Besonders populär sind hierbei möglichst ausgefallene Kettenreaktionsmaschinen, welche dann auf Abbildung 7: Screenshot - Garry's Mod Video-Plattformen wie http://www.youtube.com/ online gestellt werden. Wer hier nach den Schlüsselwörtern „Garry's Mod“ oder „gmod“ sucht, wird hunderte Videos von solchen Aufbauten finden, in denen zum Beispiel riesige Dominosteine in einer Map aufgestellt werden durch die eine lange Kettenreaktion realisiert wird. Des weiteren können aber auch noch steuerbare Vehikel erstellt werden. So werden oft aus fertigen Gegenständen des Spiels wie Container und Reifen unter Verwendung von Physik-Tools ausgefallene Fahr- oder Flugzeuge gebaut. Die Physik-Engine in Half-Life 2 ist sehr mächtig wodurch auch Dinge wie Katapulte relativ einfach realisiert werden können. 3 Editing Im Gegensatz zu den großen 3D-Modellierungsprogrammen wie Maya oder 3D-Studio MAX beschränken sich die bei Spielen mitgelieferten Programme auf die Erstellung von Inhalten für nur dieses spezielle Spiel. Daraus folgt, dass beim Erstellen von Inhalten bestimmte Eigenschaften der Spiel-Engine und der genutzten Grafikhardware berücksichtigt werden müssen, um die Inhalte überhaupt in das Spiel einbinden zu können. So darf z.B. eine maximale Anzahl von Lichtquellen oder Polygonen nicht überschritten werden oder Texturen müssen Quadrate mit einer Zweierpotenz als Seitenlänge sein. Diese Restriktionen können je nach Spiel-Engine und Ziel-Hardware variieren und es ist oft nicht der Fall, dass Verstöße gegen diese Regeln von den Editoren abgefangen werden. Man merkt so oft erst beim Test im Spiel, ob ein Inhalt lauffähig ist. Des weiteren müssen erstellte Inhalte oft in spezielle Formate überführt werden, die meist auf Effizienz im Spiel optimiert sind. Ein Beispiel dafür sind die „bsp“-Dateien, die z.B. In Half-Life zum Einsatz kommen. Sie enthalten eine Map in Form eines BSP-Baumes (Binary Space Partition), im den Zugriff auf die Geometrie während des Spiels zu beschleunigen. Da der Baum in der Datei abgelegt wird, kann er vorher aufwendig optimiert werden, was durch spezielle Map-Compiler 7 realisiert wird. So kann es z.B. auch passieren, dass die eigene Map zu komplex ausgefallen ist und der Kompiliervorgang mehrere Stunden in Anspruch nimmt. Dies ist dann meist auch ein Indiz dafür, dass die Map im Spiel später nicht effizient laufen wird oder dass sie Fehler enthält. Mehr dazu gibt es im Kapitel über Editoren. Zunächst werden aber typische Inhalte von heutigen Spielen vorgestellt und anschließend ihre Strukturierung innerhalb der Spielarchitektur erläutert. 3.1 Inhalte Die in heutigen Spielen vorkommenden Inhalte lassen sich in einigen wenigen Kategorien zusammenfassen. Obwohl diese in verschiedensten proprietären Dateiformaten abgelegt sein können, unterscheiden sie sich jedoch oft nur geringfügig von einander. Dies kann durch einige Fakten der heutigen Spiele-Entwicklung begründet werden. Zum einen werden heute wenige SpielEngines für sehr viele Spiele wiederverwendet. Zum anderen legt die Tatsache, dass mit den meisten Spielen die reale Welt nachgeahmt werden soll, eine ähnliche Strukturierung der Spielinhalte nahe. Außerdem gibt auch die aktuelle Grafikhardware bereits einige Standards vor, die ein Spiel heute benutzen muss. Im folgenden werden sowohl die Arten der Inhalte als auch deren Strukturierung in modernen Spielen erläutert. 3.1.1 Arten von Spielinhalten Wie bereits erwähnt, lassen sich die wichtigsten Spielinhalte heutiger Spiele in wenigen Kategorien zusammenfassen: Maps enthalten die mit reichlich Zusatzinformationen ausgestattete Geometrie der Spielwelt. Sie beinhalten sowohl statische als auch dynamische Elemente der Welt. Der statische Anteil wird oft fest als BSP-Baum gespeichert, was einen sehr Effizienten Zugriff auf die Welt-Geometrie während des Spiels erlaubt. Dadurch können z.B. Dinge wie die Kollision von Objekten mit der WeltGeometrie sehr effizient berechnet werden. Die Speicherung der Maps als PSB-Baum erlaubt auch eine aufwendige Vorberechnung eines möglichst optimalen Baumes. Hierfür werden spezielle MapCompiler verwendet, auf die im Kapitel über Editoren noch beispielhaft eingegangen wird. Maps enthalten neben der Geometrie der Spielwelt auch eine Menge Zusatzinformationen, die sowohl Teile der Spiellogik als auch Funktionen der Grafik- und Physikengines steuern können. Beispiele hierfür sind Startpositionen für Spieler, Trigger-Mechanismen und Skripts. Models sind Geometriedaten von Charakteren im Spiel, sowohl die der Spieler als auch die von Gegnern und anderen CPU-gesteuerten Akteuren im Spiel. Neben der Geometrie enthalten ModelDateien meist auch die zugehörigen Texturen und ein Skelett-System inklusive Animationen für verschiedene Verhaltens- und Bewegungsarten der Figur. Diese werden heute bereits oft mit Hilfe von Motion-Capturing Verfahren erstellt. Texturen sind zweidimensionale Bilder, die auf die dreidimensionale Geometrie projiziert werden, um Details hinzuzufügen und einen realistischeren Eindruck zu erwecken. In modernen Spielen werden sie jedoch nicht nur für diesen Zweck benutzt. Sie werden z.B. auch benutzt, um NormalMaps, Displacement-Maps, Shadow-Maps und vieles mehr zu speichern, welche alle einen spezielle Rolle in der Erzeugung möglichst realistischer Bilder spielen. Die in Spielen zu sehenden Menüs zur Auswahl von Spielmodi und zur Konfiguration des Spiels sind letztendlich nur Grafiken, die von einer grafischen Oberfläche in das Spiel geladen werden. Somit können diese meist leicht durch modifizierte Versionen ersetzt werden. In normalen Applikationen wird dies auch als „skinning“ bezeichnet. Ähnlich verhält es sich mit Head Up Displays, welche im Grunde durch die selbe Technik realisiert werden. Je nach Spiel kann das Spielverhalten mehr oder weniger weitreichend alleine durch das Ändern von Parametern in Konfigurationsdateien modifiziert werden. Eine bekannte Dateiendung hierbei ist „ini“. Dinge die hier geändert werden können sind zum Beispiel Tastenbelegungen, die Geschwindigkeit von Fahrzeugen, Schussfrequenzen von Waffen und vieles mehr. 8 3.1.2 Strukturierung von Spielinhalten Ähnlich wie die Kategorien von Spielinhalten, ist auch die Strukturierung der Inhalte in den meisten Spielen annähernd die selbe. Die Inhalte werden hierarchisch in Verzeichnissen organisiert, wobei das Wurzelverzeichnis den Namen der Mod besitzt. So kommt es, dass die Inhalte des HauptHauptspiels technisch gesehen nichts anderes als eine Mod spiel sind. Man kann diese also als „Standard-Mod“ des Spiels bezeichnen, deren Wurzelverzeichnis oft den Namen des Hauptspiels oder des Herstellers besitzt. Diese InhaltsVerzeichnisbäume werden oft noch in ContainerDateiformaten gespeichert, die, wie z.B. pk3-Dateien der Quake 3-Engine dem ZIP-Format ähneln. Diese Container bringen einige Vorteile bei der Installation und der Speicherung des Spiels auf der Festplatte. So läuft die Kopie Mod hunderter kleiner Dateien z.B. Deutlich langsamer ab als die Kopie einer einzelnen Datei gleicher Größe und die zusätzliche Komprimierung spart Speicherplatz sowohl auf dem Abbildung 8: Verzeichnisbaum vom Distributionsmedium als auch auf der Festplatte. Soll die Spielinhalten Engine des Spiels eine andere als die Standard Mod laden, so muss diese entweder über die Kommandozeile als Parameter übergeben oder durch ein Auswahlmenü des Hauptspiels aktiviert werden. Will man also eigene Inhalte anstatt der Originalinhalte einstellen, muss man diese lediglich in der gleichen Verzeichnisstruktur unter einem Wurzelverzeichnis mit dem Namen der eigenen Mod ablegen. Das Mod-Auswahlmenü des Spiels wird dieses dann in der Regel selbst erkennen und zur Auswahl anbieten. Die Struktur und die Namen der Unterverzeichnisse müssen exakt die selbe Struktur und die selben Namen wie Der Verzeichnisbaum des Standard-Mods haben, da diese in der Regel fest in der Engine kodiert sind. Dateien in den Ordnern, wie zum Beispiel Map-Dateien müssen jedoch nicht unbedingt gleich benannt werden oder in der selben Anzahl auftreten, da diese von der Engine dynamisch abgefragt und im Spiel zur Auswahl angeboten werden. Zumindest ist dies im Mehrspieler-Bereich oft so. Will man eine Einzelspieler-Mod realisieren, gibt es je nach Spiel und Genre unterschiedliche Konventionen, um zum Beispiel die Map für das erste Level festzulegen. In manchen Genres wie zum Beispiel bei Rollenspielen kommt es auch vor, dass es keine Einteilung in Maps gibt, da es im Spiel nur eine einzige große Spielwelt gibt, die auf eine andere Weise realisiert ist. Um das Modding an einem geeigneten Spiel auszuprobieren sind einfache Änderungen an den Inhalten des Hauptspiels am besten geeignet. Als erstes muss man das „Mods“-Verzeichnis identifizieren. Anschließend kopiert man das Standard-Mod Verzeichnis unter einem anderen Namen, z.B. „MyMod“ in das selbe Verzeichnis, in der Abbildung links grün Abbildung 9: Verzeichnisbaum - Partial dargestellt. In Spielen, die Conversion ein Auswahlmenü für Mods im Spiel anbieten, wird dieses jetzt in der Regel bereits angezeigt. Aktiviert man es, wird allerdings nur die Standard- Abbildung 10: Verzeichnisbaum - Total Mod geladen, da die Inhalte ja noch die selben sind. Um dies Conversion 9 zu ändern, sucht man sich jetzt z.B. eine Map-Datei (in der Abbildung hell-grün dargestellt) und lädt sie in den passenden Editor, welcher dem Spiel im günstigsten Fall beiliegt. Die Möglichkeiten von Änderungen hängen jetzt nur noch davon ab, wie gut man die Bedienung des Editors bereits erlernt hat. Für die Spiele mit guter Unterstützung für Modding existieren im Internet oft zahlreiche Tutorials für die Bedienung der mitgelieferten Editoren. Eine einfache Änderung wie das Wechseln einer Wandtextur oder das Einfügen eines zusätzlichen einfachen Objekts lässt sich jedoch oft auch ohne vorige Einarbeitung realisieren und anschließend im Spiel begutachten. So kann man nun immer mehr Inhalte ändern, neue Inhalte hinzufügen und andere löschen bis nichts von Originalinhalt mehr übrig ist, wie in der Abbildung rechts dargestellt. Das ist dann, zumindest auf die Inhalte bezogen, eine Total Conversion. 3.2 Editoren Im folgenden Abschnitt werden anhand einiger Beispiele mehrere typische Werkzeuge für das Modding in Spielen bzw. Online-Welten vorgestellt. 3.2.1 Half-Life: Worldcraft / Hammer Half-Life und auch sein Nachfolger Half-Life 2 sind Spiele mit einer hervorragender Unterstützung für Modding. Deshalb werden die vom Hersteller veröffentlichten Editoren und Programme für die Erstellung von Inhalten für diese Spiele hier als Beispiel vorgestellt. Eines der wichtigsten Tools für das Modding in Half-Life 2 ist der Leveleditor Hammer, der zu Half-Life 1 Zeiten noch unter dem Namen Worldcraft bekannt war. Dieser richtet sich wie die meisten proprietären Editoren der Spieleentwickler mit seiner Funktionalität nach den Möglichkeiten der Spiel-Engine. So weisen z.B. Texturen meist die Größe 512x512 auf. Außerdem müssen fertige Maps in das BSP-Format konvertiert werden. Ist diese Konvertierung erfolgreich abgeschlossen, sollte man eine lauffähige Map für Half-Life im BSP-Format vorliegen haben. Die genannten Programme müssen im Editor ähnlich wie Compiler einer Programmierumgebung eingebunden werden. Anschließend müssen noch die benutzten Texturen eingebunden werden. Diese waren in Worldcraft gesammelt in Form einiger weniger WAD-Dateien abgelegt wie z.B. Die Half-Life.wad Datei, die sich im Hauptverzeichnis des Spiels befand. Im Hammer Editor jedoch, werden Texturen als spezielle Materialien behandelt und getrennt gespeichert. Sind diese Einstellungen getätigt, kann man damit beginnen, seine eigenen Maps zu erstellen. Dafür gibt es in Hammer zwei grundlegende Elemente: Brush-Entities und Point-Entities. Brush-Entities können sowohl Grundprimitive wie Quader und Zylinder als auch komplexere Objekte oder Trigger und Effekte sein. Point-Entities existieren nur in einem Punkt im Raum und unterteilen sich in die drei folgenden Unterkategorien: • Logic Entities: Unsichtbare Entities, die Aspekte des Spiels wie z.B. die künstliche Intelligenz beeinflussen. • Prob Entities: Nicht lebende Objekte, die Models für ihre Erscheinung verwenden können und diesen ein bestimmtes Verhalten, z.B. das eines Vehikels zuweisen. • NPC Entities: NPC steht für Non Player Character. NPC Entities repräsentieren Computer gesteuerte Charaktere wie z.B. Gegner und besitzen eine vordefinierte künstliche Intelligenz. Will man eine funktionstüchtige Map erstellen, sollte man wissen, wie Größenangaben in Half-Life interpretiert werden. Die Größe von Objekten wird in so genannten „World Units“ gemessen. So ist eine normale Wand z.B. 128 World Units hoch und eine Spielfigur 72 World Units. Also müssen Türen, durch die man aufrecht gehen können soll auch mindestens 72 World Units groß sein. Bei den 128x128 Pixel großen Texturen aus Half-Life 1 entsprach ein Pixel in der Textur einer World Unit. Im Hammer Editor sind es durch die größeren Texturen 4 Pixel pro World Unit. Mit diesen grundlegenden Informationen zu Map-Editing in Half-Life sollten bereits gute Resultate erzielbar sein. Wer mehr über den Hammer Editor lernen möchte, kann sich im Valve Developer 10 Center die offizielle Dokumentation so wie eine Dokumentation zu Level Design anschauen. [6], [7], [8], [9] 3.2.2 Modding in Second Life Als Beispiel für Modding in einer Online-Welt sollen die Möglichkeiten hierzu in Second Life erläutert werden. Da in Online-Welten nur eine Welt für alle Beteiligten existiert, die konsistent auf zentralen Servern gehalten wird, unterscheidet sich Modding in einigen Aspekten von dem, was bisher erläutert wurde. So ist Modding in Online-Welten mehr als ein Leistungsmerkmal des Programms zu sehen, welches von jedem Nutzer in Anspruch genommen werden können soll. Die Editoren sind größtenteils in die Engine der Online-Welt integriert und werden so zu einem Teil des Online-Lebens. Außerdem sind die möglichen Änderungen an der Welt an sich auf kleine Bereiche pro Nutzer beschränkt, um die Welt im Großen und Ganzen in einem vernünftigen Zustand zu halten. Ein Beispiel für das integrierte Editieren von Inhalten sind die Editoren, die den Nutzern zur Verfügung stehen, um den eigenen Avatar zu modifizieren. Hier können z.B. die Form, Abbildung 11: Screenshot - Second Life die Haut, die Haare (siehe Abbildung links), die Augen und die Editor Kleidung des Avatars bearbeitet werden, was ein integraler Bestandteil des Konzepts der Online-Welt ist, da es eine fast uneingeschränkt individuelle Repräsentation der Nutzer in der Welt ermöglicht. Eine weitere Möglichkeit, die Welt zu ändern, sind selbst erstellte Objekte. Auf der Website von Second Life finden sich Videos, die eindrucksvoll demonstrieren, wie sehr komplexe Objekte in sehr wenig Zeit gebaut werden können. In einem Video im Showcase der Seite war z.B. zu sehen, wie eine in wenigen Minuten eine detaillierte Gitarre erstellt wurde. Die Tatsache, dass hergestellte Objekte in der Online-Welt verkauft werden können, eröffnet sogar die Möglichkeit, mit dieser Art von Modding Geld zu verdienen. Zu guter Letzt gibt es in Second Life die Möglichkeit, ein Stück Land zu erwerben, auf dem man dann ein Haus bauen kann. Durch kooperatives Bauen können hier auch mehrere Nutzer an einem großen Objekt zusammenarbeiten. Das Stück Land kann interessanterweise auch eine Insel im Meer sein. In diesem Fall kann man entweder aus einigen vorgefertigten Landschaften wählen, oder aber seine eigene Geometrie in Form eines so genannten „Terrain File“ einschicken. Die Landschaft in Second Life ist durch ein Gitter von Höhenwerten realisiert. Durch diese feste Topologie lassen sich Landschaften in einem Bild mit mehreren Kanälen speichern, wobei jedes Pixel Informationen für einen Knotenpunkt im Gitter enthält. Die insgesamt 13 Kanäle enthalten alle Informationen, die für die Engine wichtig sind. Abbildung 12: Screenshot - Second Life Insel Ein paar der Kanäle sind im folgenden aufgelistet: • 1: Height (Höhe der Landschaft in diesem Gitterpunkt) • 3: Water Height (Wasserspiegel in diesem Gitterpunkt) • 5: For Sale (Das Land ist zu verkaufen) • 7: Public Edit Land (Das Land darf von jedem verändert werden) • 9: Flying Allowed (Das Land darf überflogen werden) Wie man sehen kann, wird hier mit einem sehr einfachen Prinzip eine umfangreiche Änderung der 11 Welt ermöglicht. [12] 4 Scripting Im Gegensatz zu kompilierten Sprachen, werden Scripts zur Laufzeit interpretiert. Diese werden manchmal aus Effizienzgründen vorher in einen Bytecode kompiliert, welcher dann anstelle des Script-Codes von einer Virtual Machine innerhalb des WirtProgramms interpretiert wird. Scripts sind also plattformunabhängig und können ohne eine Änderung am WirtProgramm geändert werden. Diese Eigenschaft machen sich Spiele heute zunutze, um möglichst viele Aspekte des Spiels ohne eine Neu-Kompilierung der Spiel-Engine realisieren zu können. Diese Aspekte umfassen z.B. Teile der Spiellogik, der KI und der Physik. Außerdem können Aufgaben wie Menüführung, Inventar-Verwaltung, Ereignisbehandlung und -auslösung und vieles mehr in Form von Scripts implementiert werden. Dies erleichtert auch die Kollaboration in großen Entwickler-Teams, wie sie heute bei kommerziellen Spiel- Abbildung 13: Kompilierte Sprachen und Projekten üblich sind, da z.B. Designer bei ihrer Arbeit nicht Skriptsprachen im Vergleich mit dem in der Regel in C++ geschriebenen Sourcecode der Spiel-Engine in Berührung kommen. Da der Sourcecode kommerzieller Spiel-Engines nur in den seltensten Fällen und auch dann oft erst nach einigen Jahren offen gelegt wird, ermöglichen Scripts auch Mod-Entwicklern eine Vielzahl von Änderungen, die sonst nur durch Modifikationen des selben möglich wären. [10] 4.1 Beispiele für Skriptsprachen 4.1.1 QuakeC Quake war eines der ersten Spiele mit der Unterstützung für Scripting. Die zugehörige Skriptsprache QuakeC wird durch den Compiler „qcc“ in einen Bytecode vorkompiliert, der dann von einem Bytecode-Interpreter im Spiel verarbeitet wird. Die Syntax ist der kompilierten Sprache C nachempfunden wodurch sich auch die Analogie zum C-Compiler „gcc“ erklärt. Die Möglichkeiten der Sprache waren damals noch sehr begrenzt. So konnten z.B. keine Typ- oder Variablendefinitionen vorgenommen werden und „entity“ war der einzige Referenz-Typ (Entities sind Objekt im Spiel). Außerdem wurden alle Strings in einem einzelnen String-Buffer gespeichert, was z.B. Funktionen, die mit zwei String-Argumenten gleichzeitig arbeiten, unmöglich macht. Des weiteren fehlen der Sprache jegliche Ein-/Ausgabefunktionen. Trotz der oben genannten Beschränkungen war mit der Sprache bereits einiges möglich. So konnte das Verhalten von Waffen, Aspekte der Spiellogik, die Spielphysik und Teile der künstlichen Intelligenz beeinflusst werden. Außerdem konnten Ereignisse im Spiel ausgelöst werden. [11] 4.1.2 Python Ein Beispiel für eine bekanntere Skriptsprache ist Python. Sie ist sehr weit verbreitet, was unter anderem an ihrer leichten Erlernbarkeit liegt. Sie bietet des weiteren auch die Möglichkeit der Erweiterung mit C-Bibliotheken, was auch die Einbindung hocheffizienter Algorithmen ermöglicht. Die Popularität dieser Sprache erkennt man am besten an den Anwendungen, welche sie benutzen. Dies sind, nur um einige unter vielen zu nennen, die 3D-Editoren Blender und Maya, das Bildbearbeitungsprogramm GIMP sowie das bekannte Spiel Battlefield 2. 12 4.1.3 Python in Blender Der 3D-Editor Blender hat einen eingebauten Python-Interpreter und kann somit durch Scripts gesteuert Abbildung 14: Die Symbolleiste des File Windows von Blender werden. Um ein Python-Script in Blender zu laden, kann man im Text-Window über das File-Menü eine Script-Datei öffnen. Die Symbol-Leiste des Text-Windows ist links abgebildet, über das Auswahlmenü rechts können verschiedene geladene Scripts selektiert werden. Das Script wird durch Betätigen der Tastenkombination ALT-P ausgeführt. Da Scripts in Blender immer Zugriff auf alle globalen Objekte und Funktionen des Editors haben, können so z.B. Animationen erstellt, Verformungen ausgeführt und spezielle Objekte erzeugt werden. Wie man im Screenshot recht sieht, können Scripts die grafische Oberfläche von Blender nutzen, um z.B. Parameter einzulesen. Mit dem Script in der Abbildung kann ein gefülltes Polygon mit variabler Abbildung 15: Beispiel für ein Skript, Anzahl von Kanten erstellt werden, wobei alle Eckpunkte auf dass die Blender Oberfläche benutzt dem Kreis mit dem eingestellten Radius liegen. In der Abbildung links ist ein Beispiel-Script zu sehen, welches ein in Blender geladenes Objekt namens „Plane“ um 0.5 Einheiten auf der X-Achse # python example - move a plane: verschiebt und es um 0.2 Einheiten um die Z-Achse rotiert. Als erstes wird Blender mit dem import Befehl import Blender eingebunden. Blender kann nun als statisches Objekt verwendet werden. Ein Objekt in Blender ist ein Datensatz mit Positions- und Größenangaben eines object = Blender.Object.Get("Plane") bestimmten 3D-Objekts. Will man nun ein vorhandenes Objekt bestimmten Namens object.LocX += 0.5 modifizieren, kann man dies mit dem Befehl object.RotZ += 0.2 Blender.Object.Get(„<Name>“) tun, der eine Referenz auf das Objekt zurück gibt. Mit dieser Referenz kann Blender.Redraw() man nun alle Felder des Object-Datensatzes # python example - change focal length: ändern. Im Beispiel werden die Felder LocX (XKoordinate) und RotZ (Rotation um die Z- import Blender Achse) geändert. Anschließend wird die Oberfläche von Blender mit dem Redraw-Befehl camera = Blender.Camera.Get("Camera") neu gezeichnet, um die Änderungen sichtbar zu machen. Im nächsten Beispiel, das rechts camera.Lens = cam.Lens * 2.0 abgebildet ist, wird die Brennweite einer Kamera namens „Camera“ auf ähnliche Weise Blender.Redraw() verändert. Der einzige Unterschied hierbei ist, dass das Feld „Lens“ für die Brennweite nicht Teil des Object-Datensatzes ist, sonder zum CameraDatensatz gehört. Deshalb wird anstatt dem Befehl Blender.Object.Get(„<Name>“), der Befehl Blender.Camera.Get(„<Name>“) verwendet, welcher eine Referenz auf den Camera-Datensatz zurück gibt. Diese kann nun wie im obigen Beispiel modifiziert werden. Anschließend wird auch hier die Oberfläche neu gezeichnet. Diese Unterscheidung zwischen Objects, Cameras und noch einigen weiteren Objekten ist wichtig für das Verständnis des internen Objekt-Modells von Blender. Man muss dieses von einem echten objektorientierten Modell unterscheiden, da Camera nicht von Object ableitet, sondern stattdessen mit einem Object-Datensatz verknüpft ist, welcher z.B. auch mit anderen 3D-Objekten geteilt werden kann. Andererseits kann eine Camera auch mehrere Objects haben, welche im Editor als Duplikate der Camera in Erscheinung treten. 13 // LSL Beispiel: default { state_entry() { llSay(0, "Hello, Avatar!"); } } 4.1.4 Scripting in Second Life: Linden Scripting Language Auch in Second Life gibt es die Möglichkeit, Scripts einzusetzen. Hier geschieht dies mit der so genannten Linden Scripting Language, einer Skriptsprache, die eigens für Second Life entwickelt wurde. Sie basiert auf Zuständen und Ereignissen. So können mehrere Zustände deklariert werden, welche Handler-Funktionen für alle möglichen Ereignisse in der Welt enthalten. Innerhalb dieser Handler-Funktionen kann sowohl die gewünschte Funktionalität implementiert, als auch in einen anderen Zustand gewechselt werden. Beim Eintritt in einen Zustand wird die „state_entry“-Funktion aufgerufen und der Standard-Zustand trägt bezeichnender Weise den Namen „default“. In der Abbildung links ist ein einfaches „Hello World“-Script dargestellt. Dieses Script kann z.B. an ein Objekt im Spiel gebunden sein, welches dann in diesem Fall bei seiner Erzeugung den Satz „Hello, Avatar!“ von sich gibt. Mit der Linden Scripting Language können sogar sehr fortgeschrittene Dinge wie PhysikSimulationen implementiert werden. Außerdem gibt es die Möglichkeit, ein Partikelsystem zu erzeugen und default { touch_event() { zu steuern. Dies geschieht mit der llParticleSystemllParticleSystem( [ Funktion wie im Beispiel rechts dargestellt. Diese Funktion erhält ihre Parameter in einer Liste, welche PSYS_PART_FLAGS, // = Paare von Parameter-Name und Parameter-Wert PSYS_PART_EMISSIVE_MASK, enthält. Diese Übergabesemantik wird im Beispiel PSYS_SRC_PATTERN, // = durch die „=“-Zeichen in den Kommentaren PSYS_SRC_PATTERN_EXPLODE, verdeutlicht. Im Gegensatz zum letzten Beispiel wird PSYS_PART_START_COLOR, // = hier nicht die <1,0,0> „state_entry“-Fun ] ); ktion sondern die } „touch_event“} Funktion implementiert. Das Partikelsystem wird also bei einer Berührung mit dem Objekt ausgelöst. Will man das Partikelsystem ändern oder Abbildung 16: Screenshot - Second Life Partikelsystem in Aktion ganz abschalten, muss man die selbe Funktion mit einer entsprechend geänderten beziehungsweise leeren Liste „[]“ aufrufen. Das Resultat dieses Scripts kann im Screenshot links begutachtet werden. Das schwebende Objekt wurde gerade von einem Avatar berührt. [12], [13], [14] 4.2 Programmierung von 3D-Objekten Der folgende Abschnitt behandelt die Programmierung von 3D-Objekten, wie sie vor allem beim Modding von Spielen benötigt wird. Es wird hierbei nicht auf eine bestimmte Programmier- oder Skriptsprache eingegangen, sondern stattdessen die grundlegenden Konzepte der Programmierung in 3D-Umgebungen vermittelt. 4.2.1 Programmierung in 3D-Umgebungen Bei der Programmierung in 3D-Umgebungen wie Spielen kommen ganz bestimmte Aufgaben auf einen zu, die im Folgenden erläutert werden. Als einfachstes Beispiel können Objekte natürlich ihre Position ändern. Man kann sie beliebig oft erzeugen, platzieren, verschieben, orientieren und wieder 14 löschen. Des weiteren kann man sie animieren und mit der Spiellogik verknüpfen. Wie oben im Beispiel zur Linden Scripting Language gesehen, können Effekte wie Partikelsysteme erzeugt und gesteuert werden. Dann gibt es die Möglichkeit, physikalische Abläufe wie Fahrphysik oder Kollisionserkennung zu programmieren. Bezogen auf die Spiellogik müssen z.B. Inventare verwaltet und Ereignisse behandelt oder ausgelöst werden. Dies sind nur einige Beispiele für die vielfältigen Möglichkeiten, die einem bei der Programmierung in 3D-Umgebungen zur Verfügung stehen. 4.2.2 Spezielle 3D-Objekte Die Programmierung von 3D-Objekten, vor allem im Bereich Modding in Spielen, erfordert die Kenntnis einiger spezieller Objekte, welche in Spielen Verwendung finden. Diese werden im folgenden erläutert. Kameras sind ein wichtiger Bestandteil eines jeden Spiels. Obwohl man sie nicht sieht, sind sie doch immer vorhanden. Das man sie nicht sieht, liegt darin, dass man als Spieler selbst so zu sagen in der Kamera ist und durch sie in die Spielwelt hinaus schaut. Kameras projizieren die dreidimensionale Welt auf eine zweidimensionale Bildebene, um die Darstellung auf zweidimensionalen Medien wie Monitoren zu ermöglichen. In Spielen sind oft mehr Kameras vorhanden als man denkt. Ein gutes Beispiel hierfür sind Rennspiele, bei denen man zwischen verschiedenen Perspektiven umschalten kann. Hier ist für jede Abbildung 17: Kamera Perspektive eine Kamera vorhanden, die an das Auto gebunden sind und sich so mit dem Auto bewegen. Schaltet man also in eine andere Perspektive, macht das Spiel nichts anderes als auf eine andere Kamera zu schalten. Mit Kameras kann man aber noch mehr machen als nur verschiedene Sichten des Spielers in die Welt bereitzustellen. Ist im Auto ein Rückspiegel, so ist dieser in der Regel nur eine nach hinten gerichtete Kamera, deren Bildebene auf den Rückspiegel gelegt wird. So kann mit einer Kamera ein einfacher Spiegel realisiert werden. Moderne 3D-Spiele bieten in der Regel eine Möglichkeit, 3D-Szenen zu beleuchten. Dies geschieht durch dir Platzierung von Lichtquellen in der Szene. Diese können neben der normalen Beleuchtung auch für die Realisierung dynamischer Lichteffekte genutzt werden. Grafikkarten unterstützen in der Regel eine bestimmte Anzahl dynamischer Punktlichtquellen, an die sich ein Abbildung 18: Lichtquelle Leveldesigner oder Skript-Programmierer halten muss. Ein wichtiges und sehr mächtiges Konzept zur Auslösung von Ereignissen in Spielen sind so genannte „Trigger“. Trigger bieten Mechanismen zur Auslösung und Steuerung von Ereignissen im Spiel. Ein Trigger ist ein spezielles, meistens unsichtbares 3D-Objekt, das durch einen bestimmten Vorgang im Spiel aktiviert wird und daraufhin weitere Ereignisse auslösen Abbildung 19: Trigger kann. Ein Beispiel für einen Trigger ist eine unsichtbare Box, die bei Berührung durch die Spielfigur ein Ereignis, wie z.B. das Öffnen einer Türe, oder allgemeiner, die Aktivierung eines Scripts, auslöst. Dieses Konzept wird zum Beispiel auch von den Half-Life Editoren verwendet. Neben Lichtquelle gibt es in Spielen oft noch andere speziellere Möglichkeiten, optische Effekte zu realisieren. Ein Beispiel hierfür sind die bereits behandelten Partikelsysteme. Was wäre ein Spiel ohne Ton? Soundeffekte werden in Spielen oft an 3D-Objekte gebunden. So kann z.B. dem Boden an einer Stelle ein bestimmter Auftritts-Ton zugewiesen werden oder der Knall einer Explosion kann an einer bestimmten Stelle platziert und mit einem Wirkungsbereich versehen werden. 15 Ein weiteres wichtiges Objekt sind Pfade. Mit Pfaden lassen sich Objekte animieren. Aufzüge und Schienenbahnen sind z.B. häufig an einen Pfad gebunden, welchen sie, möglicherweise durch ein Trigger-Objekt ausgelöst, entlang fahren. Models werden in modernen Spielen mit der Hilfe von Skeletten animiert. Skelette beschreiben die Knochenstruktur des Models und somit seine Bewegungsmöglichkeiten. Sie werden heute auch oft mit der Physik-Engine verknüpft, um so genannte Ragdoll Physics zu realisieren. Hierbei werden Skelette anhand ihrer Constraints möglichst realistisch animiert. So können z.B. Die Auswirkungen eines Schusses auf ein Model an einer bestimmten Stelle Abbildung 20: Skelett simuliert werden, Ein schon etwas älteres aber immer noch verwendetes Konzept sind so genannte Sprites. Sprites sind zweidimensionale Bilder, die im dreidimensionalen Raum orientiert sind. Damit wurden in älteren Spielen teilweise ganze Bäume dargestellt. Durch die Orientierung dieser Bilder in Richtung der Kamera entstand so eine Art pseudo-3D-Effekt. In neueren Spielen werden in der Regel nur noch kleinere Objekte wie Grashalme oder Baumblätter mit Sprites dargestellt. 4.2.3 Modifizieren von 3D-Objekten 3D-Objekte können auf verschiedene Arten modifiziert werden. Als erstes kann man ihre Punkte affinen Transformationen unterziehen, also Translationen, Rotationen, Scherungen und vieles mehr. Des weiteren kann der Schnitt zweier Objekte ermittelt werden, was z.B. bei der Kollisionserkennung gebraucht wird. Anhand dieser Daten können nun boolesche Operationen ausgeführt werden, wobei z.B. nur der Teil des einen Objektes übrig bleibt, der nicht in der Schnittmenge der beiden Objekte liegt. Dies kann z.B. für die Realisierung eines Schadensmodells in einem Rennspiel verwendet werden. Schließlich kann man natürlich auch das Material eines Objekts beeinflussen, indem man das Objekt z.B. mit einer Textur und einer Normal-Map belegt. Mögliche Materialeigenschaften Abbildung 22: Abbildung 21: Affine können je nach Spiel-Engine und Hardware variieren. Das Schnitt zweier Transformationen waren die wichtigsten essentiellen Objekte Modifikationsmöglichkeiten von 3D-Objekten, mit denen bereits ein großer Teil der Funktionalität eines Spiels realisiert werden kann. 4.3 Beispiele Die folgenden Beispiele stellen jeweils lediglich eine Möglichkeit unter vielen dar, die beschriebene Funktionalität zu realisieren. Die tatsächlich verwendeten Mechanismen könne je nach Spiel sehr unterschiedlich sein. Die jeweiligen Mechanismen werden durch Bilderfolgen illustriert. Die Abfolge ist immer von links nach rechts und von oben nach unten. Die folgenden Bilder wurden selbst mit dem Programm OpenOffice Impress erstellt. 16 4.3.1 Türe Um eine sich öffnende Türe zu realisieren, können die folgenden Schritte ausgeführt werden. Als erstes wird eine Trigger-Box um die Türe platziert. Dann muss die Drehachse der Türe festgelegt werden. Berührt nun die Spielfigur die Trigger-Box, wird die „öffnen“-Animation für die Türe ausgelöst. Optional kann auch ein Script gestartet werden, das z.B. vorher überprüfen kann, ob die „öffnen“-Taste betätigt wurde oder das Inventar einen Schlüssel für die Tür enthält. 4.3.2 Portal Ein weiteres einfaches Beispiel ist die Erstellung eines Portals. Auch hier kann man eine TriggerBox, die im Portal platziert ist verwenden, um das eigentliche Ereignis des Ortwechsels der Spielfigur auszulösen. Schneidet die Geometrie der Spielfigur die Trigger-Box, so wird die Spielfigur an den festgelegten Zielort (in der Bildfolge als roten Kreis markiert) verschoben. 17 5 Quellenangaben 5.1 Bilder [Abbildung 1] http://blog.sabinechristiansen.de/wp-content/uploads/2006/11/cs.jpg [Abbildung 2] http://ec1.images-amazon.com/images/I/51SYKC2DHEL._AA280_.jpg [Abbildung 3] http://www.hlportal.de/images/images/medium/3815.jpg [Abbildung 4] http://www.hlportal.de/images/images/original/1258.jpg [Abbildung 5] http://www.hlportal.de/images/images/original/1551.jpg [Abbildung 6] http://www.hlportal.de/images/images/medium/941.jpg [Abbildung 7] Screenshot aus dem Video http://www.youtube.com/watch?v=3rkG-3man3k [Abbildung 8] Selbst in OpenOffice Impress erstellt [Abbildung 9] Selbst in OpenOffice Impress erstellt [Abbildung 10] Selbst in OpenOffice Impress erstellt [Abbildung 11] http://www.second-life.com/ [Abbildung 12] http://secondlife.com/community/land-islands.php [Abbildung 13] Selbst in OpenOffice Impress erstellt [Abbildung 14] http://www.blender.org/documentation/htmlI/PartEX/python/gfx/textButtons.pn g [Abbildung 15] http://www.blender.org/documentation/htmlI/PartEX/python/gfx/python_demo _gui.png [Abbildung 16] http://www.kan-ed.org/second-life/graphics/avatar-next-to-generator2.jpg [Abbildung 17] Selbst in OpenOffice Impress erstellt [Abbildung 18] Selbst in OpenOffice Impress erstellt [Abbildung 19] Selbst in OpenOffice Impress erstellt [Abbildung 20] Selbst in OpenOffice Impress erstellt [Abbildung 21] Selbst in OpenOffice Impress erstellt [Abbildung 22] Selbst in OpenOffice Impress erstellt 5.2 Informationen [1] Artikel „Video game companies encourage modders“ http://www.hollywoodreporter.com/hr/search/article_display.jsp?vnu_content_id=10004849 56 [2] Artikel „The Top 5 Most Moddable Games“ http://www.bit-tech.net/gaming/2007/06/12/top_5_moddable_games/1 [3] Wikipedia Artikel zu „Mod“ http://en.wikipedia.org/wiki/Mod_(computer_gaming) [4] Wikipedia Artikel zu „Team Fortress” http://de.wikipedia.org/wiki/Team_Fortress#Team_Fortress_Classic [5] Wikipedia Artikel zu „Desert Combat“ http://en.wikipedia.org/wiki/Desert_Combat [6] Tutorial zum Worldcraft Editor http://www.dhlp.de/ [7] Wikipedia Artikel zu „Hammer Editor“ http://de.wikipedia.org/wiki/Hammer_Editor [8] Valve Developer Community Wiki http://developer.valvesoftware.com/wiki/Main_Page [9] Dokumentation zu Valve's Hammer Editor http://developer.valvesoftware.com/wiki/Valve_Hammer_Editor [10] Wikipedia Artikel zu „Scripting language“ http://en.wikipedia.org/wiki/Scripting_language 18 [11] Wikipedia Artikel zu „QuakeC“ http://en.wikipedia.org/wiki/Quakec http://de.wikipedia.org/wiki/QuakeC [12] Website von Second Life http://www.secondlife.com/ [13] Wikipedia Artikel zu „Linden scripting language“ http://en.wikipedia.org/wiki/Linden_Scripting_Language [14] Tutorial „Using the Linden Script Language“ http://www.kan-ed.org/second-life/using-LSL.html 19