Umgang mit Mapobjekten

Entity misc_model mit ASE-Format und Key spawnflag 4 für die Lichtberechnung

In diesem Tutorial möchte ich dir zeigen, wie du Mapobjekte in deine Map einfügen und anpassen kannst. Ich beschränke mich hierbei auf die gängigen Formate MD3 und ASE. Bevor du aber loslegst solltest du sicherstellen, dass du World of Padman in der aktuellen Version korrekt installiert hast, den Q3Map2-Compiler mindestens in Version 2.5.16 und den GtkRadiant 1.4 oder neuer, also auch NetRadiant 1.5, für World of Padman richtig installiert und konfiguriert hast. Mit älteren Versionen könnte es bei der Anwendung dieses Tutorials zu Fehlern kommen.

Mapobjekte einfügen

Es gibt zwei verschiedene Entitys, über die du ein Mapobjekt einfügen kannst, misc_model und misc_externalmodel. Beide sind über das Kontextmenü (Rechtsklick) unter misc erreichbar und beide brauchen den korrekten Pfad zu einem Mapobjekt, das normalerweise in World of Padman im Verzeichnis /models/mapobjects zu finden ist. Der Radiant öffnet bei einen misc_model einen Dateiauswahldialog, über den du das Mapobjekt direkt auswählen kannst. Bei einem misc_externalmodel erfolgt das nicht. Daher musst du bei ausgewähltem Entity über die Taste [N] das Entities-Menüfenster aufrufen und dort model in das Key-Feld und den Pfad in das Value-Feld direkt eingeben (hier: models/mapobjects/pad_ddmix/trashcan/garbage_bag_group.md3). Bestätige die Eingabe mit der Taste [ENTER]. Bitte beachte, dass die Pfadangabe immer mit einem Schrägstrich anstelle eines Rückstrichs erfolgen muss, wie es bei Unix-Systemen üblich ist. Eine Übersicht über in World of Padman vorhandene Mapobjekte und deren Pfadangaben erhältst du im Katalog: Mapobjekte.

Entity misc_model mit Key model für die Pfadangabe

Entity misc_model mit Key model für die Pfadangabe

misc_model

Die Verwendung des Entitys misc_model bewirkt während des Kompilierens, dass das Mapobjekt als feste Komponente in deine Map mit eingerechnet wird. Das bedeutet also, dass du das Mapobjekt (MD3/ASE) eigentlich nicht mehr zusätzlich in die PK3-Datei deiner Map dazulegen musst, da es nun Bestandteil der BSP-Datei ist. Die zugehörige Textur hingegen muss Bestandteil der PK3-Datei sein. Verwendest du Mapobjekte aus WoP, sind diese bereits samt Textur und Shader in unseren PK3-Dateien enthalten und müssen nicht mehr von dir in deiner PK3-Datei mitgeliefert werden. Da die Mapobjekte insgesamt nicht viel Speicherplatz belegen, haben wir uns seit WoP 1.5 dazu entschieden, diese Dateien stets in den PK3-Dateien mitzuliefern, obwohl das bei der Methode misc_model gar nicht notwendig wäre. Sie werden daher nicht mehr als extra Download angeboten.

misc_externalmodel

Die Verwendung des Entitys misc_externalmodel bewirkt, dass während des Kompilierens das Mapobjekt nicht in die BSP-Datei eingerechnet wird, was ein Maximum an Flexibilität ermöglicht. Zum Beispiel benutzen wir diese Methode, um in den Maps den Sprayroom-Teleporter ausschließlich in den Spielmodi Spray Your Color und Spray Your Color Team erscheinen zu lassen. Ein Nachteil ist, dass der GtkRadiant ein misc_externalmodel nur als kleine orange Box angezeigt und nicht das Mapobjekt selbst. Um das Mapobjekt also korrekt positionieren zu können, gibt es einen kleinen Trick. Füge das Mapobjekt zuerst über ein Entity misc_model ein und mache alle gewünschten Einstellungen im Entities-Menüfenster. Wähle anschließend den Eintrag classname aus und ändere den Wert im Value-Feld von misc_model in misc_externalmodel um. Der NetRadiant hingegen hat das Problem nicht und zeigt das Mapobjekt bei dieser Methode immer an, daher ist diese Vorgehensweise dort nicht notwendig. Bei der Methode misc_externalmodel muss neben der Textur auch immer das Mapobjekt selbst Bestandteil der PK3-Datei sein. Auch hier gilt, verwendest du Mapobjekte aus WoP, sind diese bereits samt Textur und Shader in unseren PK3-Dateien enthalten und müssen nicht mehr von dir in deiner PK3-Datei mitgeliefert werden.

