Tipps, Tricks und weiterführende Informationen.

Statische Kollisionsboxen nachbearbeiten

Statische Objekte sind Objekte die im Spiel fest fixiert sind. Alle statischen Objekte müssen, nachdem sie exportiert wurden, noch in Nifskope nachbearbeitet werden. Und zwar ist es unbedingt erforderlich, da im Nif-Exporter bei Masse kein Wert kleiner als 0,1 eingestellt werden kann, diesen Wert nachträglich mit Nifskope auf 0 zu stellen. Man kann ein solches Objekt zwar auch benutzen wenn dieser Wert nicht auf 0 steht. Allerdings könnte dies zu einigen Merkwürdigkeiten führen. Eine davon ist zum Beispiel dass die Berührungsgeräusche auf einmal nicht mehr stimmen oder ganz einfach seltsam klingt. Um die Werte auf 0 zu setzen geht folgendermaßen vor.

  1. Öffnet Nifskope
  2. Ladet Euer gerade exportiertes Objekt.
  3. Öffnet auf der linken Seite die Kollisionsmesh indem Ihr auf auf das kleine Pluszeichen vor „bhkCollisionObject“ klickt. Eventuell müsst Ihr dazu vorher noch die NiNode in der sich Eure Kollisionsmesh befindet öffnen.
    Abbildung
    Bild 1
  4. Klickt jetzt auf die bhkRigidBody
    Abbildung
    Bild 2
  5. Sucht unten im Detailfenster den Eintrag „Mass“ und führt einen Doppelklick auf den Wert bei „Mass“ aus. Ändert den Wert indem Ihr einfach eine 0 reinschreibt und die Eingabetaste betätigt.
    Abbildung
    Bild 3
  6. Klickt jetzt auf das kleine Pluszeichen vor „Inertia“.
    Abbildung
    Bild 4
    Bei Inertia handelt es sich um die Beharrungskräfte der Kollision. Also um die Kräfte die der Schwerkraft entgegenwirken. Diese Werte wurden beim Export vom Exporter, auf Basis der Masse, berechnet. Da wir die Masse auf 0 zurückgesetzt haben müssen wir das auch hier tun. Wer im übrigen mehr zu Inertia erfahren möchte kann hier klicken (englisch).

    Ihr findet unter „Inertia“ eine ganze Reihe weiterer Einträge die alle mit einem „m“ beginnen. Ändert hier alle Einträge, die nicht auf 0 stehen, ebenfalls auf 0.
    Abbildung
    Bild 5
  7. speichert Eure Mesh und fertig

Die bhkMoppBvTreeShape

Wenn Ihr irgend eine Mesh mit einer PackedNiTriStripsShape mal in Nifskope öffnet werdet Ihr in jeder Mesh mit einer solchen Kollision eine sogenannte bhkMoppBvTreeShape, abgekürzt Mopp, vorfinden. Die Position ist wie folgt: bhkCollisionObject - bhkRigidBody - bhkMoppBvTreeShape - bhkPackedNiTriStripsShape - bhkPackedNiTriStripsData. Die Mopp verbindet also die Kollisionsdaten mit der bhkRigidBody. Was sie darüber hinaus macht und wozu sie eigentlich da ist konnte ich bis jetzt nicht in Erfahrung bringen. Nur soviel hat meine eigene Erfahrung mit der bhkMoppBvTreeShape ergeben.

  1. Sie unterstützt nicht mehrere Materialien. Auch wenn in der bhkPackedNiTriStripsShape verschiedene NiTriStripsDatas mit unterschiedlichen Materialien zusammengefasst werden, werden diese Materialien wieder von der bhkMoppBvTreeShape mit dem, dort angegebenen Material, überschrieben. Das heißt das wenn in der Mopp als Material „Hav_Mat_Stone“, also Stein, angegeben ist besteht die gesamte Kollision aus Stein - auch wenn ein Teil der Kollision aus Holz besteht. Seltsamerweise tritt dieser Effekt aber nur bei der, vom Nif-Exporter beim Export einer PackedNiTriStripsShape automatisch generierten Mopp, ein aber nicht bei den von Bethesda eingesetzten Mopps.
  2. Die vom Nif-Exporter erstellte Mopp beeinträchtigt ganz erheblich die Performance. Und das, in einzelnen Fällen, sogar hin bis zu einer „Dia-Show“.

