Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi 3D-Spieledateien exportieren (https://www.delphipraxis.net/177045-3d-spieledateien-exportieren.html)

the3dcloser 12. Okt 2013 10:31

3D-Spieledateien exportieren
 
Hallo Community,

Ich bin gerade an einem Programm zum auslesen von 3D-Spieledateien dran, diese sollen anschließend in ein bekannteres Format (z.B. 3ds/OBJ/LWO/usw.) konvertiert werden.

Die Scheitelpunkte kann ich aus der Datei ohne Probleme auslesen, jedoch bekomme ich Probleme bei den Flächen.
Angeblich sind diese irgendwie "pre-computed" bei Spielen um das Laden zu beschleunigen. Jedoch komme ich mit dem Auslesen dieser Flächen nicht klar.

Kann mir dabei jemand Tipps o.ä geben, wie man dabei am besten Vorgeht?

Medium 12. Okt 2013 12:02

AW: 3D-Spieledateien exportieren
 
Wenn du ein paar Infos geben könntest, könnte man dir bestimmt helfen.

the3dcloser 12. Okt 2013 12:24

AW: 3D-Spieledateien exportieren
 
Dazu müsste ich auch wissen, welche Infos du gerne hättest.

Das hier ist der Code für einen Scheitelpunkt, neben den XYZW-Werten liegen hier auch noch ein paar andere Sachen drin:

A8C6C2F6B944000050C680FF8000343333C3DFDDDD423433B3 C3DFDD5D438C800000E7B691000000


Hier ist der erste Abschnitt der Datei, wo die Flächen anfangen müssen (der Dateiheader ist noch dabei):

00000001000200000002000300030002000400030004000500 05000600070005000400060007000800090007000600080009 0008000A0009000A000B000C000D000E000C000E000F001000 11001200100013001100140015001600140017001500180019 001A0018001A001B001B001C001D001B001A001C001D001C00 1E001D001E001F001F001E0020001F00200021002100200022 00210022002300230022002400230024002500250024002600 250026002700270028002900270026002800290028002A0029 002A002B002B002C002D002B002A002C002D002E002F002D00 2C002E002F00300031002F002E003000310032003300310030 00320033003200340033003400350035003600370035003400 3600370036003800370038003900390038003A0039003A003B 003B003A003C003B003C003D003D003C003E003D003E003F00 3F003E0040003F004000410041004000420041004200430043 00420044004300440045004500460047004500440046004700 4800490047004600480049004A004B00490048004A004B004C 004D004B004A004C004D004C004E004D004E004F004F005000 51004F004E0050005100500052005100520053005300540055 00530052005400550056005700550054005600570058005900 57005600580059005A005B00590058005A005B005A005C005B 005C005D0001005E005F0001005F0002006000610062006000 63006100630064006100640065006100640066006500660067 00650066006800670068006900670069006A0067006B006A00 69006B006C006A006C006D006A006C006E006D006E006F006D 006E0070006F00700071006F00710072006F00720073006F00 72007400730075007600770075007700780078007700790078 0079007A007B0078007A007B007A007C007D007B007C007D00 7C007E007F007D007E007F007E00800081007F00800082007F 008100820083007F0083007D007F00830084007D0084007B00 7D00840085007B00850078007B008500750078008100800086 00870081008600880081008700880082008100890088008700 890087008A008A0087008B00870086008B008A008B0069008C 008A0069008D008A008C008D0089008A008E008D008C008E00 8C008F008F008C0090008C00690090008F009000910092008F 00910093008F00920093008E008F0094009300920094009200 95009500920096009200910096009500960097009800950097 009900950098009900940095009A00990098009A0098009B00 9B0098009C00980097009C009B009C009D009E009B009D009F 009B009E009F009A009B00A0009F009E00A0009E00A100A100 9E00A2009E009D00A200A2009D00A300A3009D00A4009D00A5 00A4009D00A600A5009D009C00A600A700A800A900A700AA00 A800AB00AA00A700AB00AC00AA00AD00AC00AB00AD00AE00AC 00AF00AE00AD00AF00B000AE00B100B000AF00B100B200B000 B200B300B000B000B300B400B000B400AE00AE00B400B500AE 00B500AC00AC00B500B600AC00B600AA00AA00B600B700AA00 B700A800B600B800B700B600B900B800B500B900B600B400B9 00B500B400BA00B900B300BA00B400BB00BA00B300B200BB00 B300BC00BB00B200BD00BC00B200BE00BC00BD00BE00BF00BC 00BF00C000BC00BC00C000BB00C000BA00BB00C000C100BA00 C200C100C000C300C100C200C300C400C100C500C400C300C6 00C500C300C600C300C700C700C300C200C700C200BF00BF00 C200C000C800C700BF00C900C700C800C900C600C700CA00C6 00C900CA00CB00C600CB00C500C600CB00CC00C500CC00C400 C500CC00A400C400CD00A400CC00CE00CD00


Vielleicht ist es noch erwähnenswert, dass die Datei >400k Flächen besitzten muss, es handelt sich um ein Szenario.

Wenn das nicht die benötigten Informationen waren, einfach nochmal melden, danke.

PS: Ist es möglich, dass es hier keine Toggle-Funktion gibt?

hstreicher 12. Okt 2013 12:57

AW: 3D-Spieledateien exportieren
 
du willst die Daten in ein bekannteres Format exportieren , schön

wie wäre es wenn du uns verräts welches "nicht so bekannte" Format verwendet wird ,
welches Spiel, / Engine / PC oder irgendeine Spielekonsole

irgendwas ??

Medium 12. Okt 2013 13:30

AW: 3D-Spieledateien exportieren
 
Ähm, was meinst du können wir hier so aus einer Wand von Hex-Ziffern sehen? Wie wäre es mal mit einer Formatbeschreibung? Also so um überhaupt mal anfangen zu können? (Also etwas genauer als "ein paar andere Infos sind da auch noch drin"...) Und was sind Scheitelpunkte in diesem Zusammenhang? Die kenne ich nur von Parabeln. Flächen ergeben sich üblicherweise auch aus den Verbindungen der Vertices. Daher: Was sind für dich hier Flächen? Zudem: Was für Werte erwartest du, welche hast du statt dessen? Mit dem was du so bisher gebracht hast kann man einfach genau überhaupt nix anfangen.

Der schöne Günther 12. Okt 2013 15:56

AW: 3D-Spieledateien exportieren
 
Ich dachte, genau darum geht's: Er hat auch keine Beschreibung des Formats.

Aber wenn man wenigstens eine Dateiendung oder einen Produktnamen hätte, könnte man damit vielleicht etwas anfangen.

Aphton 12. Okt 2013 16:59

AW: 3D-Spieledateien exportieren
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1231865)
Aber wenn man wenigstens eine Dateiendung oder einen Produktnamen hätte, könnte man damit vielleicht etwas anfangen.