Besonderheit ASE

Eine Besonderheit solltest du beim Einfügen von Mapobjekte berücksichtigen, die im ASE-Format vorliegen. Im Gegensatz zum MD3-Format werden Mapobjekte im ASE-Format während der Lichtberechnung nicht automatisch in die Lightmap einbezogen und erscheinen in der Map immer sehr hell. Dies kannst du durch die Eingabe des Keys spawnflag mit dem Wert 4 im Value-Feld im Entity-Menüfenster verhindern. Der Q3Map2-Compiler wird dann das ASE-Mapobjekt automatisch in der Lightmap berücksichtigen.

Entity misc_model mit ASE-Format und Key spawnflag 4 für die Lichtberechnung

Entity misc_model mit ASE-Format und Key spawnflag 4 für die Lichtberechnung

Mapobjekte rotieren

Früher waren die Möglichkeiten zur Rotation auf die Z-Achse eines Mapobjektes beschränkt, da man nur den Key angle verwenden konnte. Dank des Q3Map2-Compilers gibt es erweiterte Möglichkeiten zur Rotation. Mit dem sehr ähnlich bezeichneten Key angles kannst du das Mapobjekt um alle drei Achsen rotieren. Dazu musst du Werte zwischen 1 und 360 Grad für jede einzelne Achse hintereinander und getrennt durch ein Leerzeichen in das Value-Feld eingeben. Der erste Wert definiert dabei die Rotation um die X-Achse, der zweite Wert um die Y-Achse und der dritte Wert um die Z-Achse. Dezimalwerte werden stets mit einem Dezimalpunkt und nicht mit einem Dezimalkomma eingegeben.

Entity misc_model mit Key angle für eine einfache Rotation

Entity misc_model mit Key angle für eine einfache Rotation

Falls du keine Lust auf das Entity-Menüfenster hast, kannst du bei ausgewähltem Mapobjekt auch durch drücken der Taste [R] die Funktion Rotate aufrufen (ist auch über die Toolleiste erreichbar) und das Mapobjekt direkt mit der Maus frei rotieren. Alternativ kannst du auch über das Hauptmenü Modify > Arbitary Rotation einen kleinen Eingabedialog aufrufen und dort die Werte für alle drei Achsen direkt eingeben. Bei beiden Methoden nimmt der Radiant für dich den Eintrag des Keys angles mit den entsprechenden Werten vor.

Entity misc_model mit Key angles für eine komplexere Rotation

Entity misc_model mit Key angles für eine komplexere Rotation

Bitte beachte, dass die beiden Keys angle und angles nicht gleichzeitig im selben Entity verwendet werden dürfen.

Mapobjekte skalieren

Ein weiterer Vorteil bei der Verwendung des Q3Map2-Compilers ist, dass du Mapobjekte frei skalieren kannst und nicht mehr, wie früher, in unterschiedlichen und passenden Größen vorliegen müssen. Für ein proportionales hoch und herunter skalieren eines Mapobjekts kannst du den Key modelscale verwenden. Die Eingabe von Werten zwischen 0 und 1 im Value-Feld bewirken eine Verkleinerung um den entsprechenden Faktor. Die Eingabe von Werten größer 1 hingegen bewirken eine Vergrößerung um den entsprechenden Faktor. Dezimalwerte werden stets mit einem Dezimalpunkt und nicht mit einem Dezimalkomma eingegeben.

Entity misc_model mit Key modelscale für einfaches Skalieren

Entity misc_model mit Key modelscale für einfaches Skalieren

Eine weitere Möglichkeit bietet dir der Key modelscale_vec, über den du ein Mapobjekt in jede der drei Dimensionen individuell stauchen oder strecken kannst. Dazu musst du das Value-Feld für jede Dimension Dezimalwerte hintereinander und durch ein Leerzeichen getrennt eingegeben werden. Der erste Wert definiert dabei die Skalierung entlang der X-Achse, der zweite Wert entlang der Y-Achse und der dritte Wert entlang der Z-Achse.

Entity misc_model mit Key modelscale_vec für komplexeres Skalieren

Entity misc_model mit Key modelscale_vec für komplexeres Skalieren

