Entities

Die -Engine unterstützt veschiedene Arten von in einem Level platzierten 3D-Objekten - Entities. Entities können per Skript erstellt, oder per WED im Level platziertwerden. Sie haben keinen Einfluß auf den BSP-Tree, unterliegen jedoch dem BSP/PVS-Culling. Sie werden nicht in der Level-Datei gespeichert, sondern sind externe Dateien, die aus dem Work-Ordner oder dem Pfad gelesen werden. Die folgenden Arten von Entities werden unterstützt:

Modelle

Ein Modell ist ein animiertes 3D-Objekt, das als externe MDL-Datei gespeichert ist. Es besteht aus einem 3D-Gitter (Mesh) mit einem darunterliegenden Skelett (Bones) und einer darübergespannten, elastischen Texturhaut (Skin). Modell-Entities können dynamische Schatten werfen und werden meistens für bewegliche oder animierte Objekte, wie Figuren oder Monster, benutzt.

Modelle werden mit einem Modell-Editorprogramm wie etwa MED erstellt oder aus gebräuchlichen Dateiformaten wie FBX, 3DS, X, OBJ, ASE oder MD2 importiert. Externe 3D-Editoren wie Truespace®, gameSpace®, Maya® oder 3D Studio MAX® können Modelle mittels Plugins direkt im GameStudio-Format abspeichern. Plugins zum Modell-Erstellen mit MAX oder Maya können Sie von der GameStudio Website laden.

Verschiedene Teile des Modell-Mesh können mit verschiedenen Texturen, Materialeigenschaften und Shadern belegt werden.

Sprites

Ein Sprite ist ein flaches 2D-Objekt, das für mehrere Zwecke eingesetzt werden kann. Es kann wie ein 'Abziehbild' (Decal) flach an eine Wand oder auf den Boden gesetzt werden; es kann wie ein Verkehrsschild (Billboard) aufrecht in der Landschaft stehen oder sich pseudo-3D verhalten, wobei es sich immer der Kamera zuwendet.

Sprite Entities werden als externe Bilddateien - PCX, BMP, TGA, oder DDS - gespeichert und können mit Malprogrammen wie Gimp, PaintShop Pro® oder Adobe Photoshop® erstellt werden. TGA- oder DDS-Sprites können einen Alpha-Kanal enthalten, der jedem einzelnen Pixel einen Transparenzwert zuordnet. DDS-Dateien können zugunsten besserer Qualität und schnelleren Renderns mehrere Mipmapsn enthalten. Sprit-Entities werden schneller gerendert als Map oder Modellentities und lassen sich für Explosionen, Lichter, Flammen, Bäume, Gras oder dergleichen verwenden.

PCX-, BMP- oder TGA-Sprites können animiert sein. DDS-Sprites können Mipmaps enthalten, die für bessere Qualität und schnelleres Rendern sorgen. Sprite-Entities werden schneller gerendert als Map- oder Modellentities. Sie können für Explosionen, Lichter, Flammen, Gras usw. benutzt werden.

A8 Endet der Dateiname des Sprites auf "_x2" oder "_x3", wird es in Form von 2 bzw. 3 gekreutzen Flächen gerendert. Dies ist zum Simmulieren von Vegetation sehr nützlich. Ein Beispiel finden Sie im Demo infinite_terrain.c.

Sind die Winkel eines Sprites auf Null, wird es aufrecht stehen und sich horizontal der Kamera zuwenden. Ist sein pan- oder tilt-Winkel ungleich Null, wird der Sprite im seinen Winkeln gemäß im Raum der Welt ausgerichtet. Vier kreuzweise ausgerichtete Sprites lassen sich zur Darstellung von Pflanzen oder Bäumen plazieren. Sind pan und tilt beide 0, der roll-Winkel jedoch ungleich Null, wird sich der Sprite der Kamera in zwei Richtungen zuwenden. Für kugelförimge Objekte wie Feuerbälle oder Explosionen ist dies sehr nützlich. Für ein animiertes Sprite in den Formaten PCX, BMP, oder TGA (DDS unterstützte in A7) keine Animation) setzen Sie einfach die einzelnen Animationsphasen nebeneinander wie bei einem horizontalen Filmstreifen. Geben Sie die Anzahl der Phasen nach einem '+' am Ende des Dateinamens an, wie zum Beispiel explo+11.tga:

