Kollisionsbox bei NIF-Datei entfernen

Teridan

Mr. Morrowind 2007
Hallo an alle!

Ich habe eine Frage zu einem Nifskope und einem Morrowind-Nif und hoffe, dass ich hier richtig bin.

Ich möchte gerne aus einem bestehenden Morrowind-Nif die Kollisionsbox entfernen. Geht das mit Nifskope und wenn ja, wie? Falls es nicht geht, funktioniert es sicher mit Blender. Oder gibt es noch eine andere Möglichkeit? Ich stelle mir das ganze sehr einfach vor, einfach das "Feature Kollisionsbox" deaktivieren und fertig. Wahrscheinlich liege ich da gründlich falsch... :D

Bitte klärt mich auf. Danke.
 
Das was Du entfernen möchtest ist wahrscheinlich das, was an der RootCollisionNode hängt (Kollisions-Shapes) bzw. den Verweis der Haupt-NiNode des NIFs auf sich selbst (Block-Nummer) als Child damit es inGame zu keiner Kollision mit dem Mesh kommt.

Es gibt zwei Arten von Kollisionen bei MW-Nifs, einmal die mit RootCollisionNode, am häufigsten benutzte, wobei die Kollision mit einer vereinfachten (im Spiel unsichtbaren) Darstellung des Meshes stattfindet. Und es gibt die Kollision ohne RootCollisionNode, wobei die Kollision mit allen sichtbaren Flächen aus Richtung der Fläche stattfindet.
An einer RootCollisionNode hängen ein oder mehrere Shapes (Form, Gestalt) die meistens ein vereinfachtes Modell darstellen.
Lies dazu vieleicht auch in diesem Thread (mein Post vom 05.01.2013 19:39 + folgenden)

Es ist aber leider nicht ganz so einfach die Kollision aus dem Mesh zu entfernen - es gibt einige umständliche Work-Arounds, ich beschreib mal ein paar Wege:

Ein sicherer Weg, setzt eine RootCollisionNode vorraus:
(Enable "Render Hidden" im NifSkope um diese Shapes zu sehen!)

-lade Dein zu änderndes Mesh in NifSkope und gehe zum NiTriShapeData-Block, der unter dem ersten NiTriShape an der RootCollisionNode hängt
- suche die Zeile NumTriangles und ändere den Wert dort in "1"
- trage darunter bei NumTrianglePoints 3 ein
- öffne Triangles indem Du davor auf + klickst und ändere die erste Zeile die nun lauten soll:
"Triangles Triangle 0 0 0", somit benutzt unser erstes und einziges Dreieck 3 mal Eckpunkt 0 (also den ersten)
- markiere nacheinander NumTriangles, NumTrianglePoints und Triangles, rechtsklicke und wähle "Array\Update" um die neuen Werte zu übernehmen
-setze den Radius des NiTriShapeData-Blockes auf 0.0
-setze Center auch auf 0.0, 0.0, 0.0
-öffne Vertices indem Du auf das davorstehende "+" klickst und trage beim ersten Vertex z.B. die Koordinaten
"-1000000.0, -1000000.0, -1000000.0" ein, somit liegt der einzig kollidierende Eckpunkt so weit weg vom Mesh das man ihm im Normalfall nie "begegnet"
-öffne Normals indem Du auf "+" klickst und setze dort 0.0, 0.0, 0.0 für den ersten Eckpunkt ein
(somit gibts keine Richtung in die die abweisende Fläche zeigt und man wird nicht zurückgehalten falls man den einen Punkt doch irgendwie trifft)
- markiere NiTriShape über dem NiTriShapeData-Block, rechtsklick darauf und wähle
"Mesh\Remove Unused Vertices" woraufhin alle Vertizen bis auf Nummer 0 entfernt werden
-hängen mehrere NiTriShape-Blöcke an der RootCollisionNode dann rechtsklick nacheinander auf die überflüssigen NiTriShape-Blöcke und "Block\Remove Branch" wählen- dabei am Besten von unten nach oben vorgehen.
Stelle sicher das die zu löschenden Blocks mit dem Highlight markiert sind, sonst löschst Du womöglich versehentlich was Falsches!
-hast Du Blocks entfernt klicke einmal am Menu "Spells\Sanitize\Check Links" damit die Block-Nummern aktualisiert werden und der NiFooter (ganz unten) wieder die richtige Nummer trägt.
-speichere Nif-Mesh
-fertig. Das Kollisions-Shape wurde durch einen einzelnen Punkt ohne Abprall-Richtung ersetzt. Das Mesh hat zwar noch Kollision aber die ist so unwahrscheinlich wie Dagoth Ur dem Tribunals-Tempel beitreten wird.


