Das Ziel von cast ist es, ein einfach zu verwendendes Format für Modelle, Animationen, Materialien und Spielwelten zu schaffen. Darüber hinaus sollten die Darsteller in der Lage sein, dieselben Szenen in jeder 3D-Software zu produzieren.
Autodesk Maya (2012+): Veröffentlichungen
Blender (3.0+): Veröffentlichungen
.NET Framework (Referenz): Libraries/DotNet
.NET Framework (von Scobalula): Cast.NET
Python: Bibliotheken/Python
CastModelViewer (von echo000): Github
SECast, ein verlustfreier Konverter zum Streamen: SECast
Hinweis: Wenn Ihr Tool den Export zum direkten Gießen unterstützt, ist das immer besser.
Häufig gestellte Fragen: FAQ
Alle Dateien beginnen mit einem Cast-Header:
struct CastHeader{ uint32_t Magic; // char[4] cast (0x74736163)uint32_t Version; // 0x1uint32_t RootNodes; // Anzahl der Wurzelknoten, die bei Bedarf verschiedene Unterknoten enthaltenuint32_t Flags; // Reserviert für Flags oder Auffüllung, je nachdem, was benötigt wird};
Eine Cast-Datei ist im Grunde eine Gruppe generischer Knoten. Knoten erhalten eine eindeutige registrierte ID, die dem Lader mitteilen kann, um welche Daten es sich handelt und wie er damit umgehen soll.
Dem Cast-Header folgt eine Sammlung von Knoten, die vom Typ CastId::Root sein müssen.
Ein Knoten sieht so aus:
struct CastNodeHeader{ CastId-Bezeichner; // Wird verwendet, um anzugeben, welche Klasse dieser Knoten verwendetsuint32_t NodeSize; // Größe aller Daten und Unterdaten nach dem nodeuint64_t NodeHash; // Eindeutiger Hash, wie eine ID, der zum Verknüpfen von Knoten verwendet wirduint32_t PropertyCount; // Die Anzahl der Eigenschaftenuint32_t ChildCount; // Die Anzahl der direkten untergeordneten Knoten// Wir müssen lesen, bis die Knotengröße erreicht ist, und das bedeutet, dass wir fertig sind.// Die Knoten befinden sich in einem Stapellayout, sodass das Laden in FILO-Reihenfolge einfach ist.};
Es sind mehrere registrierte Besetzungs-IDs verfügbar:
Enum-Klasse CastId: uint32_t{ Wurzel = 0x746F6F72, Modell = 0x6C646F6D, Mesh = 0x6873656D, BlendShape = 0x68736C62, Skelett = 0x6C656B73, Knochen = 0x656E6F62, IKHandle = 0x64686B69, Einschränkung = 0x74736E63, Animation = 0x6D696E61, Kurve = 0x76727563, CurveModeOverride = 0x564F4D43, NotificationTrack = 0x6669746E, Material = 0x6C74616D, Datei = 0x656C6966, Instanz = 0x74736E69, Metadaten = 0x6174656D, };
Auf einen Knoten folgt die Liste der Eigenschaften [Node.PropertyCount]. Eine Eigenschaft sieht folgendermaßen aus:
struct CastPropertyHeader{ CastPropertyId-Bezeichner; // Der Elementtyp dieser Eigenschaftuint16_t NameSize; // Die Größe des Namens dieser Eigenschaftuint32_t ArrayLength; // Die Anzahl der Elemente, die diese Eigenschaft enthält (1 für Single)// Es folgt ein UTF-8-String in Kleinbuchstaben, die Größe des Namens, NICHT mit Null terminiert// cast_property[ArrayLength] Array von Daten};
Für Eigenschaften verfügt cast über mehrere integrierte Typen:
Enum-Klasse CastPropertyId: uint16_t{ Byte = 'b', //Short = 'h', // Integer32 = 'i', // Integer64 = 'l', // Float = 'f', // Double = 'd', // String = 's', // Nullterminierter UTF-8-String Vector2 = 'v2', // Float-Präzisionsvektor XY Vector3 = 'v3', // Float-Präzisionsvektor XYZ Vector4 = 'v4'// Float-Präzisionsvektor XYZW};
Um eine Cast-Datei zu lesen, müssen Sie lediglich die Wurzelknoten und ihre untergeordneten Knoten durchlaufen. Eigenschaften stehen immer vor den untergeordneten Knoten eines Knotens. Jeder Knoten hat die Gesamtgröße von sich selbst und allen untergeordneten Knoten. Wenn ein Prozessor also eine Knoten-ID nicht versteht, kann er den gesamten Knoten überspringen und mit dem Lesen fortfahren.
Cast-IDs werden als Ganzzahlen gespeichert, um die Serialisierung und Deserialisierung zu beschleunigen.
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Skelett, Mesh, Material | WAHR | FALSCH |
Elternteil | Wurzel | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | FALSCH |
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Modell | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | FALSCH |
Vertex-Positionspuffer (vp) | Vektor 3 (v3) | WAHR | WAHR |
Vertex-Normalpuffer (vn) | Vektor 3 (v3) | WAHR | FALSCH |
Scheitelpunkt-Tangentenpuffer (vt) | Vektor 3 (v3) | WAHR | FALSCH |
Vertex-Farbpuffer (c%d) | Ganzzahl 32 (i) | WAHR | FALSCH |
Vertex UV-Puffer (u%d) | Vektor 2 (v2) | WAHR | FALSCH |
Vertex Weight Bone Buffer (wb) | Ganzzahl 32 (i), Kurz (h), Byte (b) | WAHR | FALSCH |
Scheitelpunktgewichtswertpuffer (wv) | Float (f) | WAHR | FALSCH |
Gesichtspuffer (f) | Ganzzahl 32 (i), Kurz (h), Byte (b) | WAHR | WAHR |
Anzahl der Farbschichten (cl) | Ganzzahl 32 (i), Kurz (h), Byte (b) | FALSCH | True, wenn Farbebenen vorhanden sind, andernfalls False |
Anzahl der UV-Schichten (ul) | Ganzzahl 32 (i), Kurz (h), Byte (b) | FALSCH | True, wenn UV-Schichten vorhanden sind, andernfalls False |
Maximaler Gewichtseinfluss (mi) | Ganzzahl 32 (i), Kurz (h), Byte (b) | FALSCH | Wahr, wenn Gewichte vorhanden sind, sonst Falsch |
Enthäutungsmethode (sm) | String(s) [linear, Quaternion] | FALSCH | FALSCH |
Material (Hash von CastNode:Material) (m) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Hinweise :
Face Buffer
ist ein Index in die Scheitelpunktdatenpuffer des aktuellen Netzes, wobei (0, 1, 2) die ersten drei Eckpunkte dieses Netzes sind.
Der Face Buffer
folgt der Wicklungsreihenfolge gegen den Uhrzeigersinn (Rechtshänder). Dies kann bei anderen APIs anders sein, wo Sie möglicherweise die Indizes neu zuordnen müssen.
Wenn ein Gesicht eine ungültige Indexkombination (0, 1, 1), (0, 1, 0), (0, 0, 0)
enthält, bei der zwei oder mehr Indizes gleich sind, ist dies für den Benutzer, der diese Gesichter verarbeitet, akzeptabel Ignorieren Sie sie, um das Netz richtig zu rendern. Es wäre ratsam, dem Benutzer eine Warnung anzuzeigen, dass dies passiert ist.
Jeder Scheitelpunktdeskriptorpuffer muss die gleiche Anzahl an Elementen enthalten. Beispiel: Wenn Sie 16 Scheitelpunkte haben, müssen Sie 16 Normalen haben, wenn sie vorhanden sind, und 16 Farben, wenn der Puffer vorhanden ist. Andernfalls wird davon ausgegangen, dass sie standardmäßig sind bzw. übersprungen werden.
Gewichte sind additiv, was bedeutet, dass der gleiche Knochen mit 0.5
und 0.5
letztendlich dazu führen würde, dass die Knochen beispielsweise 1.0
beeinflussen.
Die Standard-Skinning-Methode ist linear
. Bei der Einstellung quaternion
wird Dual-Quaternion-Skinning verwendet.
NEU 18.08.2024 : Die Vertex-Farbspezifikation hat sich geändert . Um mehrere Farbebenen zu unterstützen, wurde eine neue Color Layer Count (cl)
hinzugefügt, die die Eigenschaft UV Layer Count (ul)
nachahmt.
Um abwärtskompatibel zu sein, sollten Cast-Prozessoren nach cl
suchen und dieses standardmäßig zusammen mit den neuen c%d
Ebeneneigenschaften verwenden.
Wenn die cl
Eigenschaft nicht vorhanden ist, sollte ein Prozessor nach der alten vc
Eigenschaft suchen, bei der es sich um die einzige Farbebene handelt, falls vorhanden.
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Modell | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | WAHR |
Basisform (Hash von CastNode:Mesh) (b) | Ganzzahl 64 (l) | FALSCH | WAHR |
Scheitelpunktindizes der Zielform (vi) | Byte (b), Short (h), Integer 32 (i) | WAHR | WAHR |
Zielform-Scheitelpunktpositionen (vp) | Vektor 3 (v3) | WAHR | WAHR |
Zielgewichtsskala (ts) | Float (f) | WAHR | FALSCH |
Hinweise :
Die Base Shape
muss ein vorhandenes Gussnetz sein.
Die Target Shape Vertex Indices
und Target Shape Vertex Positions
müssen die gleiche Länge haben, da sie gepaart sind.
Target Shape Vertex Positions
sind der Endwert jeder geänderten Scheitelpunktposition, wobei der entsprechende Scheitelpunkt der Base Shape
ignoriert wird.
Target Weight Scale
gibt den Maximalwert an, auf den sich die Zielform verformen kann, und sollte standardmäßig 1.0
betragen.
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Knochen, IKHandle, Einschränkung | WAHR | FALSCH |
Elternteil | Modell | FALSCH | WAHR |
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Skeleton | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | WAHR |
Übergeordneter Index (p) | Ganzzahl 32 (i) | FALSCH | FALSCH |
Segmentskalenkompensation (ssc) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Lokale Position (lp) | Vektor 3 (v3) | FALSCH | FALSCH |
Lokale Rotation (lr) | Vektor 4 (v4) | FALSCH | FALSCH |
Weltposition (wp) | Vektor 3 (v3) | FALSCH | FALSCH |
Weltrotation (wr) | Vektor 4 (v4) | FALSCH | FALSCH |
Maßstab(en) | Vektor 3 (v3) | FALSCH | FALSCH |
Hinweise :
Segment Scale Compensate
sollte standardmäßig „ True
sein, wenn nichts angegeben ist.
Scale
bezieht sich immer lokal auf den aktuellen Knochen.
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Skeleton | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | FALSCH |
Starten Sie Bone Hash (sb) | Ganzzahl 64 (l) | FALSCH | WAHR |
End Bone Hash (eb) | Ganzzahl 64 (l) | FALSCH | WAHR |
Target Bone Hash (tb) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Pole Vector Bone Hash (pv) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Pole Bone Hash (pb) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Zielrotation verwenden (tr) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Hinweise :
Wenn Use Target Rotation
nicht angegeben ist, sollte die Standardeinstellung False
sein.
Pole Bone
darf nur die Drehung der Kette bewirken, im Allgemeinen haben Sie entweder einen Pole Bone
oder einen Pole Vector Bone
.
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Skeleton | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | FALSCH |
Einschränkungstyp (ct) | Zeichenfolge(n) [pt, or, sc] | FALSCH | WAHR |
Constraint Bone Hash (cb) | Ganzzahl 64 (l) | FALSCH | WAHR |
Target Bone Hash (tb) | Ganzzahl 64 (l) | FALSCH | WAHR |
Versatz beibehalten (Monat) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
X überspringen (sx) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Überspringen Y (sy) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Überspringen Z (sz) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Hinweise :
Die Einschränkungstypwerte entsprechen:
pt
Punktbeschränkung, die für Übersetzungen gilt.
or
Orientierungsbeschränkung, die für Rotationen gilt.
sc
Skalenbeschränkung, die für Skalen gilt.
„Offset beibehalten“ sollte standardmäßig False
sein, wenn nichts angegeben wird.
False
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Datei | WAHR | FALSCH |
Elternteil | Modell | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | WAHR |
Typ (t) | Zeichenfolge(n) | FALSCH | WAHR |
Albedo-Datei-Hash (Albedo) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Diffuse Datei-Hash (diffuse) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Normaler Datei-Hash (normal) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Specular File Hash (spekular) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Emissiver Datei-Hash (emissiv) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Glanzdatei-Hash (Glanz) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Rauheitsdatei-Hash (Rauheit) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Ambient Occlusion File Hash (ao) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Cavity-Datei-Hash (Cavity) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Anisotropie-Datei-Hash (Aniso) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Extra (x) Datei-Hash (extra%d) | Ganzzahl 64 (l) | FALSCH | FALSCH |
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | CastNode | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Pfad (p) | Zeichenfolge(n) | FALSCH | WAHR |
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Skelett, Kurve, CurveModeOverride, NotificationTrack | WAHR | WAHR |
Elternteil | Wurzel | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | FALSCH |
Framerate (fr) | Float (f) | FALSCH | WAHR |
Looping (lo) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Animation | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Knotenname (nn) | Zeichenfolge(n) | FALSCH | WAHR |
Name der Schlüsseleigenschaft (kp) | Zeichenfolge(n) [rq, tx, ty, tz, sx, sy, sz, bs, vb] | FALSCH | WAHR |
Keyframe-Puffer (KB) | Byte (b), Short (h), Integer 32 (i) | WAHR | WAHR |
Schlüsselwertpuffer (kv) | Byte (b), Short (h), Integer 32 (i), Float (f), Vector 4 (v4) | WAHR | WAHR |
Modus (m) | String(s) [additiv, absolut, relativ] | FALSCH | WAHR |
Additivmischungsgewicht (ab) | Float (f) | FALSCH | FALSCH |
Hinweise :
Alle Kurven-Keyframes befinden sich im Objekt-/Knotenraum.
Der Mode
bestimmt, wie jeder Kurven-Keyframe auf den Knoten angewendet wird.
additive
: Der Keyframe wird zum aktuellen Szenenbildwert der Knoteneigenschaft hinzugefügt.
absolute
: Der Keyframe ist der genaue Wert für den angegebenen Frame.
relative
: Der Keyframe wird zum Ruhepositionswert der Knoteneigenschaft hinzugefügt.
Die Eigenschaftswerte entsprechen:
=0
= ausgeblendet.
>=1
= sichtbar.
rq
Rotation Quaternion und erwartet v4
Werte.
tx
Übersetzung 'X' und erwartet f
Werte.
ty
Übersetzung 'Y' und erwartet f
Werte.
tz
Übersetzung 'Z' und erwartet f
Werte.
sx
Skaliert 'X' und erwartet f
Werte.
sy
Skaliert 'Y' und erwartet f
Werte.
sz
Skaliert 'Z' und erwartet f
Werte.
bs
BlendShape Weight und erwartet f
Werte.
vb
Sichtbarkeit und erwartet b
, h
oder i
Werte.
Die Eigenschaften tx
, ty
, tz
, sx
, sy
, sz
, bs
, vb
sollten linear interpolieren.
Die Eigenschaft rq
sollte mit Quaternion slerp interpolieren.
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Animation | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Knotenname (nn) | Zeichenfolge(n) | FALSCH | WAHR |
Modus (m) | String(s) [additiv, absolut, relativ] | FALSCH | WAHR |
Übersetzungskurven überschreiben (ot) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Rotationskurven überschreiben (oder) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Skalenkurven überschreiben (OS) | Byte (b) [Wahr, Falsch] | FALSCH | FALSCH |
Hinweise:
Die Definition der einzelnen Mode
finden Sie oben in Curve
.
Override Translation Curves
sollte standardmäßig auf False
gesetzt sein, wenn nicht angegeben.
Override Rotation Curves
sollte standardmäßig auf False
gesetzt sein, wenn nicht angegeben.
Override Scale Curves
sollte standardmäßig auf False
gesetzt sein, wenn nichts angegeben ist.
Der Überschreibungsknoten und alle seine untergeordneten Knoten sollten ihren Kurvenmodus auf den neuen Modus überschreiben.
Der Override-Knoten muss zum Zeitpunkt der Verarbeitung vorhanden sein, um festzustellen, ob ein untergeordneter Bone ein Nachkomme ist.
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Animation | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | WAHR |
Keyframe-Puffer (KB) | Byte (b), Short (h), Integer 32 (i) | WAHR | WAHR |
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Datei | WAHR | FALSCH |
Elternteil | Wurzel | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Name(n) | Zeichenfolge(n) | FALSCH | FALSCH |
Referenzdatei (Hash von CastNode:File) (rf) | Ganzzahl 64 (l) | FALSCH | WAHR |
Position (p) | Vektor 3 (v3) | FALSCH | WAHR |
Drehung (r) | Vektor 4 (v4) | FALSCH | WAHR |
Maßstab(en) | Vektor 3 (v3) | FALSCH | WAHR |
Feld | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Kinder | Keiner | WAHR | FALSCH |
Elternteil | Wurzel | FALSCH | WAHR |
Eigenschaft (ID) | Typ(en) | IsArray | Erforderlich |
---|---|---|---|
Autor (a) | Zeichenfolge(n) | FALSCH | FALSCH |
Software(n) | Zeichenfolge(n) | FALSCH | FALSCH |
Aufwärtsachse (oben) | Zeichenfolge(n) [x, y, z] | FALSCH | FALSCH |
Hinweise:
Author
und Software
dienen nur zum Markieren von Besetzungsdateien und haben außerhalb von Metadaten keine Verwendung.
Up Axis
kann als Hinweis für die Software verwendet werden, um die Szene an eine bestimmte Aufwärtsachse anzupassen.
Eine Umwandlungsdatei kann eine beliebige Anzahl von Metaknoten haben, aber für Hinweise konzipierte Eigenschaften sollten nur die erste Metadatenknoteninstanz verwenden.
Von DTZxPorter mit Beiträgen der Community entwickeltes Format.
Symbole von Smashicons