Aus diesen Gründen, vor allem aber aus dem Zweiten, verzichte ich mittlerweile vollkommen auf die Mopp und ich kann Euch nur das gleiche empfehlen. Die Mopp zu entfernen ist sehr einfach und es funktioniert danach alles perfekt - ohne Performance-Einbrüche.

  1. Zuerst einmal müssen wir die Kollisionsdaten direkt mit der bhkRigidBody verbinden. Ladet dazu erst einmal Eure Mesh in Nifskope
  2. Klickt jetzt links in der Baumstruktur auf das kleine Kreuz vor bhkCollisionObject. Verfahrt ebenso bei der bhkRigidBody sowie bei der bhkMoppBvTreeShape. Eure Kollision sollte jetzt, so wie auf Bild 6, geöffnet sein.
    Abbildung
    Bild 6
  3. Führt jetzt einen Linksklick auf „bhkRigidBody“ aus.Unten im Detailfenster seht Ihr jetzt, gleich in der ersten Zeile bei „Shape“, als Wert die bhkMoppBvTreeShape.
    Abbildung
    Bild 7
  4. Klickt doppelt darauf und tragt als neuen Wert nur ganz einfach die Zahl vor der „bhkPackedNiTriStripsShape" ein.
    Abbildung
    Bild 8

Damit ist die PackedNiTriStripsShape direkt mit der bhkRigidBody verbunden. Eure Kollision ist also noch, wie Ihr im Renderfenster von Nifskope sehen könnt, vorhanden. Die bhkMoppBvTreeShape dagegen wurde, zusammen mit Kopien der PackedNiTriStripsShape sowie der PackedNiTriStripsData, ganz unten, außerhalb der 0-NiNode abgelegt.

Abbildung
Bild 9

Da wir die Mopp nicht mehr benötigen können wir sie jetzt entfernen. Klickt dazu mit der rechten Maustaste auf die Mopp und wählt aus dem Popup-Menü erst „Block“ und klickt anschließend im Untermenü auf „Remove Branch“ um die Mopp, komplett mit den Kopien der Kollisionsdaten, zu entfernen.

Abbildung
Bild 10

Abspeichern und fertig.

Das Problem der begehbaren Flächen.

Begehbare Flächen sind Flächen auf denen man laufen kann oder die zum Laufen gedacht sind - also Fußböden, Treppenstufen, Tischplatten usw. Bei solchen Flächen dürfen weder ListShapes, also Shapes die mehrere primitive Kollisionsboxen zusammenfassen, noch PackedNiTriStripsShapes benutzt werden.

bhkListShapes:
ListShapes sind Teil einer Kollisionsbox mit denen es möglich ist, aus Performancegründen, mehrere primitive Kollisionsboxen in einer einzigen NiNode zusammenzufassen. Hierzu noch einmal das Schwert vom Anfang des Tutorials bei dem eine solche Listshape, die alle vier Kollisionsboxen aufnimmt, eingesetzt wurde.

Abbildung
Bild 11

Leider gibt es dabei aber ein Problem. Wenn nämlich eine begehbare Fläche dabei ist hört man, beim drüberlaufen, keine Schrittgeräusche. Es ist tatsächlich so als würde man über der Fläche schweben. Ein seltsames Phänomen. Einzigste Lösung: verzichtet auf die Listshape und verbindet die einzelnen Kollisionsboxen, wie auf unterem Screenshot, mit der Mesh.

Abbildung
Bild 12

