2 registered members (AndrewAMD, howardR),
472
guests, and 7
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Deformers struct in MDL7 abspeichern.
#467669
08/20/17 15:41
08/20/17 15:41
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
hey leute ich bin am ende meiner latien. ich würde gerne das deformer struct im mdl7 abspeichern das mdl7 besteht aus:
MD7_HEADER
char ident[4]; // "MDL7"
long version; // '0', 'sub'- version number;
long bones_num;
long groups_num;
long mdl7data_size; // this file size (head included), except entlump and medlump.
long entlump_size; // entity info size (not yet used, always 0)
long medlump_size; // size of data for MED in bytes
unsigned short md7_bone_stc_size;
unsigned short md7_skin_stc_size;
unsigned short md7_colorvalue_stc_size;
unsigned short md7_material_stc_size;
unsigned short md7_skinpoint_stc_size;
unsigned short md7_triangle_stc_size;
unsigned short md7_mainvertex_stc_size;
unsigned short md7_framevertex_stc_size;
unsigned short md7_bonetrans_stc_size;
unsigned short md7_frame_stc_size;
struct MD7_BONE
{
unsigned short parent_index;
BYTE _unused_[2]; //
float x,y,z;
//ws, 12.05.2003: bone name mitspeichern...
char name[MAX_BONENAMESIZE];
};
struct MD7_GROUP
{
unsigned char typ; // = '1' -> triangle based Mesh
//ws, 26.04.2006 max weights per vertex
// BYTE _unused_[3];
BYTE deformers;
BYTE max_weights;
BYTE _unused_;
long groupdata_size; // size of data for this group in bytes ( MD7_GROUP stc. included).
char name[MAX_GROUPNAMESIZE];
long numskins;
long num_stpts; // number of 2D skin vertices
long numtris;
long numverts;
long numframes;
};
struct MD7_DEFORMER
{
BYTE deformer_version; // 0
BYTE deformer_typ; // 0 - bones
BYTE _unused_[2];
long group_index;
long elements;
long deformerdata_size;
};
struct MD7_DEFORMERELEMENT
{
long element_index; // bei deformer_typ==0 (==bones) element_index == bone index
char element_name[MAX_BONENAMESIZE];
long weights;
};
struct MD7_DEFORMERWEIGHT
{
long index; // bei deformer_typ==0 (==bones) index == vertex index
float weight;
};
MD7_HEADER,MD7_BONE und MD7_GROUP kann ich abspeichern header bone und group speicher ich so ab:
file.write(struct.pack("<4sllllllHHHHHHHHHH",
b,
0,
len(self.bones),
len(self.groups),
self.getsize(), # 0 = subversion
0, # entlumpsize,
0, # medlumpsize
36,
28,
16,
68,
8,
16,
26,
26,
68,
24))
for bone in self.bones:
bone.write(file)
for group in self.groups:
group.write(file)
das bone write und group write sieht so aus:
//bone
file.write(struct.pack("<HHfff20s",
self.parentindex, 0,
self.x, self.y, self.z, b))
---------------------------------------------------------------
//group
file.write(struct.pack("<BBBBl16slllll",
1, # type 1 = triangle mesh
0, # deformers ??
0, # max_weights ??
0, #
self.getsize(),
b,
len(self.skins),
len(self.uvs),
len(self.triangles),
len(self.vertices),
len(self.frames)))
und jetzt das problem: bei groups wird ein deformer mit gegeben und ein max_weight. aber ich weis nicht in welcher reihenfolge und auch nicht genau welche formater also schreibe ich die deformer direkt nach dem group pack
if extension == "mdl":
file.write(struct.pack("<BBBlll",
deformer_version, # 0
deformer_typ, # 0 - bones
0, # _unused_[2] evtl ändern zu " 0,0, und ein B hinzufügen"
group_index,
len(deformer_elements),
deformerdata_size # <-- ?? XDD shit xD
))
for element in deformer_elements:
b = bytearray()
b.extend(map(ord, element[1]))
file.write(struct.pack("<l16sl",
element[0], # element[0] == bone index nummer evtl ändern auf " element[0] -1 " !!!
b, # element[1] == bone name || b == element[1]
len(element[2]) # länge von weights
))
for weight in element[2]:
file.write(struct.pack("<Hf",
weight[0], # weight[0] == vertex index
weight[1] # weight[1] == weight
))
ich gehe von folgender hierarchie aus: MDL7 ____+bones ____+groups ____+deformer _______+elements ___________+weights
ist das korrekt oder muss ich: MDL7 ____+bones ____+groups _______+deformer __________+elements ______________+weights
? wie genau werden die deformers binär abgespeichert? und was erwartet die group bei deformers und max_weights?
Last edited by tagimbul; 08/20/17 15:45.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: Ch40zzC0d3r]
#467760
08/27/17 21:16
08/27/17 21:16
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
hey =) freut mich das du bei sowas durchblickst! reverse engineering ist mir zwar ein begriff, wurde mich auch schon empfohlen bei meinem problem, aber ich weis zu wenig über binäre formate um diese technik anzuwenden.
kannst du mir das bitte genauer erklären?
also ich würde in Blender ein model mit weights machen und es dann zum MED exportieren mit der FBX import variante. dann hätte ich ein MDL model mit dem deformer struct bzw. mit weights.
dann wie weiter? kannst du mir das schritt für schritt erklären?
freundliche grüsse tom
Last edited by tagimbul; 08/27/17 21:17.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#467761
08/27/17 21:51
08/27/17 21:51
|
Joined: Oct 2011
Posts: 1,082 Germany
Ch40zzC0d3r
Serious User
|
Serious User
Joined: Oct 2011
Posts: 1,082
Germany
|
Du benutzt einen hex editor wie 010 editor oder parst die datei mit deinem code. Entweder parst du es jetzt von hand und findest die deformer daten so, oder hat dein script findet daten die es nicht bearbeiten kann. Reverse engineering eines dateiformates braucht ein gewisses verständnis von dateisystemen und allgemeinen dateiformaten (speichern von daten auf einem begrenzten medium zum späteren parsen). Was man dann genau macht bzw. wie man genau rangeht ist jedes mal verschieden und basiert auf dem jeweiligen wissen welches man besitzt. In deinem fall würde ich das vorhanden wissen einfach mal nutzen, und bekannte daten aus der datei "schneiden" - also entfernen. Danach bleibt das übrig was du nicht kennst, dann markierst du dir die stellen und findest anhanf der daten heraus wie genau die struktur aussieht. Das ganze klingt relativ abstrakt, du solltest es einfach mal anwenden. Reverse engineering ist eigentlich nur logik kombiniert mit dem oben genannten wissen
Last edited by Ch40zzC0d3r; 08/27/17 21:51.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: Ch40zzC0d3r]
#467765
08/28/17 17:58
08/28/17 17:58
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
ok. ich hab mich in dieses Thema eingearbeitet und weis nun genau was ich zu tun habe =) vielen dank für den Anstoss!
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#467819
09/03/17 08:04
09/03/17 08:04
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
man ich bin so aufgeregt hätte ich doch von anfang an das mdl7 versucht zu parsen beim parsen vielen mir so viele details auf die ich bei meinem exporter noch garnicht berücksichtig hatte! und gleichzeitig ist es eine super lehrstunde in sachen binär und hex verarbeitung^^ bin nun etwa bei 50% und nähere mich dem deformer struct immer wie mehr ich mache es nun so das ist den parser nutze um das mdl 7 in ein text dokument zu verwandeln. den code werde ich dann auch zur verfügung stellen =) bisher habe ich ja nur versucht den alten exporter von thomas oppl zu updaten. aber wenn ich den parser fertig habe werde ich einen ganz neuen und eigenen exporter kreieren der wirklich alles berücksichtigt was das mdl7 file zu bieten hat. danke nochmal für den crashkurs Ch40zzC0d3r ^^
Last edited by tagimbul; 09/03/17 08:05.
|
|
|
Re: Save "Deformer" in the MDL7 Binary file?
[Re: tagimbul]
#467876
09/05/17 12:23
09/05/17 12:23
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
ich peil's nicht.... ich kriege das ganze file geparst aber dann sind da, ohne deformer's, noch ein paar bytes übrig mit bone strings drin. die kommen nach dem parsen von den frame matrizen:
05 00 00 00 0C 00 00 00 4D 42 49 00 01 00 00 00
10 02 00 00 02 00 00 00 94 00 00 00 02 00 00 00
42 6F 6E 65 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 BC C1 00 00 00 BF 00 00 00 41 00 00 00 00
04 00 00 00 00 00 00 00 42 6F 6E 65 31 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
42 6F 6E 65 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 C0 41 00 00 00 00
00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00
03 00 00 00 64 01 00 00 02 00 00 00 01 00 00 00
02 00 00 00 42 6F 6E 65 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 80 3F 00 00 00 00 00 00 00 00
DD 0F C9 BF 00 00 00 00 00 00 00 00 00 00 00 00
18 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3F
00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F
00 00 80 3F 42 6F 6E 65 31 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 80 3F 00 00 00 00 00 00 00 00
35 05 AC 3F 00 00 00 00 00 00 00 00 00 00 00 00
18 00 00 00 01 00 00 00 00 00 00 00 00 00 80 3F
00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F
00 00 80 3F 02 00 00 00 01 00 00 00 42 6F 6E 65
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 3F
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 18 00 00 00 01 00 00 00
00 00 00 00 00 00 80 3F 00 00 80 3F 00 00 80 3F
00 00 80 3F 00 00 80 3F 00 00 80 3F 01 00 00 00
00 00 00 00
was könnte das noch sein? es handelt sich hierbei um ein mdl7 file das im MED erzeugt wurde. kann das doch das deformer struct sein? weill in der group steht deformers = 0 also muss das ja was anderes sein... oder speichert MED deformers auch wenn sie garnicht benutzt werden? edit: ich habe auch beim parsen das mdl7data_size erreicht. dann hab ich noch das medlump_size übrig das ist genau der teil wo da steht. es hat eine anzahl von 548 hex und medlump_size hat eine grösse von 548 aber wieso sind dort strings drin? laut Mdl7.h sind das 2 +3 int's....
Last edited by tagimbul; 09/05/17 12:35.
|
|
|
|