ImageInformation(byte[] data) & ModelInformation(byte[] data)

  • Hi @red51 und alle Craks,


    Ich versuche mich gerade darin, z.b. Models und Texturen aus einem Zip-Arciv einzulesen.


    Mit dem ZIP komme ich soweit zurecht und habe jetzt auch ein InputStream der Daten. Nun komme ich über BufferedInputStream an die rowDaten BufferedInputStream.read(buffer) ran. Oder über DataInputStream(BufferedInputStream).readLine() kann ich mir die Zeilen ausgeben.



    ?( sehe ich das richtig?


    Das ich ab hier bislang erst eine (Temp)Datei erstellen muss bevor ich die mit z.b.ModelInformation(java.io.File file) laden kann?

  • Also der sinnvollste Weg, dem Plugin Assets beizulegen, wäre, sie direkt in die .jar mit reinzupacken. Da die .jar bereits als Zip-Archiv fungiert, erhälst du damit bereits eine gute Komprimierung. Auf dem Wege könntest du die Assets bequem als Resource laden.


    Die Daten direkt als byte[], Buffer oder Stream zu übergeben ist ein wenig schwierig. Hier müsste trotzdem manuell angegeben werden, um welches Dateiformat es sich bei dem Asset handelt. Gibt es einen bestimmten Grund, die Assets als separate Zip auszuliefern anstatt sie in die .jar mit reinzupacken?^^

  • Moin,


    Ja der Gedanke war, für einen 3D-Model Loader, um Models mit mehreren *.obj und Texturen zusammen zu halten.


    Also diese Archive sollen austauschbar bleiben.
    Ich kann da auch ein Assets Ordner anlegen.
    Ich kam bei meinem Fahrstuhl Projekt auf über 60 Teile (inkl. einzelne Knöpfe und so), in einem Archive finde ich es übersichtlicher und Fehler resistenter.


    ^^
    ist der Ansatz sinvoll?


    um welches Dateiformat es sich bei dem Asset handelt

    Per Endung wie (*.dds) oder Komplizierter?
    Die Daten haben doch noch den Shebang/head (Datentype in der ersten Zeile {z.b. \u0048PNG}), geht da nicht was?

  • Ja der Gedanke war, für einen 3D-Model Loader, um Models mit mehreren *.obj und Texturen zusammen zu halten.

    Der Grundgedanke ist auf jeden Fall nicht schlecht :thumbup:


    Ich kam bei meinem Fahrstuhl Projekt auf über 60 Teile (inkl. einzelne Knöpfe und so), in einem Archive finde ich es übersichtlicher und Fehler resistenter.

    Dem stimme ich zu, allerdings muss ich dazu sagen, dass viele kleine Modelle aus Performancesicht problematisch sein können. Die einzelnen Modelle können vom Spiel nicht zusammengefasst und müssen daher einzeln gerendert werden (oder anders gesagt, jedes einzelne Modell verursacht mind. einen zusätzlichen "draw call"). Aus Performancesicht ist es also wesentlich performanter, wenn die 60 Modelle zu einem einzelnen oder zumindest zu so wenig Modellen wie möglich zusammengefasst sind ;)


    Die Daten haben doch noch den Shebang/head (Datentype in der ersten Zeile {z.b. \u0048PNG}), geht da nicht was?

    Das funktioniert zwar grundsätzlich, insbesondere bei Bilddateien, allerdings trifft das nicht zuverlässig auf alle Dateiformate zu. Besonders bei Modell-Formaten wird die Sache komplizierter, hier fehlen die Signaturen entweder ganz, oder es gibt keine Dokumentation darüber (was die Sache erschwert, da die "magic bytes" bei den meisten Signaturen unterschiedlich sind) :/

  • Danke.

    allerdings muss ich dazu sagen, dass viele kleine Modelle aus Performancesicht problematisch sein können

    Dazu habe ich mal eine Technische Frage in Bezug auf Blender.


    Gibt es für RW einen Unterschie,


    ob ich ein Objekt erstelle, indem ich mehrere Mashs Joine
    oder wenn ich diese zu einem Mash mit der Boolean Methode Backe?


    :| Boolean ist da Ziemlich aufwendig, bei 60 Teilen.

  • Ich kann dir leider nicht viel zu Blender sagen, da ich i.d.R. nicht damit arbeite... aber "Boolean Modifiers" dienen in Modellprogrammen üblicherweise dazu, zwei Objekte auf spezielle Weise miteinander zu verbinden, zB Objekt A von B abzuziehen oder nur die Differenz zw. A und B beizubehalten etc. Das ist in dem Fall nicht ganz das, was wir brauchen. Stattdessen ist es wichtig, alle Meshes auf ein einzelnes Mesh (oder möglichst wenige Meshes) zu reduzieren. Die Folge ist aber auch, dass alle kombinierten Meshes ein und dieselbe Textur verwenden (müssen). Das ist meistens der schwierige Teil, da das Batchen der Meshes in den meisten Programmen nur wenige Mausklicks bedarf, während das Zusammenführen aller Materials zu einem einzelnen Material bzw. zu einer einzigen Textur Handarbeit erfordert (du musst also die UV-Maps der einzelnen Modelle in eine einzige UV-Map unterbringen).


    Kurz gesagt: Im Idealfall besteht der Aufzug statt aus 60 Teilen/Objekten/Meshes nur aus einem einzigen Objekt/Mesh und verwendet nur ein einziges Material bzw. Textur - auf dieser Textur sind alle Teile des Aufzugs untergebracht, also die Kabine, die Lampen, die Knöpfe etc. Realistischer wären es wohl eher 2-4 Modelle, da die Knöpfe bzw. das Panel ein separates Modell sein würde (damit der Spieler damit interagieren kann) und i.d.R. wäre auch die Tür ein oder zwei separate Modelle (da sie sich ja unabhängig von der Kabine bewegen können muss) ;)

  • OKe,


    Das mit der Textur in einem File ist kein Problem für mich, dauert nur ein bischen.


    vieleicht ein anderes Beispiel:
    Ein eigenen Baum(5-Eck Kegel) mit ca. 500 einfachen Ästen(Klingen mit 12 Flächen).
    Soweit ich das jetzt verstanden habe, sollten am besten die Äste mit den Stamm Boolisch hinzugefügt werden (damit es nur einen Mash gibt und auch überstehende/lapende Mashs nicht entstehen). UV-Masp anpassen.

  • Soweit ich das jetzt verstanden habe, sollten am besten die Äste mit den Stamm Boolisch hinzugefügt werden (damit es nur einen Mash gibt und auch überstehende/lapende Mashs nicht entstehen). UV-Masp anpassen.

    Überstehende oder überlappende Meshes sind absolut kein Problem. Wenn du die Meshes mit einem "Boolean Modifier" kombinierst, werden meist die sich überlappenden Polygone entfernt. Als Resultat entstehen in den meisten Fällen mehr Polygone, je nach Komplexität des Modells sogar deutlich mehr, was unnötig zu Lasten der Performance geht (je mehr Polygone/Dreiecke, desto schlechter die Performance, wobei allerdings mehr "draw calls" [also mehrere Meshes statt nur eines] noch "teurer" sind als viele Polygone).


    Es ist lediglich wichtig, mehrere Objekte zu einem einzigen Objekt bzw. Mesh zusammenzureduzieren. In Modellprogrammen genügen dafür meist wenige Mausklicks oder es gibt ein Tastenkürzel. Wie gesagt, ich benutze Blender leider nicht, aber lt. Google scheint dies bei Blender STRG + J zu sein (also erst alle Objekte markieren, dann mit STRG + J zusammenfügen).


    Wobei wenn du die Modelle als .obj exportierst, werden alle Objekte i.d.R. bereits vom Spiel zu einem Mesh zusammengefügt. Hier gilt dann die Regel "1 OBJ Datei == 1 Mesh", d.h. je mehr OBJ Dateien, desto mehr Meshes, desto mehr draw calls ;)

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!