Sub-Level (Map-Entities)

Eine Map-Entity ist einfach ein kleiner Level, der in einer externen WMB-Datei gespeichert ist. Map-Entities werden für die Teile im Level gebraucht, die sich als Ganzes bewegen, wie z.B. Türen, Plattformen, Zugbrücken oder Fahrzeuge. Da sie nichts anderes als kleine, kompilierte Maps sind, lassen sie sich mit WED erstellen. Beispielsweise können Sie jedes Prefab (Fertigteil) in eine solche Map-Entity umwandeln, indem Sie sie in WED öffen, ein BUILD durchführen und die sich ergebende WMB-Datei in Ihr gegenwärtiges Levelverzeichnis kopieren. Sie finden jede Menge vorbereiteter Türen, Möbel, Fahrzeuge und ähnliches in den Prefab-Unterverzeichnissen.

Die Texturen und Shadow-Maps des Levels oder von Map Entities werden bereits beim Laden im Texturspeicher der Videokarte abgelegt, um den Spielablauf flüssig zu halten. Bei allen anderen Entities belegen die Texturen erst dann Speicherplatz, wenn die Entity sichtbar ist.

Auch Modelle, Sprites oder Terrain werden als Teil einer Map-Entity mit in das Level gesetzt, in welches die Map-Entity eingefügt wird. Auf diese Weise können Entity-Gruppen definiert und miteinander als Map-Entities kompiliert werden. Durchlässige (passable), rechteckige, nichtrotierte Map-Entitities werden von den Template-Skripten als Wasser-Blöcke verwendet, in denen Actors waten, schwimmen, oder tauchen können.

Terrain

Ein Terrain ist ein rechteckiges Gitter von Höhenwerten mit einer oder mehren darüber gespannten Texturen. Es ist in einer externen HMP-Datei gespeichert. Terrain kann aus von Terrain-Generatoren produzierten BMP- oder PCX-Bitmaps in MED importiert und bearbeitet werden. Terrain ist 'fest' - es kann nicht animiert, gedreht, verschoben oder skaliert werden; allerdings kann es unter bestimmten Umständen deformiert werden. Die Terrain-Textur wird senkrecht projiziert, daher sieht die Textur an steilen Steigungen 'gedehnt' aus.

Aufgrund der enormen Grösse eines Terrains reicht es nicht, eine normale Textur darauf zu mappen. Auch bei der empfohlenen Textur-Maximalgrösse von 2048x2048 Pixeln sähe das Terrain aus der Nähe unscharf aus. Die Lösung ist eine kleine Detail-Textur, die eine hochauflösende Sand-, Stein-, oder Grassstruktur über die erste Textur blendet. Hat ein Terrain eine zweite Skin, wird diese automatisch für Detailtexturen verwendet.

Eine Erweiterung dieses Konzepts ist das Verwenden vielfältiger Detailtexturen zum stellenweisen Mappen von Steinen, Gras, Pfaden etc auf verschiedene Teile des Terrains. Das Material-Template mtlFX.c benutzt einen Effekt, um eine willkürliche Anzahl von Texturen in das Terrein einzublenden. Jede Textur muß eine Blend-Maske in ihrem Alphakanal haben. Um das Template zu benutzen, inkludieren Sie mtlFX.c in Ihr Skript und weisen die Aktion fx_terraintex oder das Material mtl_terraintex Ihrem Terrain zu.