Vlt = da kommen auch nur dann jene in Frage, die auch Wissen über das Format haben. Der Rest, der helfen will, müsste selber sich über das Format schlau machen - und seien wir ehrlich.. wer würde das tun?

Am besten ists, wenn der Threadstarter alle nötigen Informationen liefert und dann versucht, das Problem gemeinsam zu lösen.

the3dcloser 12. Okt 2013 17:40

AW: 3D-Spieledateien exportieren
 
OK, danke für die Aufklärung, ich versuche möglichst alles mir bekannte noch zu sagen:

Es handelt sich um ein PC-Computerspiel aus dem Hause Synetic mit dem Namen Alarm für Cobra 11 - Das Syndikat. Ich möchte von diesem Spiel einen Scenario-Editor schreiben, mir fehlt jedoch nur noch der Export/Import des 3D Modells. Das schreiben der Exportdatei macht keine Probleme, ich weis leider nur nicht, wie ich mir noch fehlenden Sachen aus der Spieledatei auslesen kann.
  • Das Format der Spieledatei ist GEO, ich kann jedoch garantieren, dass kein anderes Programm im WWW diese Datei bereits öffnen kann
  • Die Scheitelpunkte beinhalten neben der XYZW-Position auch UV Koordinaten, Spiel-shader, usw.
  • Die Flächen (die jeweils von drei Scheitelpunkten aufgespannt werden) müssen irgendwie in diesem Bytecode integriert werden. (Hierzu noch ein Zitat von einem Programmierer aus früheren Zeiten von älteren Synetic-Spielen:
Zitat:

Anyway, faces are created from index buffer (synetic uses several int16 sets of numbers, for up to 400k vertices) and vertex buffer (just a big array) and that vertex buffer has normals encoded into 3 int8 numbers.
Jedoch versteh ich davon außer Array, Vertex, normals und noch ein bisschen weiterem nicht wirklich viel...


Das waren nun alle Informationen, ich hoffe es langt ansatzweise.

Grüße

Der schöne Günther 12. Okt 2013 21:30

AW: 3D-Spieledateien exportieren
 
Ich verstehe noch weniger.
  1. several int16 sets of numbers, for up to 400k vertices - "Several" ist jetzt nicht sonderlich genau. Ein Int16 für den Vertex-Index gibt maximal ~64.000 adressierbare Vertices für den Index Buffer her. Wären wir jetzt bei 2^18 kommen wir auf 262144 Möglichkeiten, bei 2^19 auf maximal 524288 adressierbare Vertices. Und der Kerl erzählt jetzt von 400.000. Ist ja fast genau die Mitte :)
  2. Du sagst weiter oben, dass mehr als 400.000 möglich sein müssen, deine Quelle von "up to".
  3. Deine Quelle spricht von einem nicht näher definierten Vertex Buffer, gibt aber an, dass auf jeden Fall pro Vertex noch die Normale dabei ist. UV-Koordinaten kann man mit Sicherheit erwarten, du erwähnst jetzt noch "Spiel Shader". Vielleicht bin ich schon zu lange aus der Materie draußen, aber Shader-Informationen hätte ich jetzt eher auf den Flächen erwartet. Oder meinst du weitere Mapping-Koordinaten für andere Maps auf den Vertices?
  4. GEO habe ich irgendwie noch als Endung für irgendein eher einfacheres standarisiertes Format in Erinnerung. Welche Tools hast du ausprobiert? Mein Favorit war immer Deep Exploration (mittlerweile von SAP geschluckt, heißt jetzt glaube ich "SAP Visual Author" oder sowas...)