Der unsichere/schnelle Weg (mit RootCollisionNode im Ursprungs-Nif):
- lade das Nif in NifSkope,
- prüfe an der Haupt-NiNode ob unter Children ein Verweis auf die RootCollisionNode besteht und merke die Anzahl (NumChildren). Regulär ist das erste Child bei solchen Nifs ein leerer Verweis und das letzte verweist auf die RootCollisionNode. Ist es hier anders dann musst Du einen anderen Weg wählen.
- markiere nun RootCollisionNode selbst (die an der NiNode hängt - nicht den Verweis in der Children-Liste!)
- rechtsklick auf RootCollisionNode, wähle "Block\Remove Branch" um den kompletten Zweig mit allem was daran hängt zu löschen.
- klicke nun einmal am Menu "Spells\Sanitize\Check Links"
- gehe wieder zur obersten NiNode, bei "Children"
- übertrage die Daten (BlockNummer) des zweiten Childs in die (leere) Zeile darüber, danach setze den Wert aus Zeile 3 in Zeile 2 usw. am Ende hast Du ein oder zwei für uns nutzlose Childrenverweise ganz unten drunter stehen. Hängt von der NifSkope-Version ab- ältere Versionen entfernen Children-Verweise wenn der Block entfernt wurde- deshalb solltest Du eben vorher prüfen und merken)
- nun ändere NumChildren in ursprünglich gemerkte NumChildren -2
- markiere Children, rechtsklicke drauf, wähle "Array\Update" woraufhin die Liste auf die eingegebene Anzahl Elemente reduziert wird.
- klicke erneut einmal am Menu "Spells\Sanitize\Check Links"
- speichere Nif-Mesh
- fertig. Die Kollisions-Shapes wurden komplett entfernt.
Funktioniert aber nicht immer! Manchmal stürzt das CS beim Laden solcher Nifs ab - keine Ahnung wieso. Wenn's aber im CS lädt, funktioniert es auch inGame einwandfrei.


Ein anderer, aber sehr umständlicher, immer funktionierender Weg:
Auf diese Art gehen eventuelle Vertex-Colors verloren!
Deswegen vorher mal bei NiTriShapeData schauen ob bei Has Vertex Colors ein Wert ungleich 0 steht, das hiesse JA. Bei neueren NifSkope-Versionen steht da direkt Yes/No. Deine Entscheidung ob Du auf die Vertex-Farben verzichten willst/kannst.

Zunächst benötigst Du ein Original-Mesh welches keine Kollision hat. Das sollte mindestens genau so viele NiTriShape(+Data)-Blöcke und NiTexturingProperties bzw. NiSourceTexture-Einträge haben wie das Mesh welches Du letztendlich benutzt. Am Besten natürlich gleich viele. Fleissaufgabe ein passendes zu finden... Wenn es keins gibt, siehe Abhilfe ganz unten!
Sobald Du eins hast was als "Container" für die gewünschten Dreiecks-Listen herhalten könnte dann kannst Du beginnen:
Zunächst lade das Mesh welches die unerwünschte Kollision hat, rechtsklicke im Nifskope auf jeden NiTriShapeData-Block - nachdem Du ihn zuvor mit Linksklick markiert (ge-highlighted) hast- und wähle
"Export Obj" - speichere auf diese Weise alle Dreiecks-Listen einzeln.
Notiere NiSourceTexture der dazugehörigen NiTexturingProperty sowie Center und Radius bei NiTriShapeData und evtl. Translation und Rotation (if != 0 )beim NiTriShape an dem die Data hängt zu jedem Shape.
Danach lade das Mesh welches keine Kollisionsinformationen enthält, rechtsklicke auf jeden NiTriShapeData-Block -nachdem Du ihn zuvor mit Linksklick markiert hast- und importiere die einzelnen Shapes mit "Import Obj".
Am Ende musst Du noch die passenden Texturen (NiSourceTexture) einsetzen. Wenn es hierbei Probleme gibt weil Texturen auf falschen Shapes landen musst Du evtl. die entsprechende Blocknummer des passenden NiSourceTexture-Blocks bei der NiTexturingProperty eintragen. Dazu bei NiTexturingProperty\BaseTexture\Source die Nummer des gewünschten NiSourceTexture-Blocks einsetzen.
Ausserdem kann es sein das Du wie gesagt Translation-Werte (Versatz) oder Rotation vom Original abkucken musst. Schau also ob die einzelnen ursprünglichen Shapes andere Werte als 0.0, 0.0, 0.0 für Translation/Rotation haben (bei NiTriShape) damit Dein Ergebnis-Mesh richtig zusammengebaut wird.
- hat das Mesh nun noch übrige Blocks dann musst Du diese entfernen und die Anzahl der Children in der ersten NiNode richtig stellen, siehe oben wie.
-beim OBJ-Im/Export gibt es wieder Unterschiede zwischen den verschiedenen NifSkope-Versionen: Stelle sicher das notierter Radius und Center ordnungsgemäß übernommen wurden
-fertig. Die einzelnen Shape-Daten (Dreiecks-Listen) wurden in ein anderes kollisionsfreies Mesh eingebettet.

Du findest kein passendes Mesh? Theoretisch kannst Du auch alle NiTriShapeData-Blöcke exportieren und alle einzeln in ein kollisionsfreies Mesh mit nur einem Shape importieren. Also aus einem Ursprungsmesh mit 10 Shapes 10 Einzel-Meshes mit je 1 Shape machen, oder aus einem mit 12 Shapes 3 Meshes à 4 Shapes etc. und dann im CS aus den einzelnen Meshes das Gesamtwerk zusammenstellen.
Bei Einzel-Shape-Meshes wären Translation/Rotation dann übrigens total wurstegal da man diese ja im CS bestimmen kann

Weg für NIF ohne RootCollisionNode
:
Nicht animierte Meshes die keine RootCollisionNode besitzen aber trotzdem Kollision haben sollen, haben statt dem Verweis auf die RootCollisionNode einen Zeiger auf sich selbst (BlockNummer der NiNode) als Kollision (letztes Child). Im Idealfall kann man die Kollision also auch einfach abschalten indem man die Children an der Haupt-NiNode entsprechend manipuliert. Ich will jetzt auch nichts durcheinander bringen: Am Besten schau mal ein paar Nifs deren Kollisionsverhalten Du kennst an und prüfe wie das mit den Children an der Parent-NiNode gehandhabt wird. Richte dein Augenmerk auf die leeren Verweise in der ersten Zeile, hier ist irgendwo der Schlüssel.
Ist schon zu lange her als das ich alles noch haarklein wüsste ;)

Edit:
Eins weiss ich noch -
Ohne RootCollisionNode aber mit Kollision sind meistens Meshes die aus nur EINEM simplen Shape bestehen, z.B. terrain_bc_rock_18
mit vielen Shapes und einem Kollisions-Shape sind meist "alte" MW-Exterior-Bauten und viele Interiors
mit vielen Shapes und vielen Kollisions-Shapes sind BM-Objekte von innen wie aussen
sämtliche Meshes die keine Face-Normals verwenden (also "weichgezeichnet" sind) und Kollisionen haben verwenden eine RootCollisionNode
kollisionsfrei sind Bodyparts, Weapons & misc-Items. Wobei von den Bodyparts sich nur solche als Container eignen die keine Animationen besitzen
selten - ganz selten gibt es Nifs die nicht mal eine NiNode haben und nur aus einem Shape bestehen. Hier gehts nur per Ex+Import der Daten
Weg 3 erlaubt es übrigens auch Shapes aus anderen Nifs (z.B. von Oblivion, Civilization, Freedom Force oder Fallout 3) in MW einzubauen. Dazu braucht man aber ein "Container-Nif" ohne RootCollisionNode.
 
Zuletzt bearbeitet:
Puh, danke für diese umfangreichen Hinweise.

Die erste und die zweite Möglichkeit gehen schon mal nicht, da keine RootCollisionNode vorhanden ist. Ich versuche es jetzt mich deinem dritten Tipp, habe mir dazu ein Mesh ohne Kollisionsabfrage gesucht und gleich gehts los.

Ich habe es ja befürchtet. Ich stelle mir so etwas immer sehr einfach vor, aber naja, ich werde mich schon durchkämpfen. Dickes Danke bis dahin.
 