Durchlässige (passable) Terrains werden von den Template-Skripten für für Wasseroberflächen, in denen Actors waten, schwimmen oder tauchen können, verwendet. Mithilfe der oben erwähnten Material-Effects-Bibliothek lassen sich Wasserterrain reflektierende Wasserflächen mit Wellenbewegung zuweisen.

Die Engine unterstützt zwei Arten von Terrain: in einem Stück (unchunked) oder parzelliert (chunked). Per Default ist Terrain parzelliert, es sei denn die Variable terrain_chunk ist auf 0 gesetzt oder der Dateiname der Terrain endet auf '_n' (z. B. "nonchunked_n.hmp") bestimmt. Unparzelliertes Terrain wird genau wie ein Modell gerendert und darf die Größe von 128x128 Vertices nicht überschreiten.  C  Parzelliertes Terrain wird von der Engine in quadratische Parzellen, die in einem Speicher-Cache gespeichert werden aufgeteilt. Sie werden separat geclippt wenn sie sich außerhalb des View-Frustrums befinden und  P  in verschiedenen Auflösungs-Schritten je nach Abstand zur Kamera und in Abhängigkeit der Einstellung von terrain_lod gerendert. Diese Methode ermöglicht viel schnelleres Terrain-Rendering und theoretisch eine unbegrenzte Größe von Terrain. Der kleine Haken dabei ist, daß sich parzelliertes Terrain nicht für Wasseryphysik benutzen läßt.

Entity selection guide

Für den Fall, dass Sie sich nicht sicher sind, welche Art von Entity Sie für einen bestimmten Zweck verwenden sollen, hier eine Liste der Unterschiede:

Entity-Typ Modell Sprite Map Unchunked Terrain* Chunked Terrain*
Meist verwendet für Actors, Fahrzeuge Pflanzen, Effekte, Dekorationen Gebäude, Plattformen, Türen, Züge Aussen-Landschaften Aussen-Landschaften
Import-Format 3DS, X, OBJ, ASE, MDL, MD2 BMP, PCX, TGA, DDS MAP, WMP BMP, PCX, RAW, HMP BMP, PCX, RAW, HMP
Erstellt mit MED oder externer Modell-Editor Malprogramm Map-Editor (WED) MED oder externer Terrain-Editor MED oder externer Terrain-Editor
Polygone ~10000 1 ~1000 ~10000 ~100000
Größe Klein Klein Mittel Groß Groß
Animation Gestalt, Skelett, Textur, Shader* Textur, Shader* Textur, Shader* Shader*, Deformation, Wasserphysik Shader*, Deformation
Kollisionsform Bounding Box, Ellipsoid, Polygonal Bounding Box, Ellipsoid Polygonal Polygonal Polygonal
Bewegung Bewegen, Rotieren, Skalieren Bewegen, Rotieren, Skalieren Bewegen, Rotieren Keine Keine
Schattierung PRV, Gouraud, dynamische Schatten* PRV PRV, statische Schatten Gouraud, statische Schatten* Gouraud, statische Schatten*
Transparenz Alphakanal, Transluzenz, Overlay Alphakanal, Transluzenz, Overlay

Transluzenz, Overlay

Transluzenz Transluzenz

* Nicht in allen Editionen unterstützt.

Sie können ein und dasselbe Objekt entweder als Entity (oder als Map-Entity nach dem Kompilieren) plazieren oder es als Block oder Prefab (vorfabriziertes Fertigteil) in Ihr Level importieren. Soll das Objekt sich bewegen oder transparent sein, haben Sie keine Wahl: Es muss eine Entity sein. Andernfalls gibt es einige Pros und Contras, die auf der Tatsache basieren, dass Blocks oder Prefabs aktiv den Bsp-Tree beinflussen, während dieser sich wiederum auf Map-Entities auswirkt...

Map-Entities oder Prefabs

  Entities Prefabs