the3dcloser 12. Okt 2013 23:44

AW: 3D-Spieledateien exportieren
 
1. Sehr schön, wir sind bei dem ersten Problem. Jedoch gehe ich tendenziell von 2^19 aus, näheres dazu unten.

2. Diese "Quelle" ist der Programmierer von einem Szenariotool des 7.Vorgängers. Da hatten die Szenarien ca. 280k an Faces, er setzte das Limit damals auf 400k. Sieben Spiele später kann man damit rechnen, dass wohl noch min. 130k hinzukamen, da zwischen jedem Spiel ca. 3-4 Jahre lagen.

3. Ja, das ist damit gemeint.

4. Es gibt sehrwohl einige 3D Formate die auf die Endung *.geo enden, darunter dein Deep Exploration, jedoch auch zB GEOcontrol 2. Jedoch kann keins dieser Tool diese Art von geo lesen. Ich nehme an, dass das daran liegt, dass die GEO für den Game-Einsatz weiterentwickelt wude (pre-computed Faces) damit der Ladeaufwand geringer ausfällt. So war es zumindest bei den Früheren Spielen von diesem Hersteller. Die Tools von diesem Programmierer kennen jedoch dieses GEO Format nicht, es ist ein Zusammenschluss von mehreren alten Dateien.

Ich weis, dass dies nicht umbedingt weiterhilft, ich hoffe, dass ich wenigstens die aufkommenden Fragen beantworten konnte.

Namenloser 12. Okt 2013 23:56

AW: 3D-Spieledateien exportieren
 
Wahrscheinlich ist das 3D-Objekt in mehrere unabhängige Teile partitioniert, wovon jedes Teil bis zu 2^16 Vertices haben kann.

Aber ohne die komplette Datei zu haben, ist es wohl unmöglich, das exakte Format zu rekonstruieren. Ich glaube außerdem auch nicht, dass irgendjemand Lust dazu hat...

Eventuell könntest du auch das eigentliche Programm reverse-engineeren/debuggen (Stichwort IDA Pro). Allerdings bewegst du dich dann rechtlich u.U. zumindest in einer Grauzone. Und Software von dieser Komplexität zu reverse-engineeren ist auch nicht gerade einfach, schon gar nicht, wenn man es vorher noch nie gemacht hat.

Oder du betreibst noch ein bisschen Social Engineering, um mehr Informationen von diesem Programmierer rauszukriegen ;). Das dürfte wahrscheinlich noch das erfolgsversprechenste sein.

the3dcloser 14. Okt 2013 13:46

AW: 3D-Spieledateien exportieren
 