Wie man sehen kann wird also für jede Kollisionsbox eine separate NiNode erstellt und einfach an die 0-NiNode drangehangen. Um das zu realisieren habt Ihr zwei Möglichkeiten.

  1. Automatisch mit Blender (einfach): Deaktiviert dazu einfach, beim Export, im Exportfenster die Schaltfläche „Use bhkListShape“. Blender erstellt dann für jede Kollisionsbox eine separate NiNode.
  2. Manuell in Nifskope (mehr Arbeit und nur sinnvoll wenn Ihr die Mesh mit einer Listshape exportiert habt und sie jetzt, auf Grund diesen Fehlers, manuell ändern wollt):
    1. Zuerst entfernt die komplette Listshape wieder. Klickt dazu mit der linken Maustaste auf „bhkRigidBody“, klickt im Detailfenster doppelt, in der ersten Zeile, auf bhkListShape und ersetzt den Wert durch -1. Die ListShape wird entfernt und unten abgelegt. Damit ist auch Eure Kollision erst einmal nicht sichtbar.
      Abbildung
      Bild 13
    2. Öffnet jetzt die, unten abgelegte, „bhkListShape“ indem Ihr auf das kleine Plus-Zeichen davor klickt.
      Abbildung
      Bild 14
    3. Klickt jetzt mit der linken Maustaste oben auf „bhkListShape“ und tragt im Detailfenster bei Shape, dort wo Ihr vorher -1 eingetragen habt, die Nummer, die vor der ersten Kollisionsbox steht, ein.
      Abbildung
      Bild 15
      Damit haben wir wieder die erste Kollisionsbox mit der Mesh verbunden. Sie sollte jetzt wieder rechts im Fenster zu sehen sein. Aber noch haben wir vier weitere Kollisionsboxen übrig für die wir jetzt vier NiNoden, für jede Kollisionsbox eine, besorgen.
    4. Klickt dazu mit der rechten Maustaste auf die 0-NiNode, geht im Menü runter auf „Block“ und klickt anschließend auf „Insert“.
      Abbildung
      Bild 16
    5. Es öffnet sich ein weiteres Menü in dem Ihr mit der Maus runter geht bis auf „NIN...“ und dann auf „NiNode“ klickt.
      Abbildung
      Bild 17
      Es wird jetzt eine weitere NiNode ganz unten an Eure 0-NiNode drangehangen. Führt diesen Schritt noch weiter drei mal durch. Am Ende sollten sich vier NiNoden unten an Eurer 0-NiNode befinden.
      Abbildung
      Bild 18
    6. Als nächstes müssen wir prüfen ob die NiNoden korrekt mit der 0-NiNode verbunden sind. Klickt dazu mit der linken Maustaste oben auf die 0-NiNode. Unten im Detailfenster sucht jetzt nach „Num Children“.
      Abbildung
      Bild 19
      Kontrolliert den Wert bei „Num Children“. Zu den Children (Kinder) gehören alle NiTriStrips sowie alle NiNoden. In unserem Fall haben wir 6 NiTriStrips und unsere 4 NiNoden. Macht zusammen 10. Also stimmt schon mal der, bei der 0-NiNode unter „Num Children“ eingetragene, Wert. Falls die Anzahl der Children nicht stimmen sollte einfach, wie gehabt, einen Doppelklick auf den Wert ausführen und die korrekte Anzahl der Children eintragen. Führt anschließend einen Linksklick auf die grünen Pfeile unterhalb des, soeben geänderten, Werts aus um die Children zu aktualisieren.
    7. Klickt nun auf das kleine Plus vor „Children“ um diesen Ast zu öffnen und tragt überall wo Ihr ein „None“ seht die Zahlen, die vor den einzelnen NiNoden, die Ihr gerade eingefügt habt, stehen, ein.
      Abbildung
      Bild 20
      Eure NiNoden sollten sich jetzt im Zweig der 0-NiNode befinden.
      Falls, beim aktualisieren, das ein oder andere Objekt rausgefallen sein sollte, was durchaus passieren kann, einfach wieder eintragen.
    8. Als nächstes benötigen wir für jede NiNode natürlich auch ein Kollisionsobjekt. Klickt dazu einfach mit der rechten Maustaste ganz oben auf „bhkCollisionObject“, bewegt die Maus in dem aufpoppendem Menü auf „Block“ und klickt danach auf „Copy Branch“.
      Abbildung
      Bild 21
    9. Klickt jetzt auf irgend eine NiNode mit der rechten Maustaste, geht in dem Popup-Menü auf „Block“ und klickt dieses Mal auf „Paste Branch“.
      Abbildung
      Bild 22
      Wiederholt diesen Schritt noch drei mal um insgesamt vier komplette Kollisionsobjekte einzufügen.
    10. Noch sind Eure Kollisionsobjekte aber nicht mit Euren vier zusätzlichen NiNoden verknüpft. Erledigt das jetzt. Die Vorgehensweise ist dabei die gleiche wie schon hier unter Punkt 13.1 - 13.3 erklärt. Ich erklär's also hier nicht noch einmal. Verbindet jedes „bhkCollisionObject“ mit einer Eurer zusätzlichen NiNoden. Denkt daran das unter „Target“ selbstverständlich immer die NiNode eingetragen sein muss an der das Kollisionsobjekt hängt und nicht die 0-NiNode.
    11. Führt jetzt nacheinander bei allen vier Kollisionsobjekten die, hier unter Punkt 13.5 und Punkt 13.6 erklärten Schritte, durch und tragt dort jetzt die Nummern der 2., 3., 4., und 5., unter der bhkListShape befindlichen, Kollisionsbox ein. Wenn Ihr alles richtig gemacht habt solltet Ihr die komplette Kollision im rechten Fenster sehen.
    12. Zum Schluss müssen wir noch ein wenig aufräumen und alle Blöcke unserer Mesh neu anordnen. Entfernt dazu zuerst einmal die bhkListShape die sich noch ganz unten befindet indem Ihr mit der rechten Maustaste draufklickt, im Popup-Menü auf „Blocks“ geht und anschließend auf „Remove Branch“ klickt. Tut das gleiche mit den „bhkConvexTransformShapes die sich möglicherweise ebenfalls jetzt ganz unten befinden. Auch sie werden nicht mehr benötigt. Klickt jetzt oben im Nifskope-Menü auf „Spells“, fahrt mit der Maus runter bis „Sanitize“ und klickt auf „Reorder Blocks“.
      Abbildung
      Bild 23
      Sämtliche Blöcke werden jetzt in die richtige Reihenfolge gebracht was für ein funktionieren der Mesh essentiell wichtig ist. Wenn dieser Schritt nicht durchgeführt wird, wird Oblivion bzw. das CS, beim laden der Mesh abstürzen.
      Diesen Schritt könnt Ihr auch automatisch beim Speichern durchführen lassen wenn Ihr im Nifskope-Menü unter „File“ ein Häkchen bei „Auto Sanitize before Save“ setzt. Seitdem in der letzten Version von Nifskope ein, für Oblivion relevanter, Bug behoben wurde kann man diese Funktion bedenkenlos aktivieren.