Platzierung + Object/Add Map/Model/Terrain/Sprite + Object/Add Prefab, File/Import n
Renderzeit (falls sichtbar)) + Schneller, wenn komplex + Schneller, wenn simpel
Renderzeit (falls nicht sichtbar) + Schneller -  Langsamer
BUILD-Zeit + Kein Einfluß - Langsamer (Geometriebeschränkungen)
Transparenz + Ja + Nein
Licht und statische Schatten - Eigene Lichter, Schatten auf sich selbst -  Licht- und Schattenwurf im Level
Bewegungsmöglichkeit + Kann sich bewegen -  Fixiert
Aktionen + Ja -  Nein

Automatisches Zuweisen von Aktionen

Wird eine Entity ins Level eingefügt, wird ihr, falls im Skript vorhanden, automatisch eine Aktion selben Namens (ohne Extension) zugewiesen. Platziert man z.B. 'guard.mdl' im Level, bekommt diese Entity automatisch die Aktion 'guard' zugewiesen.

Verhalten (Behavior)

Klickt man rechts auf eine Entity und wählt 'Behavior', erscheint ein Pop-Up-Panel, mit dem sich das Verhalten der Entity der zugewiesenen Aktion gemäß individuell anpassen lässt. Es ist wie das Anpassen (customize) eines Skripts. Solange keine Aktion zugewiesen ist, bietet das Behavior-Panel eine Aktionsliste zum Aussuchen einer Aktion, genauso wie unter Properties->Behavior->Choose Action. Ist eine Aktion zugewiesen, lassen sich die ersten 20 Skills und 8 Flags der Entity gemäß der comment tags der Aktion modifizieren.

Nullpunkt

Bei Sprite-Entities ist der Nullpunkt das geometrische Zentrum der Bitmap. Für Map- oder Modellentities wird der Nullpunkt im Editor festgelegt. Soll ein Modell Stufen übersteigen oder klettern, verschieben Sie seinen Nullpunkt einfach in eine höhere Position innerhalb seines Körpers. Ein Modell kann maximal Stufen der gleichen Höhe übersteigen, wie die Differenz zwischen der Untergrenze seiner Hülle und seinen Füßen beträgt. Wollen Sie ein Modell überhaupt keine Stufen übersteigen lassen - wenn es zum Beispiel ein Auto ist - verlegen Sie seine Nullpunkt einfach an einen niedrigen Punkt. Aber geben Sie Acht, dass Sie es nicht in eine zu niedrige Position verlegen, da sich die Hülle dann möglicherweise innerhalb des Bodens befindet und sich die Entity überhaupt nicht mehr bewegen kann. Der Nullpunkt ist auch der Referenzpunkt für die Drehung der Entity.

LOD (Detailstufen)

Detail-Level (Levels Of Detail / LOD) werden zur Verbesserung der Framerate in sehr großen Außenlevels verwendet. Die Darstellung eines detailliert gerenderten Modells mit mehreren tausend Polygonen sieht gut aus, wenn sich das Modell dicht vor der Kamera befindet. Je weiter es aber entfernt ist, desto weniger werden die Details wahrnehmbar. Ein einfacheres Modell mit wenigen Polygonen sieht dann genauso gut aus, wird aber schneller gerendert. Der Unterschied in der Rendergeschwindigkeit macht sich vor allem in ausgedehnten Außenleveln bemerkbar, wenn dort viele hochpolygone Entities wie Bäume im Wald, eine Armee oder eine aus Haus-Entities zusammengestellte Stadt sichtbar sind.

Verwenden Sie also LOD für sämtliche Modelle, die aus mehr als 500.. 1000 Polygonen bestehen und mehrfach in verschiedenen abständen in ihrem Level existieren. Es hat nicht viel Sinn LOD für Modelle von weniger als 100 Polygonen zu benutzen, denn das ergäbe keinen merklichen Unterschied in der Rendergeschwindigkeit.

Mit der  P  Pro-Edition können Sie den LOD Manager von MED zum automatischen Generieren von LODs für Modelle benutzen. Terrain-LOD wird von der Pro-Edition automatisch über die Variable terrain_lod gehandhabt. Alternativ können Sie bei Entities niedrigerer Versionen auch manuell Modelle verschiedener Auflösungen erstellen. Sie werden von der Engine in Abhängigkeit ihres Abstands zur Kamera umgeschaltet. Wenn ein Entity-Dateiname mit "_0" endet, werden ähnliche Entity-Dateien, die mit "_1", "_2", oder "_3" enden, automatisch für die Darstellung mit geringeren Details benutzt (z.B. für "house_0.wmb" erwartet die Engine "house_1.wmb", "house_2.wmb", "house_3.wmb" als LOD-Dateien).

 A7  Dieselben LOD-Schritte sind auch für Material-Effekte (material effects) und Shader (shaders) verfügbar. Heißt eine Effekt-Technik "lod0", "lod1", "lod2", oder "lod3" wird sie beim entsprechenden LOD-Level gerendert, ganz gleich, ob eine LOD-Entity vorhanden ist oder nicht. Auf diese Weiselassen sich verschiedene Effekte unabhängig vom Abstand der Entiy rendern. Geben Sie der am meisten zeitraubenden Technik den Namen lod0 und verwenden Sie lod1, lod2, und lod3 für einfachere und schnellere Effekte.

Die LOD-Distanzen lassen sich per Skript über camera.clip_far und d3d_lodfactor einstellen. Mit den voreingestellen LOD-Faktoren wird die Entity ab einer Distanz von 1/8 von clip_far mit der LOD-Stufe 1 dargestellt, ab ¼ von clip_far mit Stufe 2 und mit der 3. Stufe ab der halben clip_far-Distanz. Um ständiges Wechseln verschiedener LOD-Stufen bei bestimmten Distanzen zu verhindern, wechseln die Level erst bei Überschreiten eines Hysteresewerts von 15%. Befindet sich die Entity außerhalb der clip_far-Distanz, wird sie überhaupt nicht dargestellt. LOD wird für Chunked Terrain nicht unterstützt.

Für eine korrekte Animation und Beleuchtung müssen alle LOD-Dateinen von derselben Sorte sein, sowie dieselbe Größe und Ursprungsposition, Farbtiefe und Transparenz haben. So darf sich beispielsweise ein animiertes Modell nicht in ein Sprite verwandeln. Die Anzahl und Farbtiefe von Skins, die Anzahl der Frames und die Frame-Namen müssen bein sämtlichen LOD-Dateien identisch sein. Wird eine LOD-Datei nicht gefunden, wird die Entity auf dieser LOD-Distanz überhaupt nicht dargestellt. So kann man aus verschiedenen Teilen zusammengesetzte Unter-Entities ab einer bestimmten Distanz unterdrücken. Hat ein Model mehrere LOD-Stufen, wird sein Schatten aus der nächsthöheren der jeweils dargestellten Stufe berechnet (einstellbar per shadow_lod). Auf diese Weise können dynamische Schatten deutlich schneller gerendert werden. Ist das Modell weiter als 50% der clip_far Distanz entfernt, wird überhaupt kein Schatten mehr gerendert.

Schatten

Nichttransparente Modell-Entities können dynamische Schatten werfen, wenn ihr SHADOW Flag per WED oder per Skript gesetzt ist. Anhängig von der Einstellung von shadow_stencil generiert die Engine dynamische Decal-Schatten, Stencil-Schatten oder PSSM-Schatten.

Allgemeiner Decal-Schatten Individueller Decal-Schatten Stencil Eigenschatten
Stencil ohne Eigenschatten Geglätteter Stencil-Schatten PSSM Eigenschatten

Falls sich die Entity jedoch nicht bewegt - wie etwa ein Baum - kann es von Vorteil sein, sie einen statischen Schatten werfen zu lassen. Statische Schatten haben einen sanfteren Helligkeitsverlauf, werden schneller gerendert und werden von allen Editionen unterstützt. Erstellen Sie einen Block in der ungefähren Größe und Form der Entity, platzieren Sie ihn auf die Entity-Position, setzen Sie sein Detail-Flag und weisen Sie allen Seiten den Texturmodus None zu, um ihn unsichtbar zu machen. Der Block wird dann einen statischen Schatten auf den Boden werfen und als Hindernis dienen, aber nicht sichtbar sein. Bei der Entity kann das PASSABLE-Flag für schnellere Kollisionserkennung gesetzt werden.

Transparenz

Entities können 3 Arten von Transparenz haben: Overlay-Transparenz, Alpha-Transparenz (Transluzenz) und Alphakanal-Transparenz.

Overlay-Transparenz bedeutet, dass alle komplett schwarzen Texturpixel und sämtliche Pixel unterhalb einer bestimmten Transparenzschwelle vollkommen transparent, also unsichtbar sind. Alle anderen Pixel sind absolut sichtbar, es gibt keine Zwischenstufen. Sprites und Partikel sind, wenn ihre Textur keinen Alphakanal hat, automatisch overlay-transparent .

Alpha-Transparenz bedeutet eine gleichmäßige Transparenz über die gesamte Entity-Textur und wird durch Setzen des Flags TRANSLUCENT aktiviert. sie wird oft zum sanften Ein- und Ausblenden von Entities verwender.

Alphakanal-Transparenz bedeutet, daß jeder Texturpixel seinen eigenen und individuellen Transparenwert hat. Diese Art von Transparenz ist normalerweise dann aktiv, wen n die Entitytextur einen Alphakanal enthält. Das ist bei transparenten Texturformaten wie TGA 32 bit or DDS DXT2..5 der Fall. Darf eine Entity nicht transparent sein obwohl ihre Skin einen Alphakanal enthält - beispielsweise wenn der Alphakanal in einem Shader für eine spiegelnde Map benutzt wird - kann man das Flag PASS_SOLID verwenden.

Alle drei Transparenztypen lassen sich kombinieren, allerdings hat das Konsequenzen für ihr Rendern. Wenn Sie beispielsweise Overlay- und Alpha-Transparenz kombinieren, wird, wenn der Alpha-Wert der Entity unter die Transparenzschwelle fällt, die gesamte Textur sichtbar (d3d_alpharef).

Eine logische Konsequenz von durchsichtigen oder alphakanal-transparenten Objekten besteht darin, dass Sie andere Objekte durch sie hindurchsehen können. Das klingt zwar trivial, bedeutet aber, dass transparente oder durchscheinende Entities über allen nicht-durchsichtigen Entities gerendert werden (siehe Renden) und nicht in den Z-Buffer der 3D-Karte schreiben können. Dadurch ist ihre Tiefensortierung nicht pixelgenau, sondern nur objekt-genau. Polygone oder andere Teile desselben Objekts verdecken einander nicht. Dies kann, wenn Dreiecke transparenter Modelle sich überlappen, zu sichtbaren Sortierfehlern auf dem Bildschirm führen. Die Fehler sind normalerweise kaum zu bemerken, manchmal aber sehr offensichtlich - besonders dann, wenn der Alphakanal fast undurchsichtig ist. Falls Sie solche Sortierfehler sehen, wissen Sie, dass Sie hier Transparenz an falscher Stelle eingesetzt haben und dies auch selbst korrigieren müssen - Beschwerden beim Support oder auf dem Gamestudio-Forum helfen nicht. Jeder Spielentwickler muss einfach beachten, wie 3D-Karten mit Transparenz umgehen.

Die übliche Lösung, solchen Sortierfehlern vorzubeugen liegt im Aufteilen einer transparenten Entity in mehrere Unterentities, die dann individuell tiefensortiert werden. Sie können auch eine Entity verwenden, die aus transparenten und nicht-transparenten Gruppen besteht. Abhängig von Typ des Spiels kann auch Setzen von d3d_entsort auf den Wert 2 Sortierprobleme lösen.► Aktuelle Version Online