Render->Show Hidden (macht die Kollisionsbox sichtbar)

Rechtsklick auf die Box oder den Eintrag Block->remove

Werde mir das aber mal in Ruhe durchlesen, wenn ich nicht mehr so verkatert bin. :D


TheDaywalker;)
 
Zuletzt bearbeitet:
Render Hidden steht bereits oben beschrieben.

Der-die -das Node?
Ich sag seltsamerweise immer: "die" RootCollisionNode - was ein Knoten (Node) ist an dem ein paar Dinge herabhängen und keine Kiste (Box) gegen die man rennt - zu entfernen wird in Weg 2 beschrieben - es reicht nicht aus das einfach wegzuschneiden, man muss auch die Eigenschaften des Meshes entsprechend ändern bzw. die Blocknummern neu verteilen damit die Blocks die nach dem inzwischen gelöschten Block standen nun kleinere Nummern kriegen.

Teridans Mesh hat keine RootCollisionNode - siehe Post - daher kann er sie nicht anklicken und entfernen...

Entweder packt er also die Dreieckslisten die dem Mesh Gestalt verleihen in andere Meshes ohne Kollision oder er findet heraus wie die Children-Einstellungen die Kollision bestimmen und hat somit seinen gewünschten simplen Schalter. So schwer ist es nicht zu begreifen, man muss sich nur 3 oder 4 Meshes mit verschiedenen Kollisionen bzw. ohne Kollision ansehen und etwas überlegen um die Regel zu verstehen (was kein grosser Aufwand ist da man ja sowieso gerade mit Meshes hantiert die verschiedene Kollisionsverhalten haben kann man da grad mal kurz nachkucken) wie gesagt- es ist zu lange her und ich erinnere mich nicht mehr genau wie das war und will es hier nicht falsch beschreiben.

Noch ein Tool-Tipp zum obj-Im/Export:

Um sich "Skelette"/"Container" für Meshes (mit und ohne RootCollisionNode) und beliebig vielen NiTriShapes + Texturen zu erstellen in die man OBJ-Dateien einsetzen kann vorzubereiten kann man den 3dMaler nehmen. (hierzu reicht auch die Maus-Steuerung):

Man erstelle zunächst soviele Gruppen (klick oben "Gruppen", wähle "Neue erstellen") wie man Shapes braucht, weise jeder Gruppe eine eigene, beliebige Test-Textur zu die man nachher einfach auswechseln kann und stelle evtl. ein Material ein wenn das voreingestellte Basismaterial nicht gefällt. Materialfarben lassen sich nachher auch mit NifSkope noch ändern.
Beim Erstellen einer neuen Gruppe bekommt diese übrigens zunächst die gleichen Eigenschaften (Textur, Material) wie die gerade am Gruppenfenster eingestellte - bereits existierende Gruppe.

Dann zeichnet man in jeder Gruppe irgendein Dreieck.
Im Bild Mausrad 2 * drücken - beim ersten Druck erscheint das "Eingabefenster" beim zweiten Druck werden die Koordinaten der ersten Ecke eingegeben - linke Maustaste halten + Maus bewegen, Mausrad drücken, weiter bewegen, Mausrad drücken, "OK, Nächstes" am Eingabefenster anklicken, Dreieck fertig, nächste Gruppe ganz links am Eingabefenster (über und unter dem Gruppennamen klicken) auswählen, auch damit ein Dreieck zeichnen- egal wie- wird ja nachher ersetzt.
Will man eine RootCollisionNode mit einem Kollisionshape verwenden zeichnet man auch ein Dreieck in Gruppe "ungruppiert", soll es mehr als ein Kollisionshape geben muss man dazu zusätzliche Gruppen ohne Textur erstellen, (man kann auch einfach auf den Gruppennamen am Eingabefenster klicken um das entsprechende Fenster aufzurufen) die zusätzlichen Kollisionsgruppen vieleicht anders nennen damit man weiss welche Art Gruppe man später vor sich hat und in denen jeweils ein Dreieck zeichnen,
speichere das r3d-Bild, beende 3dMaler.
starte den r3dtoMW-Exporter (liegt dem Download bei) und mache aus den r3d-Bildern in 3 bis 5 Klicks ein entsprechendes MW-Mesh. (Wähle Datei, lege Name fest, stelle Kollisionsverhalten ein, erstelle Nif, speichern, fertig) In das "leere" Nif kann man mit NifSkope nun die gewünschte obj-Data importieren.

PS: Der 3dMaler speichert "zufällig" auch als obj - lädt die objs aber leider nicht. Damals hab ich für den 3dMaler von einem User einen neuen Rechner bekommen auf dem nun auch Oblivion lief- das musste ich natürlich erstmal spielen und hab das Weiterentwickeln vom 3dMaler auf Eis gelegt. Inzwischen ist's wohl tiefgefroren :lol:
 
Zuletzt bearbeitet:
Mein Mesh hat übrigens nur eine NiTriShape und eine Textur, da war es nicht so schwer ein entsprechendes Vanilla-Mesh zu finden. Der Obj-Export hat dann auch insofern funktioniert, dass das Mesh jetzt richtig aussieht, aber plötzlich eine Kollision hat. Dabei war es ein Seelenstein, also Misc. Das verstehe ich nicht.

Die Textur war auch nicht richtig angebracht und das habe ich nicht ganz hinbekommen. Dazu kommt noch, dass die Textur nicht mehr so transparent ist, wie sie war. Alle vorher durchsichtigen Stellen sind jetzt grün. Das hat was mit Alpha-Kanälen zu tun, richtig? Tut mir leid, ich kenne mich damit nicht besonders aus.

Ich versuche zunächst den umgekehrten Weg und will jetzt erstmal die Textur verändern. Ich habe nämlich ein ähnliches Mesh, welches keine Kollision hat, nur passte dafür die Textur des gewünschten Meshes nicht. Sollte das nicht funktionieren, werde ich es mit dem 3D-Maler probieren.
 
Beim Blender-Export wird natürlich wieder eine Kollision by triangles erzeugt. Um die wegzubekommen, mußt du auf das entsprechende mesh oder den Node rechtsklicken, block insert-> NiStringExtraData und dann in den Block Details für diese NiStringExtraData "NCO" eintragen (NonCollisionObject). Dann noch die Nummer der NiStringExtraData in den Block Details des entsprechenden Nodes eintippen.

Wenn das gesamte Teil keine Kollision haben soll, dann einfach gleiche Prozedur für den übergeordneten Node. Wenn kein übergeordneter Node da ist, dann einfach rechtsclick, Node->Attach Parent Node und in den Block Details dann die von ReneMiner beschriebene Prozedur. NumChildren anpassen, Update Array und die Zahl der Children eintippen.


Die Alpha ist nach dem Export auch weg, es sei den du stellst es in Blender gleich richtig ein. Einfacher in NifSkope, rechtsclick auf NiTriShapeData des Nodes der alpha haben soll, Node->Add Property->NiAlphaProperty.

VORSICHT: Die neuesten NifSkope Versionen scheinen dieses feature nicht mehr oder noch nicht wieder zu haben. Würde mir ein älteres build besorgen.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Teridan
Oder importiere Deine obj-Datei in ein flora_bc_moss oder furn_web: das hat ein Shape, keine Kollision und einen Alpha-Kanal. Es gibt da wieder mehrere Arten von Transparenz: einmal wirds von der Textur gemacht (dds oder tga) dann kann das Material ebenfalls Farben mit Alpha-Kanal haben und es gibt noch die NiAlphaProperty-Methode (hiess das so?)

Du musst wegen der Farben beim Original die Werte bei NiMaterialProperty - ambient, diffuse, emissive, specular (r,g,b) und power oder spec exponent übernehmen - also notieren und im Container-Mesh einsetzen.
Das von NifSkope exportierte Obj enthält wirklich nur die Dreiecks-Liste und hat weder Textur noch Farbe und auch kein Material
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Teridan
Ich habe mich in Gimp reingefuchst (hatte da auch so meine Probleme) und es hinbekommen, die Textur inklusive Tranzparenz richtig zu schneiden. Jetzt erkennt mein Ersatzmesh ohne Kollision alles korrekt an und es läuft gut.

Die Prozedur war so viel komplizierter, wie ich es mir vorgestellt habe. Aber jetzt weiß ich einiges mehr über Meshes im Allgemeinen und Nifskope im Besonderen. Allein dafür hat es sich schon gelohnt. ;)

TheDaywalker und Rene, ich danke euch beiden für eure Hilfe. Insbesondere die ausführlichen Anleitungen von dir, Rene, waren hilfreich.