Inhalt:
1. Einleitung
In diesem Tutorial wird der Weg vom 3D-Modell bis hin zur Figur im Spiel am Beispiel eines 'Meatbug' beschrieben.Es wird voraussgesetzt, das man sich schon mal mit der ZENGIN Dokumentation für 3D-Modelle auseinander gesetzt hat und Grundlagen in der Bedienung von 3D Studio MAX 3.1 besitzt.
Ferner sollten Grundkenntnisse im Umgang mit der Gothic-Script Sprache vorhanden sein.
Benötigte Software:
- Gothic MOD Development Kit
- 3D Studio MAX 3.1
- ZenGin Exporter für 3D Studio MAX (zenexp.dle)
- Texteditor (empf. Ultra Edit 32)
- MAX-Dateien für Meatbug (\GOTHIC MOD Development Kit\3DS MAX STUFF\DATA\MEATBUG)
2. Figur exportieren:
Zunächst werden wir nur die nötigsten Daten für eine neue Spielfigur bereitstellen. Diese umfassen:
- das darzustellende Modell
- ein rudimentärer Satz an Animationen
- die MDS-Datei
- das D-Script für den Meatbug
- a) Als erstes starten wir 3D Studio MAX 3.1. Dort öffnen wir aus den Beispieldateien für den Meatbug die Datei MEATBUG_M04.MAX. In dieser Datei ist sowohl die Skelett-Struktur der Figur als auch das sichtbare Mesh vorhanden.
|
MEATBUG_M04.MAX nach dem Öffnen
|
- b) Dieses Modell inklusive des Skeletts exportieren wir nun mit dem Zen-Exporter. Dazu aus dem Menü Datei den Unterpunkt Export... auswählen.
ZEN-Export im Menü
| |
- c) Im anschliessenden Dialog wählen wir als Export-Format den ZEN-Exporter (Dateiendung *.asc). Als Speicherplatz für die ASC-Datei wählen wir das in der ZEN-Dokumentation angegebene Unterverzeichnis GOTHIC\_WORK\DATA\ANIMS.Hier sollte man sich einen Unterordner namens Meatbug für die Daten anlegen. Der zu exportierenden Datei geben wir den Namen Mbg_Body_M04.asc.
ZEN-Export-Dialog
| |
- d) Im folgenden Dialogfeld wählen wir über den Quickbutton Export Mesh aus.
ZEN-Export-Optionen
| |
Wir haben nun die fürs MDS erforderliche meshAndTree Datei angelegt (zur Einbindung ins MDS später mehr).
2. Exportieren der Animationen
Die Figur braucht nun ein paar Animationsdaten, damit wir sie auch direkt testen können. Für den Anfang reicht eine Animation für die Ambient-Bewegung (Ruhestellung), eine Lauf-Animation (Run) und eine Animation wie die Figur auf dem Boden landet (Fall).Diese sollte definiert werden, da beim Einsetzen der Figur im Spiel, das Model "in der Luft" erzeugt wird und dann zu Boden fällt.Fehlt diese Animation kann es zu einem Hänger kommen und die Figur ist nicht steuerbar.
- a) Wir laden in 3D Studio MAX 3.1 die Datei Mbg_Amb_M01.max. Diese Animation ist für die Ruhestellung gedacht.
Einfache Animation
| |
- b) Dann wird die Animation auch wieder über den ZEN-Exporter in das Animations-Unterverzeichnis von Gothic exportiert. Diesmal allerdings mit Hilfe des Quickbuttons Export Animation. Zur Sicherheit sollte man die Einstellungen hier auf jeden Fall mit den Vorgaben vergleichen, die in der ZENGIN Dokumentation für den Export von Animationen angegeben sind.
Animation-Export-Optionen
| |
c) Als Export-Namen wählen wir den selben Namen wie die Max-Datei, nur mit der Endung 'asc', also Mbg_Amb_M01.asc. Das erleichtert hinterher das Wiederfinden der MAX-Datei.
d) Die Schritte a) bis c) wiederholen wir nun noch mit den Dateien
Mbg_Run_M02.max -- Export --> Mbg_Run_M02.asc
Mbg_Fall_M01.max -- Export --> Mbg_Fall_M01.asc
Nun haben wir für unsere neue Figur die nötigsten Modell- und Animationsdaten zusammengestellt.
4. MDS-Datei erstellen
Jetzt wird das Model-Script erstellt, wo die Animationsdaten im ASC-Format den logischen Animatione die wir für das Spiel brauchen zugeordnet werden. Wir öffnen nun also unseren Texteditor ( am besten halt UltraEdit32).
a) Als ersten Schritt schreiben wir den Header der Datei mit den Angaben für das Model und die Mesh-Datei
Model ("Meatbug")
{
meshAndTree ("Mbg_Body_M04.asc" DONT_USE_MESH)
registerMesh ("Mbg_Body_M04.ASC")
aniEnum
{
Dies definiert dann das darzustellende Mesh im Spiel sowie die Skelett-Struktur die es besitzt (siehe dazu auch Zengin-Doku).
b) Nun werden die Animationen per 'ani'-Befehl definiert. Wir beginnen mit der Animation für die Ruhestellung. Diese heisst S_FISTRUN und wird folgendermassen angelegt:
ani ("s_FistRun" 1 "s_FistRun" 0.0 0.0 M. "Mbg_Amb_M01.asc" F 0 100)
Für eine genaue Erklärung der einzelnen Parameter siehe ZenGin-Dokumentation.
c) Jetzt kann unser Meatbug zwar rumstehen, aber das wäre langweilig. Ausserdem haben wir ja noch ein paar Animationen exportiert.Nun werden wir ihm das Laufen beibringen, indem wir die dafür erforderlichen Animationen definieren.
d) Die Lauf-Animation hat den Namen S_FISTRUNL. Um aus dem Stand ins Laufen wechseln und auch wieder stehenbleiben zu können müssen noch 2 weitere Animationen definiert werden, die Übergangsanis T_FISTRUN_2_FISTRUNL (fürs Loslaufen) und T_FISTRUNL_2_FISTRUN (fürs Anhalten). Dies geschieht durch folgende 3 Zeilen:
aniBlend ("t_FistRun_2_FistRunL" "s_FistRunL" 0.1 0.1)
ani ("s_FistRunL" 1 "s_FistRunL" 0.0 0.0 M. "Mbg_Run_M02.asc" F 0 20)
aniBlend ("t_FistRunL_2_FistRun" "s_FistRun" 0.0 0.1)
Hier sehen wir das die Übergangsanis nur reine interpolierte Animationen sind (aniBlend), also keine eigenen Animationsdaten verwendet werden. Dies kann man bei dem Meatbug gut machen. Bei anderen vor allem grösseren Figuren sollten diese Übergänge doch 'von Hand' animiert sein, das es sonst zum nicht so beliebten Schlittschuh-Effekt kommt und die Figur peinlich über den Boden gleitet. Das erste und das letzte Frame der Animation die durch S_FISTRUNL definiert ist sollte die gleiche Pose beinhalten, damit die Schleife sauber aussieht und keine hässlichen Ruckler entstehen.
e) Nun brauchen wir nur noch die nötige Fall-Animation einzubinden. Sie besteht aus 2 Teilen. Einer State-Animationen S_FALLDN, die abgespielt wird solange das Modell fällt und eine Lande-Animation T_FALLDN_2_STAND, die bei Bodenkontakt aufgerufen wird.
ani ("s_FallDn" 1 "s_FallDn" 0.1 0.1 MF "Mbg_Fall_M01.asc" F 3 3)
ani ("t_FallDn_2_Stand" 1 "" 0.1 0.0 M. "Mbg_Fall_M01.asc" R 0 3)
Bei der S_FALLDN-Animation wird das F-Flag gesetzt. Damit wird angegeben das bei dieser Ani die Höhe der Figur in den Animationsdaten nicht berücksichtigt wird, da sie durch die interne Physik gesteuert wird.
f) Jetzt setzen wir noch 2 abschliessende geschweifte Klammern unter unsere Animations-Definitionen. Fertig ist das MDS. Wir speichern es im GOTHIC\_WORK\DATA\ANIMS-Verzeichnis unter dem Namen MyMeatbug.mds.
Wir haben nun die Animationen für unser Modell definiert. Das reicht leider noch nicht ganz aus, um uns unseren kleinen Freund im Spiel zu betrachten. Dazu brauchen wir noch ein D-Script, wo unsere Figur fürs Spiel definiert wird.
5. D-Script für die Figur
Im D-Script werden die Attribute einer Spielfigur festgelegt sowie deren Aussehen (Model) und die Animationsdaten, die es benutzt (MDS). Wir wollen nun für unseren Meatbug ein Skript anlegen, auch wieder in UltraEdit32.
a) Zunächst erstellen wir eine neue Datei in Ultra-Edit mit folgendem Header.
INSTANCE MyMeatbug (C_NPC)
{
name = "Wanzi";
guild = GIL_MEATBUG;
Hier geben wir den Namen der Figur an, die am oberen Bildrand erscheint wenn wir sie im Focus haben, sowie die Gilde, zu der diese Figur gehören soll.
b) Nun übertragen wir folgende Attribute in die Datei
level = 1;
Dies ist für den Erfahrungs-Level unser Figur, die sie von Anfang an haben soll.
attribute [ATR_STRENGTH] = 1;
Dies legt den Wert für die Stärke der Figur fest, d.h. die Stärke mit der sie angreifen kann.
attribute [ATR_DEXTERITY] = 1;
Dies ist an für sich nur für Fernkampfwaffen von Bedeutung. Aber der Vollständigkeit halber packen wir es auch dabei.
attribute [ATR_HITPOINTS_MAX] = 10;
attribute [ATR_HITPOINTS] = 10;
Hier wird die Gesundheit unserer Figur festgelegt. Einmal die Anzhal der Hitpoints die die Figur maximal haben kann [ATR_HITPOINTS_MAX] und die Hitpoints die sie beim Start haben soll.
attribute [ATR_MANA_MAX] = 0;
attribute [ATR_MANA] = 0;
Dies legt analog zu den Hitpoints das Mana unserer Figur fest.
Nun folgt der Abschnitt über den Rüstungsschutz unserer Figur, unterteilt nach den einzelnen Schadenskategorien.
protection [PROT_BLUNT] = 0; // stumpfe Waffen
protection [PROT_EDGE] = 0; // Waffen mit EDGE-Schaden (Klingen)
protection [PROT_POINT] = 0; // Waffen mit POINT-Schaden (Pfeile,Bolzen)
protection [PROT_FIRE] = 100; // Feuerschaden
protection [PROT_FLY] = 0; // FLY-Schaden,d.h. wenn die Figur weggeschleudert wird
protection [PROT_MAGIC] = 0; // Magie-Schaden
damagetype = DAM_EDGE;
Hiermit legen wir den Schadenstyp fest, den unsere Figur bei einem Angriff verursacht.
Npc_SetToFistMode(self);
Über diesen Befehl wird die Figur beim Einsetzen ins Spiel direkt in den Kampfmodus gesetzt. Dies ist ein Standard bei Monstern, um Animationsdaten einzusparen.
c) Nun tragen wir noch ins Skript ein, welche Daten für das Aussehen (Visual) der Figur benutzt werden sollen. Zum einem geben wir die MDS-Datei an, die diese Figur benutzen soll, d.h. welcher Animationssatz ihr zur Verfügung steht.
Mdl_SetVisual (self, "MyMeatbug.mds");
d) Desweiteren kann man mit dem nächsten Befehl das Erscheinungsbild der Figur näher bestimmen. Dieser Befehl ist gerade bei Figuren wichtig, die mehr als ein Body-Modell haben, wie z.b. die Menschen mit ihren Rüstungen und Hautfarben. In unserem Beispiel werden die meisten Paramter auf Default-Werten gelassen (Hautfarbe, Variation, Kopfdatei usw.) Nur die Körpermesh-Datei wird angegeben.
Mdl_SetVisualBody (self, "Mbg_Body_M04", DEFAULT, DEFAULT, "", DEFAULT, DEFAULT, -1);
};
e) Abschliessend (mal wieder) eine geschweifte Klammer und ein Semikolon. Das wird schon gerne mal vergessen und dann gibts garstige Fehler beim Starten und man sucht sich nen Wolf :)
Nun haben wir eine Instanz für unsere Figur geschaffen, die wir auch mal im Spiel testen wollen. Dazu speichern wir die Datei unter dem Namen
MyMeatbug.d im Ordner GOTHIC\_WORK\DATA\SCRIPTS\CONTENT\AI\MONSTER
6. In-Game Test
Nun starten wir Gothic. Am besten einen kleinen Level wie z,b, TESTLEVEL.ZEN und wir müssen den -devmode aktiviert haben, damit wir Zugriff auf die Game-Konsole bekommen und im GothicStarter muss die Option reparse all scripts aktiv sein, damit die Datei MyMeatbug.d auch eingelesen wird. Sobald der Level geladen ist und unsere Spielfigur vor uns steht, können wir unseren neuen Freund mal bestaunen. Hierzu öffnen wir mit F2 die Game-Konsole und geben:
insert MyMeatbug
ein. Nach einer mehr oder weniger kurzen Ladezeit, wird unsere neue Figur ins Spiel gesetzt.
Mit F2 schliessen wir die Konsole wieder und drehen unsere Spielfigur so, das wir unseren kleinen Freund "Wanzi" in den Focus bekommen. Mit einem Druck auf die Taste O (wie Ork) übernehmen wir die Kontrolle über "Wanzi". Jetzt können wir mit ihm den Level erkunden.
Leider kann er noch nicht viel, nur laufen.... und irgendwo runterfallen, aber er ist ja auch noch klein. :)
WICHTIG: Beim Starten des Spiels werden die ASC-Dateien, die nur ein Zwischenformat für die Engine darstellen, kompiliert. Die kompilierten Daten befinden sich dann im GOTHIC\_WORK\DATA\ANIMS\_COMPILED-Verzeichnis. Wenn man jetzt bspw. eine Animation in MAX geändert und sie neu exportiert hat, so muss man die entsprechenden Daten im COMPILED-Ordner vorher löschen, sonst werden die ASC-Dateien nicht neu konvertiert. Es wird pro logischer Animation, die im MDS mit ani definiert wurde eine Datei angelegt. So heisst dann z.b. die s_FistRunL Animation des Meatbug als kompilierte Datei MEATBUG-S_FISTRUNL.MAN. Wenn man jetzt die ASC-Datei Mbg_Run_M02.asc neu gemacht hat, so muss man alle Animationen löschen, die aus dieser Datei kompiliert wurden - in unserem Beispiel sind das:
MEATBUG-S_FISTRUNL.MAN
MEATBUG-S_FISTJUMPB.MAN
MEATBUG-S_FISTRUNL.MAN
7. Ausbau des MDS
Unser Meatbug kann jetzt vorwärtslaufen, aber nicht rückwärts. Das kann man ändern. Dazu machen wir aber keine neue Animation sondern bedienen uns bei den vorhandenen. Wir definieren nun das Rückwärtslaufen in der Datei MyMeatbug.mds:
ani ("t_FistJumpB" 1 "s_FistRun" 0.1 0.0 M. "Mbg_Run_M02.asc" R 1 19)
Man beachte das R für das Richtungsflag der Animation, also wird hier die Run-Ani benutzt, nur wird sie rückwärts abgespielt. Jetzt kann "Wanzi" auch in den Rückwärtsgang schalten.
Sicher ist aufgefallen, das man unsere Wanze zwar auf der Stelle drehen kann, sie aber stocksteif dabei bleibt. Um da ein wenig bewegung reinzukriegen, muss man noch sogenannte Turn-Animationen definieren. Wichtig bei der Erstellung der Anis ist, das sie
1. loop-fähig sein sollten und
2. keine Drehung animiert wird, die Animation findet praktisch "auf der Stelle" statt, die Drehung wird im Spiel durch die Engine vorgenommen.
Hierzu exportieren wir in 3D Studio MAX 3.1 die Datei Mbg_Turn_M01.max als Mbg_Turn_M01.asc und tragen folgenden Zeilen in unser MDS ein.
ani ("t_FistRunTurnL" 20 "t_FistRunTurnL" 0.0 0.0 M. "Mbg_Turn_M01.asc" F 1 13)
aniAlias ("t_FistRunTurnR" 20 "t_FistRunTurnR" 0.0 0.0 M. "t_FistRunTurnL" R)
Hiermit werden Dreh-Animationen für den "FistRun" festgelegt. Wie man sieht, ist die 2te Drehani nur eine Alias-Definition der ersten und Wanzi wackelt nun beim Drehen auf der Stelle mit den Beinen.
Kommen wir nun zu einem traurigen Kapitel. Wanzi kann auch sterben, und dafür braucht er auch Animationen. Wir exportieren die beiden MAX-Files Mbg_Dead_A02.max und Mbg_Dead_M01.max. Es gibt standardmässig immer 2 Arten von Todes-Animationen. Einmal wenn der entscheidende Treffer die Figur von vorne trifft und einmal von hinten. Im MDS machen wir dann folgende Eintragungen:
ani ("t_Dead" 1 "s_Dead" 0.0 0.0 M. "Mbg_Dead_A02.asc" F 0 15)
ani ("s_Dead" 1 "s_Dead" 0.0 0.0 M. "Mbg_Dead_A02.asc" F 15 15)
ani ("t_DeadB" 1 "s_DeadB" 0.0 0.0 M. "Mbg_Dead_M01.asc" F 0 10)
ani ("s_DeadB" 1 "s_DeadB" 0.0 0.0 M. "Mbg_Dead_M01.asc" F 10 10)
Die T_DEAD-Animationen spiegeln dann den "Todeskampf" wieder, und die 1 Frame lange S_DEAD-Animation das "tot auf dem Boden liegen".
|