L'objectif de Cast est de créer un format facile à utiliser pour les modèles, les animations, les matériaux et les mondes de jeu. De plus, les acteurs devraient être capables de produire les mêmes scènes dans n’importe quel logiciel 3D.
Autodesk Maya (2012+) : versions
Blender (3.0+) : versions
.NET Framework (référence) : Bibliothèques/DotNet
.NET Framework (par Scobalula) : Cast.NET
Python : Bibliothèques/Python
CastModelViewer (Par echo000) : Github
SECast, un convertisseur sans perte pour diffuser : SECast
Remarque : Si votre outil prend en charge l'exportation vers la diffusion directe, c'est toujours mieux.
Questions fréquemment posées : FAQ
Tous les fichiers commencent par un en-tête cast :
struct CastHeader{ uint32_t Magic ; // char[4] cast (0x74736163)uint32_t Version ; // 0x1uint32_t Noeuds Racines ; // Nombre de nœuds racine, qui contiennent divers sous-nœuds si nécessaireuint32_t Flags ; // Réservé aux indicateurs ou au remplissage, selon les besoins};
Un fichier cast est essentiellement un groupe de nœuds génériques. Les nœuds reçoivent un identifiant enregistré unique, qui peut indiquer au chargeur quelles sont les données et comment les gérer.
Après l'en-tête cast se trouve une collection de nœuds qui doivent être de type CastId::Root.
Un nœud ressemble à :
struct CastNodeHeader{ Identifiant CastId ; // Utilisé pour indiquer quelle classe ce nœud utilisesuint32_t NodeSize ; // Taille de toutes les données et sous-données suivant le nodeuint64_t NodeHash ; // Hachage unique, comme un identifiant, utilisé pour relier les nœuds ensembleuint32_t PropertyCount ; // Le nombre de propertyuint32_t ChildCount ; // Le nombre de nœuds enfants directs// Nous devons lire jusqu'à ce que la taille du nœud atteigne, et cela signifie que nous avons terminé.// Les nœuds sont dans une disposition en pile, donc c'est facile à charger, dans l'ordre FILO.};
Il existe plusieurs identifiants de casting enregistrés disponibles :
enum classe CastId : uint32_t{ Racine = 0x746F6F72, Modèle = 0x6C646F6D, Maillage = 0x6873656D, Forme de mélange = 0x68736C62, Squelette = 0x6C656B73, Os = 0x656E6F62, IKHandle = 0x64686B69, Contrainte = 0x74736E63, Animation = 0x6D696E61, Courbe = 0x76727563, CurveModeOverride = 0x564F4D43, NotificationTrack = 0x6669746E, Matériel = 0x6C74616D, Fichier = 0x656C6966, Instance = 0x74736E69, Métadonnées = 0x6174656D, } ;
A la suite d'un nœud, se trouve la liste des propriétés [Node.PropertyCount], une propriété ressemble à :
struct CastPropertyHeader{ Identifiant CastPropertyId ; // Le type d'élément de cette propriétéuint16_t NameSize ; // La taille du nom de cette propriétéuint32_t ArrayLength; // Le nombre d'éléments que cette propriété contient (1 pour simple)// Voici la chaîne UTF-8 en minuscules, la taille de namesize, NON terminée par un caractère nul// cast_property[ArrayLength] tableau de données};
Pour les propriétés, Cast a plusieurs types intégrés :
enum class CastPropertyId : uint16_t{ Octet = 'b', //Court = 'h', // Entier32 = 'i', // Entier64 = 'l', // Flotteur = 'f', // Double = 'd', // String = 's', // Chaîne UTF-8 terminée par un caractère nul Vector2 = 'v2', // Vecteur de précision flottant XY Vector3 = 'v3', // Vecteur de précision flottant XYZ Vector4 = 'v4'// Vecteur de précision flottant XYZW} ;
Pour lire un fichier cast, il vous suffit de parcourir les nœuds racine et leurs enfants. Les propriétés viennent toujours avant les enfants d'un nœud. Chaque nœud a sa taille totale et celle de tous ses enfants. Ainsi, si un processeur ne comprend pas l'identifiant d'un nœud, il peut ignorer le nœud entier et continuer la lecture.
Les identifiants de diffusion sont stockés sous forme d'entiers pour accélérer la sérialisation et la désérialisation.
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Squelette, maille, matériau | Vrai | FAUX |
Mère | Racine | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | FAUX |
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Modèle | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | FAUX |
Tampon de position du sommet (vp) | Vecteur 3 (v3) | Vrai | Vrai |
Tampon normal de sommet (vn) | Vecteur 3 (v3) | Vrai | FAUX |
Tampon de tangente de sommet (vt) | Vecteur 3 (v3) | Vrai | FAUX |
Tampon de couleur de sommet (c%d) | Entier 32 (i) | Vrai | FAUX |
Tampon UV du sommet (u%d) | Vecteur 2 (v2) | Vrai | FAUX |
Tampon osseux de poids Vertex (wb) | Entier 32 (i), court (h), octet (b) | Vrai | FAUX |
Tampon de valeur de poids de sommet (wv) | Flotteur (f) | Vrai | FAUX |
Tampon facial (f) | Entier 32 (i), court (h), octet (b) | Vrai | Vrai |
Nombre de couches de couleur (cl) | Entier 32 (i), court (h), octet (b) | FAUX | Vrai s'il y a des couches de couleurs, sinon Faux |
Nombre de couches UV (ul) | Entier 32 (i), court (h), octet (b) | FAUX | Vrai s'il y a des couches UV, sinon Faux |
Influence maximale du poids (mi) | Entier 32 (i), court (h), octet (b) | FAUX | Vrai si a des poids sinon Faux |
Méthode de dépouillement (sm) | Chaîne(s) [linéaire, quaternion] | FAUX | FAUX |
Matériau (hachage de CastNode:Matériau) (m) | Entier 64 (l) | FAUX | FAUX |
Remarques :
Face Buffer
est un index dans les tampons de données de sommets du maillage actuel où (0, 1, 2) sont les trois premiers sommets de ce maillage.
Le Face Buffer
suit l'ordre d'enroulement CCW (droitier), cela peut être différent dans d'autres API, où vous devrez peut-être remapper les index.
Si un visage contient une combinaison d'index non valide (0, 1, 1), (0, 1, 0), (0, 0, 0)
où deux ou plusieurs indices sont identiques, il est acceptable que l'utilisateur traitant ces visages ignorez-les afin de restituer correctement le maillage. Il serait sage de présenter à l'utilisateur un avertissement indiquant que cela s'est produit.
Chaque tampon de descripteur de sommet doit contenir le même nombre d'éléments ex : si vous avez 16 sommets, vous devez avoir 16 normales si elles existent, 16 couleurs si le tampon existe. Sinon, on suppose qu'ils sont par défaut/ignorés.
Les poids sont additifs, ce qui signifie qu'avoir le même os avec 0.5
et 0.5
finirait par faire en sorte que les os influencent 1.0
par exemple.
La méthode de skinning par défaut est linear
. Lorsqu'il est réglé sur quaternion
le skinning double quaternion est utilisé.
NOUVEAU 18/08/2024 : La spécification de la couleur des sommets a changé , afin de prendre en charge plusieurs couches de couleurs, un nouveau Color Layer Count (cl)
a été ajouté qui imite la propriété UV Layer Count (ul)
.
Pour être rétrocompatibles, les processeurs de diffusion doivent rechercher cl
et l'utiliser par défaut avec les nouvelles propriétés de couche c%d
.
Si la propriété cl
n'existe pas, un processeur doit rechercher l'ancienne propriété vc
qui est la seule et unique couche de couleur si elle existe.
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Modèle | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | Vrai |
Forme de base (hachage de CastNode:Mesh) (b) | Entier 64 (l) | FAUX | Vrai |
Indices de sommet de forme cible (vi) | Octet (b), court (h), entier 32 (i) | Vrai | Vrai |
Positions des sommets de la forme cible (vp) | Vecteur 3 (v3) | Vrai | Vrai |
Échelle de poids cible (ts) | Flotteur (f) | Vrai | FAUX |
Remarques :
La Base Shape
doit être un maillage coulé existant.
Les Target Shape Vertex Indices
et Target Shape Vertex Positions
doivent avoir la même longueur lorsqu'ils sont appariés.
Target Shape Vertex Positions
est la valeur finale de chaque position de sommet modifiée en ignorant le sommet correspondant de Base Shape
.
Target Weight Scale
indique la valeur maximale à laquelle la forme cible peut se déformer et doit être par défaut 1.0
.
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Os, IKHandle, Contrainte | Vrai | FAUX |
Mère | Modèle | FAUX | Vrai |
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Squelette | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | Vrai |
Indice des parents (p) | Entier 32 (i) | FAUX | FAUX |
Compensation d'échelle de segment (ssc) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Position locale (lp) | Vecteur 3 (v3) | FAUX | FAUX |
Rotation locale (de gauche à droite) | Vecteur 4 (v4) | FAUX | FAUX |
Position mondiale (wp) | Vecteur 3 (v3) | FAUX | FAUX |
Rotation mondiale (wr) | Vecteur 4 (v4) | FAUX | FAUX |
Échelle(s) | Vecteur 3 (v3) | FAUX | FAUX |
Remarques :
Segment Scale Compensate
doit être définie par défaut sur True
lorsqu'elle n'est pas spécifiée.
Scale
est toujours locale à l'os actuel.
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Squelette | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | FAUX |
Démarrer le hachage d'os (sb) | Entier 64 (l) | FAUX | Vrai |
Hachage d'os de fin (eb) | Entier 64 (l) | FAUX | Vrai |
Hachage d'os cible (tb) | Entier 64 (l) | FAUX | FAUX |
Hachage d'os de vecteur de pôle (pv) | Entier 64 (l) | FAUX | FAUX |
Hachage d'os de pôle (pb) | Entier 64 (l) | FAUX | FAUX |
Utiliser la rotation cible (tr) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Remarques :
Use Target Rotation
doit être par défaut False
lorsqu'il n'est pas spécifié.
Pole Bone
ne doit effectuer que la torsion de la chaîne, en général vous avez soit un Pole Bone
, soit un Pole Vector Bone
.
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Squelette | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | FAUX |
Type de contrainte (ct) | Chaîne(s) [pt, ou, sc] | FAUX | Vrai |
Hachage d'os de contrainte (cb) | Entier 64 (l) | FAUX | Vrai |
Hachage d'os cible (tb) | Entier 64 (l) | FAUX | Vrai |
Maintenir le décalage (mois) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Sauter X (sx) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Sauter Y (sy) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Sauter Z (taille) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Remarques :
Les valeurs du type de contrainte correspondent à :
pt
Point Constraint, qui s'applique aux traductions.
or
Contrainte d'Orient, qui s'applique aux rotations.
sc
Contrainte d'échelle, qui s'applique aux échelles.
Conserver le décalage doit être par défaut False
lorsqu'il n'est pas spécifié.
Skip X, Skip Y et Skip Z doivent par défaut être False
lorsqu'ils ne sont pas spécifiés et faire référence à l'ignorance de cet axe dans la contrainte.
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Déposer | Vrai | FAUX |
Mère | Modèle | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | Vrai |
Tapez (t) | Chaîne(s) | FAUX | Vrai |
Hachage de fichier albédo (albédo) | Entier 64 (l) | FAUX | FAUX |
Hachage de fichier diffus (diffus) | Entier 64 (l) | FAUX | FAUX |
Hachage de fichier normal (normal) | Entier 64 (l) | FAUX | FAUX |
Hachage de fichier spéculaire (spéculaire) | Entier 64 (l) | FAUX | FAUX |
Hachage de fichier émissif (émissif) | Entier 64 (l) | FAUX | FAUX |
Hachage de fichier brillant (brillant) | Entier 64 (l) | FAUX | FAUX |
Hachage du fichier de rugosité (rugosité) | Entier 64 (l) | FAUX | FAUX |
Hachage du fichier d'occlusion ambiante (ao) | Entier 64 (l) | FAUX | FAUX |
Hachage de fichier de cavité (cavité) | Entier 64 (l) | FAUX | FAUX |
Hachage de fichier d'anisotropie (aniso) | Entier 64 (l) | FAUX | FAUX |
Hachage de fichier supplémentaire (x) (extra%d) | Entier 64 (l) | FAUX | FAUX |
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Nœud de diffusion | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Chemin (p) | Chaîne(s) | FAUX | Vrai |
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Squelette, courbe, CurveModeOverride, NotificationTrack | Vrai | Vrai |
Mère | Racine | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | FAUX |
Framerate (fr) | Flotteur (f) | FAUX | Vrai |
Boucle (lo) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Animation | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom du nœud (nn) | Chaîne(s) | FAUX | Vrai |
Nom de la propriété clé (kp) | Chaîne(s) [rq, tx, ty, tz, sx, sy, sz, bs, vb] | FAUX | Vrai |
Tampon d’image clé (Ko) | Octet (b), court (h), entier 32 (i) | Vrai | Vrai |
Tampon de valeur clé (kv) | Octet (b), court (h), entier 32 (i), flottant (f), vecteur 4 (v4) | Vrai | Vrai |
Mode (m) | Chaîne(s) [additif, absolu, relatif] | FAUX | Vrai |
Poids du mélange additif (ab) | Flotteur (f) | FAUX | FAUX |
Remarques :
Toutes les images clés de courbe se trouvent dans l’espace objet/nœud.
Le Mode
détermine la manière dont chaque image clé de courbe est appliquée au nœud.
additive
: L'image clé est ajoutée à la valeur de l'image de scène actuelle de la propriété nodes.
absolute
: L'image clé est la valeur exacte de l'image donnée.
relative
: L'image clé est ajoutée à la valeur de position de repos de la propriété nodes.
Les valeurs des propriétés correspondent à :
=0
= caché.
>=1
= visible.
rq
Rotation Quaternion et attend des valeurs v4
.
tx
Traduction 'X' et attend des valeurs f
.
ty
Traduction 'Y' et attend des valeurs f
.
tz
Traduction 'Z' et attend des valeurs f
.
sx
Échelle « X » et attend des valeurs f
.
sy
Échelle « Y » et attend des valeurs f
.
sz
Échelle « Z » et attend des valeurs f
.
bs
BlendShape Weight et attend des valeurs f
.
vb
Visibilité et attend des valeurs b
, h
ou i
.
Les propriétés tx
, ty
, tz
, sx
, sy
, sz
, bs
, vb
doivent être interpolées linéairement.
La propriété rq
doit être interpolée avec le quaternion slerp.
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Animation | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom du nœud (nn) | Chaîne(s) | FAUX | Vrai |
Mode (m) | Chaîne(s) [additif, absolu, relatif] | FAUX | Vrai |
Remplacer les courbes de translation (ot) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Remplacer les courbes de rotation (ou) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Remplacer les courbes d'échelle (os) | Octet (b) [Vrai, Faux] | FAUX | FAUX |
Remarques :
Voir les notes Curve
ci-dessus pour la définition de chaque valeur Mode
.
Override Translation Curves
doit être par défaut False
lorsqu'il n'est pas spécifié.
Override Rotation Curves
doit être par défaut False
lorsqu'il n'est pas spécifié.
Override Scale Curves
doit être par défaut False
lorsqu'il n'est pas spécifié.
Le nœud de remplacement et tous ses enfants doivent remplacer leur mode courbes par le nouveau mode.
Le nœud de remplacement doit être présent au moment du traitement afin de déterminer si un os enfant est un descendant.
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Animation | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | Vrai |
Tampon d’image clé (Ko) | Octet (b), court (h), entier 32 (i) | Vrai | Vrai |
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Déposer | Vrai | FAUX |
Mère | Racine | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Nom (n) | Chaîne(s) | FAUX | FAUX |
Fichier de référence (hachage de CastNode:File) (rf) | Entier 64 (l) | FAUX | Vrai |
Poste (p) | Vecteur 3 (v3) | FAUX | Vrai |
Rotation (r) | Vecteur 4 (v4) | FAUX | Vrai |
Échelle(s) | Vecteur 3 (v3) | FAUX | Vrai |
Champ | Type(s) | EstArray | Requis |
---|---|---|---|
Enfants | Aucun | Vrai | FAUX |
Mère | Racine | FAUX | Vrai |
Propriété (identifiant) | Type(s) | EstArray | Requis |
---|---|---|---|
Auteur (a) | Chaîne(s) | FAUX | FAUX |
Logiciel(s) | Chaîne(s) | FAUX | FAUX |
Axe vers le haut (vers le haut) | Chaîne(s) [x, y, z] | FAUX | FAUX |
Remarques :
Author
et Software
servent uniquement à baliser les fichiers de diffusion et n'ont aucune utilité en dehors des métadonnées.
Up Axis
peut être utilisé comme une indication au logiciel pour ajuster la scène afin qu'elle corresponde à un axe haut spécifique.
Un fichier de conversion peut avoir n'importe quel nombre de méta-nœuds, mais les propriétés conçues pour les indications ne doivent utiliser que la première instance du nœud de métadonnées.
Format conçu par DTZxPorter avec la contribution de la communauté.
Icônes par Smashicons