Bitte beachte, dass die beiden Keys modelscale und modelscale_vec nicht gleichzeitig im selben Entity verwendet werden dürfen. Die beiden beschriebenen Skalierungsmethoden funktionieren ausschließlich mit misc_model und nicht mit misc_externalmodel. Bedenke auch, dass bei zu starkem Hochskalieren die Mapobjekt-Textur ebenfalls stark gedehnt wird, was mitunter schlecht aussieht.

Mapobjekte clippen

Normalerweise sind Mapobjekte für Bots, Spieler und Waffenfeuer durchlässig. Du kannst also ganz einfach durch sie hindurch laufen oder schießen, wenn du sie nicht clippst. Um ein Mapobjekt effektiv zu clippen, reicht es ein paar einfache Brushes in der groben Grundform des Modells an die selbe Stelle zu setzen, so dass sie das Mapobjekt komplett einschließen. Belege diese Brushes auf allen Oberflächen mit der Textur common/fullclip, um Spieler, Bots und Waffenfeuer zu blocken. Diese Methode braucht etwas mehr Zeit, ist aber eine gute Variante, um die Performance der Map sicherzustellen.

Brushwork zum Clippen eines misc_model mit der Textur fullclip

Brushwork zum Clippen eines misc_model mit der Textur fullclip

Eine zweite Möglichkeit ergibt sich durch den Einsatz des Keys spawnflag mit dem Wert 2 im Value-Feld im Entities-Menüfenster. Dies bewegt den Q3Map2-Compiler dazu, Mapobjekte automatisch während des Kompilierens zu clippen, ganz ohne den Einsatz von zusätzlichen Clip-Brushes. Diese Methode ist sehr komfortabel, birgt bei aufwendigen Mapobjekten jedoch die Gefahr, dass die Performance der Map stark absinkt, sobald darauf geschossen wird. Aus diesem Grund sollte das nur bei sehr einfachen Mapobjekten mit wenigen Polygonen erfolgen. Ansonsten hat diese Methode den gleichen Effekt und blockt ebenfalls Spieler, Bots und Waffenfeuer.

Entity misc_model mit ASE-Format und Key spawnflag 6 für Clippen und Lichtberechnung

Entity misc_model mit ASE-Format und Key spawnflag 6 für Clippen und Lichtberechnung

Bitte beachte, dass ggf. ein Mapobjekt im ASE-Format eventuell bereits ein spawnflag mit dem Wert 4 für die Berechnung der Lightmap erhalten hat. In diesem Fall musst du das spawnflag mit dem Wert 2 für das Clippen hinzu addieren.Willst du also beides, Lightmap und Clippen, musst du den Key spawnflag mit einem Wert von 6 im Value-Feld eingeben.

Mapobjekte bewegen

Damit Mapobjekte in einer Map eine Bewegung ausführen, können ein paar Funktionen genutzt werden, die eigentlich für das Bewegen von Brushwork gedacht sind. Dazu gehören normalerweise func_bobbingfunc_button, func_pendulum, func_plat, func_rotating, func_train etc. Gemeint ist an dieser Stelle wirklich nur die Bewegung der Position eines Mapobjekts. Die Mapobjekte unterliegen grundsätzlich auch den bereits benannten Einschränkungen der Methode misc_externalmodel, daher ist ein Skalieren nicht möglich.

Um diese Methode anzuwenden, erstellst du zunächst an der Stelle an der später das Mapobjekt erscheinen soll, einen kleinen Brush in den Abmessungen von zum Beispiel 16 x 16 x 16 Units und belegst ihn vollständig mit der Textur common/origin. Du benötigst noch weiteres einfaches Brushwork in der ungefähren Größe des Mapobjekts zum Cippen, dass du vollständig mit der Textur common/fullclip belegst. Um die Abmessungen des Modells herauszufinden, könntest du es vorübergehend über misc_model an die entsprechende Stelle setzen, musst es aber danach wieder löschen. Wähle danach das komplette Brushwork inklusive des Origin-Brushes aus und mache es über das Kontextmenü (Rechtsklick) zu einer func_* deiner Wahl zu. Ist die komplette func_* noch ausgewählt, öffne das Entities-Menüfenster über die Taste [N] und gib als Key model2 ein. Als Wert musst du nun im Value-Feld den Pfad zum Mapobjekt korrekt eingeben (z.B. models/mapobjects/pad_fish/flame_angel05.md3).

