Angepinnt Modding Objekte, Verkehrswege und andere Props

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Hab mich mal mit den Alphas der DDS-Texturen (vor allem bei der _n.dds) bei GIMP auseinander gesetzt. Diese werden unter anderem gebraucht, wenn Teile eines Gebäudes farblich anders abgesetzt sein sollen (Aussenfassade), aber andere Teile nicht eingefärbt werden sollen (Türen, Fenster)
      Da funktioniert es so:
      • Reiter Ebene anklicken und dann im Auswahlmenü Maske > Ebenenmaske hinzufügen...
      • Im neuen Fenster Ebenenmaske initialisieren den Punkt Schwarz (volle Transparenz) anwählen und hinzufügen
      • Nun gibt es im Ebenenreiter neben der bläulichen Textur noch eine schwarze. Auf dem Bearbeitungsfenster ist die Textur verschwunden.
      • Wenn man die ursprüngliche Textur wiedersehen will, muß man beim Reiter Ebene wieder Maske > Ebenenmaske deaktivieren klicken.
      • Will man die Alpha in Rohformat sehen, dann bei Reiter Ebene > Maske > Ebenenmaske anzeigen
      • Um sie zu bearbeiten, schliesslich ....> Ebenenmaske bearbeiten. Jetzt lassen sich schwarze Teilflächen entfernen. Diese freien Stellen in der Alpha generieren später mal die Color.bmp
      • Vor dem Speichern unbedingt ....> Ebenenmaske anwenden
      • Nun ist auf dem Bearbeitungsbildschirm nur noch der Teil der ursprünglichen Textur zu sehen, welcher vorher von der Alpha nicht mehr überdeckt wurde. Der Rest ist aber für das Spiel immer noch vorhanden.
      • Nun im DXT3-Format abspeichern, Mipmaps generieren nicht vergessen.
      Meine Workshop-Schmiede auf STEAM

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von ArkenbergeJoe () aus folgendem Grund: Tutorial hierher verschoben

    • Bevor es in Vergessenheit gerät:
      Da ich mich heute mit den Raucheffekten auseinander gesetzt habe, will ich meine Erkenntnisse nicht geheim halten.
      Die Anweisungen und ihre Bedeutung
      with ($effects[$i] = new_particleEmitter(this)) {
      .direction = vector(0.0, 1.0, 0.0);
      .minParticleSpeed = 12.0; //Säule wird höher
      .maxParticleSpeed = 35.0; //Rauch wird schneller
      .minParticleAngle = 0.0; //geschlossene Rauchsäule
      .maxParticleAngle = 0.85; //verteilt den Qualm
      .minParticleLife = 1.0; //?
      .maxParticleLife = 8.0; //?
      .maxDistance = 750.0; //Entfernung der Sichtbarkeit am Bildschirm
      .particleSize = 1.4; //Ausdehnung des Rauchs
      .setParticleScale(0.6, 0.0, 8.0); //Zerfleddert den Rauch in allen Richtungen
      .particleAirResist = 2.0; //Rauch verteilt sich nicht so
      .gravitation = vector(0.0, 0.2, 0.0); //Zerfleddert den Rauch
      .density = 30.0; //Dichte des Qualms
      .addColorRange(0x50222222, 0x00222222); // Wert1=Beginn des Rauchs, Wert2=Ende dito, Stelle 1 und 2 Transparenz, 3 bis 6 Farbe
      .setTexture("effects/particles/lightsmoke.dds");
      .sortParticles = true;
      .autoemit = true;
      .visible = true;
      Meine Workshop-Schmiede auf STEAM
    • Tutorial: Diagonale Grundstücke erstellen

      @TheGagaPrestige: Ja, ich hab es aber nicht weiter probiert, die wichtigen Parameter habe ich ja aufgeführt.

      Nun zu den Diagonalen. Da ich gerade selber dabei bin, mich damit auseinander zu setzen.
      Da gibts nämlich einiges zu beachten, erstens, dass die Sockel nicht ineinander überkreuzen bzw das Haus zu groß oder zu klein wird.
      Grundsätzlich gibt es zuerst in der Hausb.script (im object-Ordner) 2 Anweisungsblöcke
      Anweisung 1
      this.width = 6;
      this.height = 7;
      this.length = 6;
      Hieraus ergibt sich ein Grundstück von (this.width; this length) 6x6 Feldern. Die Anweisung this.heigth ist dafür zuständig:

      Micha1982 schrieb:

      Zu der Height Angabe kann ich was erzählen. Also ein Objekt belegt halt Platz auf der Map. Auf dem Boden natürlich, aber auch in der Höhe. Die Seitenlänge eines Feldes entspricht dabei einer Höheneinheit. Bei Häusern ist das ziemlich unwichtig, aber bei stapelbaren Objekten wirds interessant. Macht man ein 1 Feld hohes Objekt und schreibt bei height 5 rein, so könnte man nur mit 4 Feldern Abstand in der Höhe das nächste oben drüber platzieren.

      Häuser stellt man ja selten übereinander, aber height definiert ganz einfach ab welcher Höhe das nächste Objekt oben drüber platziert werden kann.
      Rechteckige Häuser erfordern in der Diagonalen stets ein quadratisches Grundstück. Bei 45° Eckhäusern und anderen Objekten siehts freilich anders aus.
      Nun müssen die Ecken verschwinden. Um ein völlig diagonales Grundstück zu erhalten, gibt es dazu eine weitere Scriptzeile
      Anweisung 2
      this.diagonals = 0x2424;
      Hierbei wird linksoben 2 Felder tief diagonal geschnitten, und rechtsoben 4 Felder. Unten ists genau umgekehrt. Das sieht dann so aus:



      Grundsätzlich kann die Summe der Zahlen der 2. Anweisung niemals mehr ergeben als die Summe der 1. Anweisung (ohne height) Sonst siehts so aus!


      Die Sockelmauer wird laut eben genau so nach Anweisung ausgebildet. Dies kann u.U. hässliche Grafikfehler ergeben.
      Übrigens wäre das größtmögliche diagonale Grundstück dann 32 Felder groß (this.diagonals = ffff)

      Nun passt der Sockel, aber bekanntlich haben diagonale Strecken in orthogonalen Felder naturgemäß andere Abmessungen. Das würde eine Vielzahl von -b.objects erforden, was bei völliger Baugleichheit ja nicht erforderlich ist. Also skaliert das Spiel die Häuser selber passend, es muß nur wissen, um welchen Faktor. Dazu ist erst einmal in dem scrips-Ordner in der environment.script folgende Anweisung erforderlich:
      $BasePath = extractFilePath(extractFileDir(this.scriptFilename));
      $ObjectPath = $BasePath + "objects/";

      function loadBuilding($category, $name, $model, $w = 0, $l = 0, $targetW = 0, $targetL = 0)
      {
      if (file_exists($model+"b.object")) {
      MAIN.$grid.loadGridObject($name+"b", $model+"b.object");
      } else if ($w != 0 && $l != 0) {
      if ($targetW == 0) $targetW = int(float($w) / 1.414213562373095 + 0.5);
      if ($targetL == 0) $targetL = int(float($l) / 1.414213562373095 + 0.5);
      MAIN.$grid.loadGridObject($name+"b", $model+"b.object", $model+".object", $targetW * 1.414213562373095 / $w, $targetL * 1.414213562373095 / $l);
      }
      MAIN.$grid.loadGridObject($name, $model+".object");
      if (defined MAIN.$level.$buildings[$category]) {
      MAIN.$level.$buildings[$category][] = $name;
      } else {
      MAIN.$level.$buildings[$category] = [$name];
      }
      <Var. 1>
      loadBuilding("Mietshaus", "blockhs_AJ01", $ObjectPath+"blockhs_AJ01", 9, 9);
      loadBuilding("Mietshaus", "blockhs_AJ02", $ObjectPath+"blockhs_AJ02", 6, 6);
      <Var. 2>
      loadBuilding("AJ-Objects", "blockhs_AJ01", "addons/AJ_Objekte/Mietshaus/objects/blockhs_AJ01", 9, 9);
      loadBuilding("AJ-Objects", "blockhs_AJ02", "addons/AJ_Objekte/Mietshaus/objects/blockhs_AJ02", 6, 6);
      <Var. 3>
      loadBuilding("AJ-Objects", "blockhs_AJ01", "userdata/addons/AJ_Objekte/Mietshaus/objects/blockhs_AJ01", 9, 9);
      loadBuilding("AJ-Objects", "blockhs_AJ02", "userdata/addons/AJ_Objekte/Mietshaus/objects/blockhs_AJ02", 6, 6);


      Orange Anweisung wird nicht geschrieben, danach folgen nur die möglichen Varianten einer Anweisung, nur eine wird verwendet.
      <Var. 1> funktioniert sowohl im Spieleaddon- als auch im Benutzeraddonordner.
      <Var. 2> funktioniert mit erweiterter Unterordnerstruktur im Gameaddonordner.
      <Var. 3> -dito- nur im Benutzeraddonordner.

      Die grün hinterlegten Zeilen sind für die Tätigkeit der Skalierung notwendig, die blauen Zahlen ergeben den Skalierungsfaktor. Während die "grünen" Anweisungen für Buildings immer gleich bleiben, lassen sich die "blauen" Ziffern beliebig ändern.



      Hier ist noch Arbeit nötig!

      Übrigens:
      Folgende Anweisung ist nicht für diagonale Objekt anwendbar! Selbst wenn load.building-Zeile um die Skalierungsziffern erweitert wird, diese werden nicht erkannt.
      $grid = MAIN.$grid;
      $level = MAIN.$level;

      $level.loadBuilding("industry", "powerp_AJ1", "/userdata/addons/AJ_Powerplant/objects/powerp_AJ1");
      Wenn dann alles passt, sollte es so aussehen:



      An dieser Böschung lässt sich die Sockelausbildung und Gebäudepassung perfekt prüfen und testen, nur die CIManer haben so ein paar Probleme mit dem Verlassen ihrer Wohnhäuser.....
      Meine Workshop-Schmiede auf STEAM

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von ArkenbergeJoe () aus folgendem Grund: 2.Ergänzung

    • Hi Joe

      Deine Anleitungen und die damit verbundene Arbeit sind einfach nur absolute Spitze. :thumbsup: Dafür erst mal vielen Dank. Ich hoffe auch das dir der Spass nicht vergeht und du noch einige Objekte zusammen bauen wirst. Das ein oder andere kann man sicherlich noch zusätzlich beim Mappen gebrauchen. Jetzt die alles entscheidende Frage: Wo und wann kann man sich die neuen Gebäude downloaden? Bin schon ganz heiß drauf.

      Gruß Mengi12
    • Hi Joe,

      sorry das ich mich gestern nicht mehr gemeldet habe, aber trotzdem vielen Dank für Deine Info. Also gut ich werde geduldig warten und hoffen das Dir nichts dazwischen kommt. Bin gerade dabei eine neue Map zu erstellen und da wären natürlich die neuen Blockhäuser ein Genuß. Also viel Erfolg beim Modden und die nötige Zeit dafür.

      Gruß Mengi
    • Zu der Height Angabe kann ich was erzählen. Also ein Objekt belegt halt Platz auf der Map. Auf dem Boden natürlich, aber auch in der Höhe. Die Seitenlänge eines Feldes entspricht dabei einer Höheneinheit. Bei Häusern ist das ziemlich unwichtig, aber bei stapelbaren Objekten wirds interessant. Macht man ein 1 Feld hohes Objekt und schreibt bei height 5 rein, so könnte man nur mit 4 Feldern Abstand in der Höhe das nächste oben drüber platzieren.

      Häuser stellt man ja selten übereinander, aber height definiert ganz einfach ab welcher Höhe das nächste Objekt oben drüber platziert werden kann.
    • Bewegte Objekte

      So kurz vor Weihnachten fallen mir schon wieder ein paar neue Sachen ein, welche aber auch in Bewegung sein könnten. Nun hab ich aber folgendes Problem:
      Ein Objekt, welches bewegte Teile beinhaltet, besitzt innerhalb des Objektes weitere Anweisungen (Animationskoordinaten?), welche beim Konvertieren in ein blender.Objekt und nach deren Bearbeitung wieder zurück schlichtweg verloren gehen. Einzig und allein bei den Bäumen wird eine Gesamtanimation über das Gasamtobjekt gelegt. Meine Blenderpappeln bewegen sich genauso im (fiktiven) Wind wie die Original-CIM-Bäume. Allerdings ist es möglich, mehrere Objekte vom Spiel fertig zusammensetzen zu lassen. Somit könnte ich u. A. ein rotierendes Gesamtobjekt per Script auf ein anderes setzen. Ist sowas möglich, was hätte ich bei den Anweisungen zu beachten?

      Als Beispiel:
      Bei CIM besteht der Kran aus einem Objekt. Der obere Teil besitzt im Objekt eine Anweisung, die Effect-datei zu verarbeiten.
      Bei mir gedacht:
      Der Mast ist ein festsehendes Objekt; der Ausleger ist ein gesamt rotierendes Objekt. Hierbei sollte es auch ohne objektinterne Anweisung, so wie bei den Bäumen funktionieren. Auf jeden Fall funktioniert bei Zusammensetzungen die Bewegung bei einem Objekt. Das habe ich schon rausbekommen.
      Meine Workshop-Schmiede auf STEAM
    • Bäumen werden per Vertex Shader bewegt, sonst sind sie fest... Daher sind Bäume keine Grundlage...


      -edit-
      Der rotierende Vertex Shader könnte vielleicht durch die Vertex Color bestimmt werden, aber Wavefront kennt kein Vertex Color.
      Wenn jemand einen Vertex Color Patch für Blender import_obj, export_obj schreibt könnten wir das testen...

      (Das sind dann aber immer noch keine Animationen wie das Öffnen einer Tür)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von eis_os ()

    • Da ich nichts richtig dazu finde, aber hier sehr viel auch über die Texturen geschrieben wird eine Anmerkung zu den N-Maps. Es handelt sich hier nicht um eine bläuliche Textur wie geschrieben sondern das Ganze ist Vergleichbar mit einer art Bumpmap wie sie in 3D Programmen als Bitmap meist genutz wird.

      In Games wie Fallout, Oblivion oder Skyrim und bestimmt auch noch anderen werden damit die Erhebungen erzeugt.
      Normalerweise ist eine Textur immer Flach mit der n- Map werden dem Betrachter aber Erhebungen sueggeriert die gar nicht da sind.

      CIM nutz diese Möglichkeit zB bei den Zuggleisen, U-Bahngleisen, Clippengelände und dem Wasser.

      Ohne N-Map wären die alle Flach und nicht so schön.

      Hier mal ein paar schöne Darstellungen was mit n-Maps möglich ist und auch Erklärungen wie sie sich erstellen lassen

      Normal Mapping Tutorial: Part II - page 4: Tips for Editing Normal Maps


      Allerdings gelingt es mir auch bei den normalen DDS Texturen nicht so recht für CIM das richtige Format zu finden.

      DXT1 geht zwar ist aber sehr unscharf und ausserdem wirds pixelig und der Alphakanal ist hässlich.

      DXT3 geht auch, jedoch ist wie bei DX1 auch beim Rauszoomen eine seltsame Vermischung von Pixeln zu bemerken.

      DXT5 geht gar nicht. Da wird alles scharz.

      Die Midmaps erkennt CIM wohl nicht, jedenfalls wird dann auch bei DX1 und DX3 alles schwarz. Doch hier wird geschrieben, das man Midpaps generieren soll.
      Siehe Thread ganz oben.

      Soviel ich weiss braucht es aber Midmaps, sonst hat man ja beim Rauszoomen Texturfehler. Eventuell ist das ja die seltsame Vermisschung von Pixeln die ich da sehe. Zusehen in der Mod, die noch freigeschaltet werden muss.

      Wie ist bloss der Sky komprimiert. Da klappts mit keiner der drei Varianten. Der Sky ist immer Schwarz. Dabei ist die Textur so mies, das die unbedingt einer Bearbeitung bedarf.
      Grüße an alle

      ---------------

      Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von robinH ()

    • Mit gs_dump die Material Daten analysieren.
      In die mtl Dateien können für die AlphaBits und Co bestimmte Einstellungen verändert werden:

      gsflags
      map_Kd_alpha
      map_Ks_alpha
      map_bump_alpha

      Siehe dazu auch den Source Code...

      (Stimmen die Kanäle und Bits nicht, kann CIM1 die Daten nur schlecht oder nur falsch nutzen)

      -edit-
      Und erst die map_* nutzen und dann map_*_alpha sonst wird es nicht funktionieren

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von eis_os ()