Damit seid Ihr fertig und könnt Eure Mesh abspeichern. Sie sollte jetzt funktionieren - auch Eure Schrittgeräusche.

Ein weiteres Problem ist die PackedNiTriStripsShape und zwar ausschließlich, zumindest meiner Erfahrung nach, bei begehbaren Flächen aus Holz. Dieses Problem ist allerdings höchst seltsam. Wenn Ihr nämlich einen Holzfußboden habt und Ihr erstellt eine Kollisionsmesh die alle Holzteile umfasst hören sich diese Holzteile genau wie Holz an. Wenn Ihr z. B. einen Pfeil hinein schießt bleibt der Pfeil stecken und es gibt einen dumpfen Ton. Wenn Ihr dagegen schlagt hört es sich wie Holz an. Wenn Ihr dagegen darüber lauft hören sich Eure Schrittgeräusche an als wenn Ihr auf Stein lauft. Sehr, sehr seltsam. Bei begehbaren Flächen aus Stein tritt dieser seltsame Effekt übrigens nicht auf. Hier hören sich Schrittgeräusche auch nach wie vor wie Stein an. Und bevor jemand irgend etwas anderes denkt, nein, dieser Effekt trat nicht nur bei mir auf und deshalb konnte ich auch, nach ungefähr einem halben Tag der Internet-Recherche eine Lösung finden. Verzichtet einfach, bei begehbaren Flächen aus Holz, auf eine PackedNiTriStripsShape und nehmt stattdessen einfache Kollisionsboxen. Geht dazu folgendermaßen vor.

  1. Erstellt zuerst, wie gehabt, die Kollisionsmeshes für die einzelnen Materialien. Achtet aber darauf dass Ihr bei der Kollisionsmesh für Holz die begehbaren Flächen, also Fußböden und Treppenstufen, ausschließt.
  2. Exportiert alles erst einmal und baut, mit Hilfe von Nifskope, Eure Kollisionsmeshes in Eure Mesh ein.
  3. Speichert die Mesh ab und importiert sie wieder in Blender
  4. Erstellt jetzt für jeden Fußboden und für jede Treppenstufe eine einfache, würfelförmige Kollisionsbox. Achtet dabei aber auf eventuelle Öffnungen für Treppen. Diese dürft Ihr natürlich nicht verschließen. Eventuell müsst Ihr mehrere Kollisionsboxen für einen Fußboden erstellen und diese aneinander legen.
  5. Selektiert jetzt alles und exportiert es wieder. Achtet dabei darauf dass die Schaltfläche „Use bhkListShape“ deaktiviert ist. Um Arbeit zu ersparen könnt Ihr schon beim Export als Material Holz auswählen. Der Exporter sollte jetzt Eure PackedNiTriStripsShape unterhalb der 0-NiNode einfügen und für jede der weitere Kollisionsboxen eine neue NiNode erstellen
  6. Ladet Eure Mesh in Nifskope und führt die letzten Korrekturen durch: Entfernung der Mopp, eventuelle Korrekturen der Materialien, zurücksetzen auf 0 der Werte bei Mass und Inertia.