Entity func_bobbing mit Origin-Brush, Fullclip-Brush und Key model2 zur Pfadangabe

Entity func_bobbing mit Origin-Brush, Fullclip-Brush und Key model2 zur Pfadangabe

Nach dem Kompilieren sollte nun das gewünschte Mapobjekt erscheinen und sich entsprechend bewegen. Es wird dabei immer am Mittelpunkt des Origin-Brushes ausgerichtet sein. Ist das Mapobjekt nicht an der richtigen Stelle, kann das an einer unsauberen Positionierung des Model-Tags selbst liegen, der den Koordinatenursprung des Mapobjekts definiert. In diesem Fall musst du den Origin-Brush in der func_* soweit verschieben bis dessen Zentrum exakt mit dem Model-Tag des Mapobjekts übereinstimmt. Dieser wird dir üblicherweise im Radianten angezeigt, wenn du das Mapobjekt ausgewählt hast.

Alternativ kannst du auch den Origin-Brush weglassen und die benötigten Koordinaten über den Key origin direkt in die func_* eingegeben. Dazu musst du die func_* auswählen und die Werte in Units für die drei Dimensionen X, Y und Z hintereinander und getrennt durch ein Leerzeichen in das Value-Feld im Entities-Menüfenster eingeben. Diese müssen den Koordinaten des Model-Tags entsprechen. Die Koordinaten des Model-Tags kannst du ermitteln, indem du das Mapobjekt temporär wieder über ein misc_model einfügst und richtig ausrichtest. Das Entity misc_model verfügt ebenfalls über den Key origin mit den entsprechenden Koordinaten, die du über das Entities-Menüfenster einsehen und kopieren kannst. Das ist zwar etwas umständlich, aber todsicher. Vergiss nicht das misc_model wieder zu löschen.

Animierte Mapobjekte

Seit WoP 1.5 hast du die Möglichkeit Mapobjekte in deine Map einzufügen, die eine Animation besitzen. Die Mapobjekte unterliegen grundsätzlich auch den bereits benannten Einschränkungen der Methode misc_externalmodel hinsichtlich der Rotation. Ein Skalieren ist grundsätzlich nicht möglich.

Du kannst das Mapobjekt ganz klassisch in deine Map einfügen, musst dazu aber unbedingt die oben beschriebene Methode misc_externalmodel verwenden. Es kommen jetzt drei neue Keys für das Entity hinzu, die von dir entsprechend der der Modelldatei enthaltenen Animation definiert werden müssen.

  • Der Key animationStart definiert den ersten Frame, ab dem die Animation abgespielt werden soll. Üblicherweise ist der Wert 0.
  • Der Key animationEnd definiert den letzten Frame, bis zu dem die Animation abgespielt werden soll. Üblicherweise ist der Wert großer als 0.
  • Der Key animationFPS definiert die Anzahl der Frames, die pro Sekunde abgespielt werden sollen. Üblicherweise ist der Wert 30.
Entity misc_externalmodel mit Keys animationStart, animationEnd, animationFPS zur Animation

Entity misc_externalmodel mit Keys animationStart, animationEnd, animationFPS zur Animation

Die Animation startet generell immer ab dem Start der Map und wird dann kontinuierlich in einer Schleife abgespielt. Es gibt keine Möglichkeit die Animation über einen Auslöser zu starten, zu stoppen oder sonst irgendwie zu beeinflussen. Es ist möglich über die Angabe von animationStart mit einem Wert größer 0 die Animation mittendrin zu starten. Durch die Angabe von animationEnd mit einem Wert kleiner als die Anzahl der vorhandenen Frames kann die Animation mittendrin gestoppt werden. Beides führt jedoch zu einen unschönen Sprung in der Animation. Die Angabe von animationEnd mit einem Wert größer als die Anzahl der vorhandenen Frames führt zu einer Verzögerung des Neustarts der Animation. In dieser Zeit steht das Mapobjekt vollständig still. Die Angabe animationFPS mit Werten unterhalb von 30 verlangsamen die Animation und die Angabe von Werten oberhalb von 30 beschleunigen die Animation. Ob das jedoch in deiner Map irgendwie sinnvoll einsetzbar ist, überlasse ich dir.

Eine Übersicht über in World of Padman animierten Mapobjekte und zugehörige Pfadangaben, Keys und Werte erhältst du im Katalog: Mapobjekte (suche nach „animation“).