Ok, ich hab den Programmierer nochmal ausgequetscht, es scheint als ob die Grundlegende Struktur dieser Flächen in einer anderen Datei in form einer Tabelle hinterlegt ist, somit muss ich mich jetzt erstmal damit anfreunden (juhu^^)

Danke trotzdem für die Hilfe.

PS: Kennt sich jemand in der Speicherung von Tabellen in binärdateien aus?

hitzi 14. Okt 2013 14:58

AW: 3D-Spieledateien exportieren
 
Die Flächen erzeugt doch die Grafikkarte selber. Man kann der Grafikkarte einen Vertex- und Indexbuffer übergeben und die macht daraus die Fläche.
Beispiel für ein Dreieck - Koordinaten x,y,z:

Punkt 1 - Index 0: 1,1,0
Punkt 2 - Index 1: 1,0,0
Punkt 3 - Index 2: -1,1,0

Der Vertexbuffer enthält nun (1,1,0), (1,0,0), (-1,1,0). Der dazugehörige Indexbuffer enthält: 0,1,2. Die Grafikkarte weiß nun das Punkt 1, der am Index 0 im Vertexbuffer ist, also 1,1,0 ... usw.

Wenn du an die Vertices (deine "Schnittpunkte") und an die Indices kommst, kannst du über die entsprechenden OpenGL oder DirectX Funktionen das Modell am Bildschirm zeichnen.

Das alles ist hier stark vereinfacht erklärt und da gibt es noch eine Menge mehr zu beachten. Dazu bitte weiterführende Dokumentation lesen.

the3dcloser 14. Okt 2013 16:32

AW: 3D-Spieledateien exportieren
 
Aha, langsam wird mir das System etwas klarer. Auf Deutsch gesagt, brauche ich dann eigentlich nur 2 rießige Arrays, die ich dann in eine Ausgabedatei speichern muss (will ja nur einen Konvertor schreiben, die 3D Veränderungen laufen dann über "bessere" Programme).

Letzendlich wird also das ganze wie in einer OBJ gespeichert, bei der pro Zeile ein Punkt oder eine Fläche angegeben wird, sprich

v -1.986 0.75 4.654 //Erstelle Point an angegebener XYZ Pos

f 1 53 4 // Erstelle Face (Fläche) aus 1. 53. und 4. Scheitelpunkt

Werde mich mal darüber etwas schauer machen, danke im vorraus.

Medium 14. Okt 2013 17:04

AW: 3D-Spieledateien exportieren
 
Zitat:

Zitat von the3dcloser (Beitrag 1231968)
PS: Kennt sich jemand in der Speicherung von Tabellen in binärdateien aus?

Man kann das auf theoretisch unendlich viele Arten und Weisen machen. Nochmal: Ohne ganz genaue, bitweise, verlässliche Dateiformatbeschreibung ist alles nur Raten - und selbst dann noch echt langwierig. Wenn man überhaupt weiter kommt. Hast du diese nicht, vergiss dein Vorhaben lieber. Das ist nicht böse gemeint, aber du klingt nicht wie jemand, dem man Reverse-Engineering völlig unbekannter Dateiformate zutrauen könnte. Würde ich mir selbst auch nicht. Eigentlich nur recht wenigen hier, und dann braucht man noch Unmengen an Zeit und Muße dafür.


Mir ist vor allem noch immer nicht ganz klar, was du überhaupt machen willst. Möchtest du nun Modelle des Spiel in dein Programm laden? Oder möchtest du 3D-Daten die du selber irgendwie erzeugt hast in ein für das Spiel lesbares Format ausgeben? Und an welcher Stelle kommen diese ominösen "besseren Programme" ins Bild? Ich glaube nicht, dass es mit dem blanken "rauswürgen" eines Vertex- und Indexbuffers getan sein kann. (Zumal diese ebenfalls in einer Fülle verschiedener Formate vorliegen können, ohne dabei überhaupt auf die konkrete Dateistruktur einzugehen.)

Wie man es auch dreht und wendet, sobald du Daten eines bestehenden Programmes lesen oder schreiben willst, MUSST du irgendwie an eine genaue Beschreibung kommen. Eine, in der Wörter wie "irgendwie", "andere Infos", "in etwa", und "grob gesagt" nicht vorkommen. Und genau diese brauchen auch wir hier, um dir dann bei konkreten Fragen dazu helfen zu können. Das. Wird. Sonst. Nichts.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz