Author Topic: Documentation Du Format Skd/skc  (Read 1341 times)

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« on: August 25, 2008, 10:27:23 PM »
Salut @ tous!

Un modeleur possèderait-il, dans les méandres de son disque dur, un document sur le codage des models SKD/SKC, qui permettrait, par exemple, de créer une animation à partir d'un bloc-notes (qui possèderait toutes les combinaisons ASCII existantes)?

J'aimerai pourvoir lire les fichiers SKD et SKC pour en tirer les informations de position des bones, de vitesse d'anim, de nombre de frames, de position relative des verticles, de position d'UVM... Bref, pouvoir lire un SKD et un SKC

Quelqu'un a-t-il une doc pour cela?
Merci !

Jed

  • Tailleur de maps (expérimenté)
  • Posts: 727
    • http://www.hudescharfe.com
Documentation Du Format Skd/skc
« Reply #1 on: August 26, 2008, 05:57:23 PM »
Salut Snaky, c'est ton jour de chance: http://map.planetmedalofhonor.gamespy.com/...pic.php?t=13010 . Bon courage.

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« Reply #2 on: August 27, 2008, 12:02:04 AM »
Merci! je vais voir ce que j'en comprends ^^

tourist-tam

  • Tailleur de maps
  • Posts: 420
Documentation Du Format Skd/skc
« Reply #3 on: August 28, 2008, 01:14:03 AM »
Attention il y a de la pomme de terre la dedans. :P

Clair, c'est un peu sec comme lecture du soir. ^_^

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« Reply #4 on: August 30, 2008, 09:24:38 PM »
Et au niveau hexadécimal, il n'y a pas de "mode d'emploi"? Car honnètement, je ne comprends pas grand chose à comment est lu le skd et le skc à partir de ces infos... :s

Pour le moment, je sais juste que les skc commencent par 53 4B 41 4E 0D en hexa, ce qui correspond au numéro de version (le numéro de version valide est 1312901971,13, ce qui correspond à la valeur décimale de 4E414B53 suivit, apres la virgule, de la valeur décimale de 0D, donc, c'est les 4 premiers caractères du fichier lus "à l'envers" suivit du 5e caractère). Ca correspond au SKC_IDENT et au SKC_VERSION.
« Last Edit: August 30, 2008, 09:28:33 PM by snaky »

Jed

  • Tailleur de maps (expérimenté)
  • Posts: 727
    • http://www.hudescharfe.com
Documentation Du Format Skd/skc
« Reply #5 on: August 30, 2008, 09:32:52 PM »
Je crois que tu fais complètement fausse route avec ton histoire d'héxadécimal qui est juste une manière de représenter des données. Que tiens tu exactement à connaitre sur ces fichiers?

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« Reply #6 on: August 30, 2008, 09:43:07 PM »
Connaitre le nom, la position et la rotation de chaque bone pour chaque frame, connaitre le nombre total de frames, connaitre la position du verticle, connaitre le ou les bones auquel se rattache le verticle, connaitre le coeficiant avec lequel il lui est rattaché, savoir quel skin contient quels verticles, connaitre le nombre total de skins, connaitre les coordonnées UVM des verticles, savoir à quels autres verticles est relié tel verticle (^= connaitre les sommets de chaque face), connaitre la normale du verticle.

Jed

  • Tailleur de maps (expérimenté)
  • Posts: 727
    • http://www.hudescharfe.com
Documentation Du Format Skd/skc
« Reply #7 on: August 30, 2008, 10:27:22 PM »
Mais il existe pas des utilitaires qui permettent de connaître tout ça? Sinon je vois pas d'autre moyen que de programmer ton propre outil en t'appuyant sur le code source que je t'ai passé et qui contient toutes les caractéristiques de ce format de fichier.

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« Reply #8 on: August 30, 2008, 10:29:45 PM »
"qui contient toutes les caractéristiques de ce format de fichier"

Sauf que je ne comprends pas bien la syntaxe :s

Jed

  • Tailleur de maps (expérimenté)
  • Posts: 727
    • http://www.hudescharfe.com
Documentation Du Format Skd/skc
« Reply #9 on: August 30, 2008, 10:32:31 PM »
Alors à toi de bûcher sur C avec OpenGL pour comprendre ce qui est écrit...

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« Reply #10 on: August 30, 2008, 10:39:40 PM »
Tu vas me faire plancher 3 mois sur les cours OpenGL... J'aurai meilleur temps de tout reprendre à 0 et de rechercher sur des exemples ^^

Ce que je ne comprends pas, c'est comment se relie ce code avec le fichier skc... Pour ce que je comprends actuellement du code, cela me donne l'impression qu'il ne fait que lister des variables, avec leur type de données: mais d'où sort la valeur de ces variables? Comment extrait-on cette valeur du skc?!

Jed

  • Tailleur de maps (expérimenté)
  • Posts: 727
    • http://www.hudescharfe.com
Documentation Du Format Skd/skc
« Reply #11 on: August 30, 2008, 10:50:03 PM »
3 mois pour maitriser OpenGL? Tu serais un prodige, j'aurais plutôt dit 3 ans :lol: Sinon par exemple, ce code te donnes le Header du fichier, qui est en sorte sa "carte d'identité" te permettant de savoir comment le lire avec un programme comme Lightray 3D. Le membre "boneindex" par exemple du type "skdWeight_t" est une variable contenant la position d'un bone dans le modèle. Tu as le type "skdBone_t" stockant les toutes infos d'un bone. En assemblant toutes ces informations tu peux aisément retrouver comment se constitue un SKD.

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« Reply #12 on: August 30, 2008, 11:00:15 PM »
Mais si je veux, par exemple, récupérer ces informations avec un Visual Basic Script, et non pas un langage C, comment je fais?

Comment puis-je modifier le skc juste au bloc-notes?
OK, je crois avoir compris que skcHeader_t contient la totalité des infos sur le type, la version le nb de frames... Mais comment passe-t-on de ça:

00000000:  53 4B 41 4E 0D 00 00 00  00 00 00 00 C0 00 00 00  SKAN........À...
00000010:  CD CC 4C 3D 00 00 00 00  00 00 00 00 00 00 00 00  ÍÌL=............
00000020:  00 00 00 00 02 00 00 00  80 00 00 00 01 00 00 00  ........€.......
00000030:  1B 00 70 C1 00 00 80 C1  00 00 00 00 F2 FF 87 41  ..pÁ..€Á....òÿ‡A
00000040:  00 00 80 41 00 00 00 00  F3 04 35 42 00 00 00 00  ..€A....ó.5B....
00000050:  00 00 00 00 00 00 00 00  00 00 00 00 60 00 00 00  ............`...
00000060:  B0 F7 7F 3F 00 00 00 00  00 00 00 00 00 00 00 00  °÷.?............
00000070:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 3F  ..............€?
00000080:  6F 72 69 67 69 6E 20 70  6F 73 00 00 00 00 00 00  origin pos......
00000090:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
000000A0:  6F 72 69 67 69 6E 20 72  6F 74 00 00 00 00 00 00  origin rot......
000000B0:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................


Aux données du C?
En fait, je ne comprends pas comment le programme arrive à poser une valeur tirée du fichier skc sur le nom de la variable C  hummm  

Jed

  • Tailleur de maps (expérimenté)
  • Posts: 727
    • http://www.hudescharfe.com
Documentation Du Format Skd/skc
« Reply #13 on: August 31, 2008, 08:30:23 AM »
Ce que tu veux faire est impossible Snaky... Les fichiers SKD sont des fichiers binaires et tu ne peut ni les modifier avec un éditeur de texte ni les lire avec du vbs. La seule chose possible est de programmer un programme s'appuyant sur les spécifications décrites dans le code source du fichier. Et cela n'est possible qu'avec C, C++ voire Java mais j'en doute. Par exemple le plugin d'import de modèles pour Lightray 3D représente tout à fait ceci, c'est un programme, une librairie dynamique écrite en C qui va lire les infos d'un modèle. Pour la suite, même si je connais un peu le C et la structure des modèles MOH, je ne pourrais te dire comment programmer afin de les lire.
Laisse tomber ta lecture de fichiers en hexa, car les données que tu lis dans les SKD sont des données compilées qui ne veulent rien dire. L'hexadécimal est juste un mode de représentation des données en octets, un autre alphabet si tu veux, mais ça n'a rien à voir avec la programmation. Ouvre un fichier texte lisible avec un éditeur hexa, tu comprendras en quoi ça consiste. Bref l'hexadécimal ne t'apprendra rien de plus.
« Last Edit: August 31, 2008, 08:34:58 AM by Jed »

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« Reply #14 on: August 31, 2008, 12:13:33 PM »
Sauf qu'en modifiant 3 paires d'octets, en [0x0000003, A;0x0000003, B], en [0x0000004, 7; 0x0000004, 8] et en [0x0000004, A; 0x0000004, B], j'ai pu déplacer mon bone "origin" le long de l'axe Z:

Ces 3 paires ont toutes pour valeur (00) (00) lorsque le bone est en X=0 Y=0 et Z=0.
Elles ont toutes pour valeur (80) (3F) lorsqu'il est en X=0 Y=0 et Z=1.
Je les ais définies à (1E) (64) et le bone est parti en X=0 Y=0 et Z=11.658.342.254.584.437.000.000

OK, c'est pas terrible comme résultat, mais de fil en aiguille, je suis certain que l'on peut comprendre le fonctionnement des SKD à partir des données brutes.
Même s'il s'agit d'un binaire, le plugin de LR3D, celui de skl_to_skx ou encore, MOHAA même sont bien capables de les lire, donc, à partir des données brutes, on peut en déduire toutes les infos que l'on veut.

J'ai déjà appliqué cette méthode aux .map, et j'ai trouvé le principe de fonctionnement (une face est définie par un plan consitué de trois points formant un tétraèdre direct dont le 4e sommet donne la normale de la face créant ainsi un demi-espace, ses cotés sont définis apr les intersection avec les autres demis-espaces des autres faces, c'est pour cela qu'il hn'y a pas de face concave, j'ai trouvé les signification des listes de  nombre qui suivent, j'ai analysé et compris comment la texture est projetée: le long des axes X Y ou Z suivant l'angle de la face, j'ai compris comment sont calculées les zones de visibilités, à partir de ces demi-espaces... J'en ai fait de même avec les TGA, en analysant que les premiers offsets donnent un code permettant de dire qu'il s'agit d'un TGA, les quivant donne le type de codage (RVB, Gris...) les suivants donnent la taille de la texture et c'est à ce niveau-là que les TGA sont limités à 65535 pixels de coté, car 2 octets servent à donner la dimension de la texture, donc on ne peut dépasser 65535, ensuite j'ai compris comment les couleurs rouge vert et bleu sont codés (un octets pour chaque couleur, c'est en cela que les couleurs sont limités à 255 car un octet ne peut dépasser la valeur de 255), j'ai analysé et compris comment est cod&é le cannal alpha, j'ai vu que les derniers octets du fichiers sont des (00) puis qu'il se finit apr TRUEVISION-<je-ne-sais-plus-quoi>, et j'ai pu en faire un VBS qui lit le TGA et donne al couleur de n'importe quel pixel)
Je suis presque certains qu'un SKD et un SKC peuvent fonctionner sur le même principe, mais ce sera plus complexe qu'un TGA ou un MAP car mle codage semble moins évident!

Jed

  • Tailleur de maps (expérimenté)
  • Posts: 727
    • http://www.hudescharfe.com
Documentation Du Format Skd/skc
« Reply #15 on: August 31, 2008, 06:12:45 PM »
Après a toi de décider... Soit t'y vas au pif comme tu fais sans jamais comprendre ce qui se passe derrière et en espérant avoir du bol, soit tu te mets sérieusement à comprendre comment ça marche et à étudier le langage...

snaky

  • Squatteur de forum
  • ****
  • Posts: 3332
    • http://profparty.forumpro.fr
Documentation Du Format Skd/skc
« Reply #16 on: August 31, 2008, 07:06:47 PM »
OK, je crois que je saisis le principe:
Un integer 32Bits, c'est 4 octets de 8 bitds (genre D5 56 D2 FF) que l'on lit "à l'envers" (FF D2 56 D5) et que l'on change en décimal (4291974869).
Un Float 32 Bits est calculé sur le même principe, même si je ne sais pas encore comment le PC passe de D5 56 D2 FF à NAN... merde, mauvais exemple!
Bref, je ne sais pas comment il passe de 1B 00 70 C1 à 15,000025749, mais cela n'est pas un soucis, s'il sait passer lui-même de l'un à l'autre.
Les "char" n'apparaissent que dans le skd: je n'ai pas encore regardé à quoi ils correspondaient exactement.
Donc, le début de mon fichier devient:

Type skcHeader_t
(ident int)[53 4B 41 4E]
(version int)[0D 00 00 00]
(type int)[00 00 00 00]
(ofsEnd int)[C0 00 00 00]
(FrameTIme int)[CD CC 4C 3D]
(Dummies int)[00 00 00 00]  [00 00 00 00] [00 00 00 00] [00 00 00 00]
(NumChannels int) [02 00 00 00]
(ofsChannels int) [80 00 00 00]
(Num Frames int) [01 00 00 00]

Apres, c'est de type skcFrame_t: j'ai un soucis sur comment se lit un vec3_t. Est-ce qu'il s'agit des coordonnées d'un vecteur (X, Y, Z) avec X Y et Z des Floats en 32bits? A ce moment-là, la suite de mon fichier étant:
(bound2 vec3_t)~[1B 00 70 C1] [00 00 80 C1]  [00 00 00 00]~

Je devrais avoir un vecteur ( -15,000025749 -16 0 ) qui correspond aux Float-32 de X Y et Z.
C'est cela, où je merdoie?

Jed

  • Tailleur de maps (expérimenté)
  • Posts: 727
    • http://www.hudescharfe.com
Documentation Du Format Skd/skc
« Reply #17 on: September 01, 2008, 06:05:06 PM »
Tu merdoies dans le sens ou tu te prends vraiment la tête pour rien. C'est fini l'époque où les programmeurs concevaient un programme bit à bit! Tu auras des cheveux blancs quand tu toucheras à ton but...

Nono

  • Poseur de brushs
  • Posts: 127
Documentation Du Format Skd/skc
« Reply #18 on: September 01, 2008, 08:56:22 PM »
Salut,

Pas sur que ce soit comme ça, mais pour convertir tes 1B 00 70 C1 (hecadecimal) en -15,000025749 (float), regarde ce lien:

http://sandbox.mc.edu/~bennet/cs110/flt/ftod.html

Attention, il faut inverser les octets, 1B 00 70 C1 devient C1 70 00 1B, et à l'arrondit près tu obtiens tes -15,000025749

Par contre pour 00 00 80 C1 , qui devient C1 80 00 00 , tu retombes sur 16  pile poil.
 

Tony

  • Legomaniaque
  • Posts: 1178
    • http://rpgclan-team.omivu.net
Documentation Du Format Skd/skc
« Reply #19 on: September 02, 2008, 12:20:05 PM »
Salut Snaky !

Un vec3_t est un typedef d'un float, il se présente ainsi :

typedef float vec_t;
typedef vec_t vec2_t[2];
typedef vec_t vec3_t[3];

Ainsi de suite....
vec3_t est donc un vecteur :
A, B, C, D.

Car comme tu le sait, le premier indice d'un array est
  • .


Donc float x 4 = 32 x 4. Soit 16 octets.

Etudie l'asm et le C, tu verras ;)
BOOM HEADSHOT !!111one