Wenn Ihr damit fertig seid sollte alles korrekt funktionieren. Auf den zwei folgenden Bildern könnt Ihr sehen wie so etwas dann aussieht.

Abbildung
Bild 24

Das Interior auf Bild 24 besteht aus Erdgeschoss und oberer Etage. Somit gibt es auch eine Holztreppe mit insgesamt 9 Treppenstufen. Die beiden Böden sind auch aus Holz. Damit man alles ein wenig besser sieht habe ich die Kollisionsboxen für die begehbaren Flächen ein wenig blau gefärbt.

Auf Bild 25 habe ich dann noch mal die Baumstruktur mit der Auflistung aller Kollisionsboxen abgebildet.

Abbildung
Bild 25

1) Hier oben, direkt unterhalb der 0-Ninode, befinden sich die beiden PackedNiTriStripsShape. Eine für alle Steinteile und eine für alle Holzteile außer den begehbaren Flächen.
2) Unterhalb einer übergeordneten NiNode, der NiNode Nr. 110, die Kollisionsboxen für den unteren und oberen Boden. Der obere Boden besteht aus drei Kollisionsboxen damit das Loch für die Treppe frei bleibt. Also noch einmal 4 Kollisionsboxen. Im Gegensatz zu normalen Meshes lassen sich Kollisionsboxen nicht vereinen. Hätte Ich die drei Kollisionsboxen für den oberen Boden vereinigt hätten sie eine einzige würfelförmige Kollisionsbox gebildet und den Durchgang für die Treppe wieder unpassierbar gemacht.
3) Und ganz unten nun 9 weitere Kollisionsboxen für die Treppe - für jede Treppenstufe eine.

Ganz schön viel nicht wahr? Und deswegen noch ein kleiner Zusatz. Natürlich geht das ganze ein wenig auf die Performance. Ich fand allerdings das sich das ganze durchaus im akzeptablen Bereich befand. Ihr müsst es einfach mal ausprobieren. Wenn Ihr allerdings, sich natürlich anhörende, begehbare Flächen aus Holz haben wollt geht es nicht anders - zumindest im Moment. Oder Ihr nehmt einfach begehbare Flächen aus Stein. Da ist dieser Aufwand nicht notwendig. Denn seltsamerweise hören sich begehbare Flächen aus Stein auch mit einer PackedNiTriStripsShape wie Stein und nicht wie Holz an.

Damit hätten wir auch das Ende dieses Tutorials erreicht. Wenn mir noch etwas einfällt oder ich neue Erkenntnisse gewinne werde ich das Tutorial aktualisieren und wenn Ihr irgend etwas nicht ganz verstanden habt ein Geheimtipp - es gibt hier auch ein Forum.



Externer Link
Valid XHTML 1.0 Transitional CSS ist valide! Alfacounter