El objetivo de Cast es crear un formato fácil de usar para modelos, animaciones, materiales y mundos de juego. Además, el reparto debería poder producir las mismas escenas en cualquier software 3D.
Autodesk Maya (2012+): lanzamientos
Licuadora (3.0+): Lanzamientos
.NET Framework (Referencia): Bibliotecas/DotNet
.NET Framework (por Scobalula): Cast.NET
Python: Bibliotecas/Python
CastModelViewer (Por echo000): Github
SECast, un conversor de cast sin pérdidas: SECast
Nota: Si su herramienta admite la exportación para transmitir directamente, siempre es mejor.
Preguntas frecuentes: Preguntas frecuentes
Todos los archivos comienzan con un encabezado de conversión:
struct CastHeader{ uint32_t Magia; // char[4] cast (0x74736163)uint32_t Versión; // 0x1uint32_t Nodos raíz; // Número de nodos raíz, que contienen varios subnodos si es necesariouint32_t Flags; // Reservado para banderas o relleno, lo que sea necesario};
Un archivo de conversión es básicamente un grupo de nodos genéricos. Los nodos reciben una identificación registrada única, que puede indicarle al cargador cuáles son los datos y cómo manejarlos.
Después del encabezado de conversión hay una colección de nodos que deben ser del tipo CastId::Root.
Un nodo se parece a:
estructura CastNodeHeader{ Identificador CastId; // Se usa para indicar qué clase usa este nodosuint32_t NodeSize; // Tamaño de todos los datos y subdatos que siguen a nodeuint64_t NodeHash; // Hash único, como una identificación, utilizado para vincular nodos uint32_t PropertyCount; // El recuento de propiedades suint32_t ChildCount; // El recuento de nodos secundarios directos// Debemos leer hasta que alcance el tamaño del nodo, y eso significa que hemos terminado.// Los nodos están en un diseño de pila, por lo que es fácil de cargar, orden FILO.};
Hay varios ID de reparto registrados disponibles:
clase de enumeración CastId: uint32_t{ Raíz = 0x746F6F72, Modelo = 0x6C646F6D, Malla = 0x6873656D, Forma de mezcla = 0x68736C62, Esqueleto = 0x6C656B73, Hueso = 0x656E6F62, IKHandle = 0x64686B69, Restricción = 0x74736E63, Animación = 0x6D696E61, Curva = 0x76727563, Anulación del modo de curva = 0x564F4D43, Pista de notificación = 0x6669746E, Materiales = 0x6C74616D, Archivo = 0x656C6966, Instancia = 0x74736E69, Metadatos = 0x6174656D, };
Después de un nodo, está la lista de propiedades [Node.PropertyCount], una propiedad se parece a:
estructura CastPropertyHeader{ Identificador CastPropertyId; // El tipo de elemento de esta propiedaduint16_t NameSize; // El tamaño del nombre de esta propiedaduint32_t ArrayLength; // El número de elementos que contiene esta propiedad (1 para simple) // A continuación se muestra la cadena UTF-8 en minúsculas, tamaño del nombre, NO terminado en nulo // cast_property[ArrayLength] matriz de datos};
Para las propiedades, cast tiene varios tipos integrados:
clase de enumeración CastPropertyId: uint16_t{ Byte = 'b', //Corto = 'h', // Entero32 = 'i', // Entero64 = 'l', // Flotador = 'f', // Doble = 'd', // String = 's', // Cadena UTF-8 terminada en nulo Vector2 = 'v2', // Vector de precisión flotante XY Vector3 = 'v3', // Vector de precisión flotante XYZ Vector4 = 'v4'// Vector de precisión flotante XYZW};
Para leer un archivo de conversión, solo necesita atravesar los nodos raíz y sus hijos. Las propiedades siempre vienen antes que los hijos de un nodo. Cada nodo tiene su tamaño total y el de todos sus hijos, por lo que si un procesador no comprende la identificación de un nodo, puede omitir el nodo completo y continuar leyendo.
Los ID de conversión se almacenan como números enteros para que sea más rápido serializar y deserializar.
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Esqueleto, Malla, Material | Verdadero | FALSO |
Padre | Raíz | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | FALSO |
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Modelo | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | FALSO |
Búfer de posición de vértice (vp) | Vector 3 (v3) | Verdadero | Verdadero |
Búfer normal de vértice (vn) | Vector 3 (v3) | Verdadero | FALSO |
Búfer tangente de vértice (vt) | Vector 3 (v3) | Verdadero | FALSO |
Búfer de color de vértice (c%d) | Entero 32 (yo) | Verdadero | FALSO |
Tampón UV de vértice (u%d) | Vector 2 (v2) | Verdadero | FALSO |
Amortiguador óseo de peso de vértice (wb) | Entero 32 (i), corto (h), byte (b) | Verdadero | FALSO |
Búfer de valor de peso de vértice (wv) | Flotador (f) | Verdadero | FALSO |
Buffer de cara (f) | Entero 32 (i), corto (h), byte (b) | Verdadero | Verdadero |
Recuento de capas de color (cl) | Entero 32 (i), corto (h), byte (b) | FALSO | Verdadero si tiene capas de color, en caso contrario Falso |
Recuento de capas UV (ul) | Entero 32 (i), corto (h), byte (b) | FALSO | Verdadero si tiene capas ultravioleta, en caso contrario Falso |
Influencia máxima del peso (mi) | Entero 32 (i), corto (h), byte (b) | FALSO | Verdadero si tiene pesos, en caso contrario Falso |
Método de desollado (sm) | Cadena (s) [lineal, cuaternión] | FALSO | FALSO |
Material (Hash de CastNode:Material) (m) | Entero 64 (l) | FALSO | FALSO |
Notas :
Face Buffer
es un índice en los buffers de datos de vértices de las mallas actuales donde (0, 1, 2) son los primeros tres vértices de esta malla.
El Face Buffer
sigue el orden de bobinado CCW (diestro), esto puede ser diferente en otras API, donde es posible que tengas que reasignar los índices.
Si una cara contiene una combinación de índices no válida (0, 1, 1), (0, 1, 0), (0, 0, 0)
donde dos o más índices son iguales, es aceptable que el usuario que procesa estas caras ignórelos para renderizar correctamente la malla. Sería prudente presentar al usuario una advertencia indicando que esto sucedió.
Cada búfer de descriptor de vértice debe contener la misma cantidad de elementos, por ejemplo: si tiene 16 vértices, debe tener 16 normales si existen, 16 colores si el búfer existe. De lo contrario, se supone que están predeterminados/omitidos.
Los pesos son aditivos, lo que significa que tener el mismo hueso con 0.5
y 0.5
terminaría haciendo que los huesos influyan en 1.0
por ejemplo.
El método de skining predeterminado es linear
. Cuando se establece en quaternion
se utiliza la piel de cuaternión dual.
NUEVO 18/08/2024 : La especificación de color de vértice ha cambiado ; para admitir múltiples capas de color, se agregó un nuevo Color Layer Count (cl)
que imita la propiedad UV Layer Count (ul)
.
Para ser compatibles con versiones anteriores, los procesadores de conversión deben verificar cl
y usarlo de forma predeterminada junto con las nuevas propiedades de la capa c%d
.
Si la propiedad cl
no existe, un procesador debe verificar la propiedad vc
heredada, que es la única capa de color si existe.
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Modelo | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | Verdadero |
Forma base (Hash de CastNode:Mesh) (b) | Entero 64 (l) | FALSO | Verdadero |
Índices de vértices de forma objetivo (vi) | Byte (b), corto (h), entero 32 (i) | Verdadero | Verdadero |
Posiciones de vértices de forma objetivo (vp) | Vector 3 (v3) | Verdadero | Verdadero |
Báscula de peso objetivo (ts) | Flotador (f) | Verdadero | FALSO |
Notas :
La Base Shape
debe ser una malla fundida existente.
Los Target Shape Vertex Indices
y Target Shape Vertex Positions
deben tener la misma longitud que cuando están emparejados.
Target Shape Vertex Positions
son el valor final de cada posición de vértice modificada, ignorando el vértice correspondiente de Base Shape
.
Target Weight Scale
indica el valor máximo al que se puede deformar la forma del objetivo y debe ser por defecto 1.0
.
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Hueso, IKHandle, Restricción | Verdadero | FALSO |
Padre | Modelo | FALSO | Verdadero |
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Esqueleto | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | Verdadero |
Índice de padres (p) | Entero 32 (yo) | FALSO | FALSO |
Compensación de escala de segmento (ssc) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Posición local (lp) | Vector 3 (v3) | FALSO | FALSO |
Rotación local (lr) | Vector 4 (v4) | FALSO | FALSO |
Posición Mundial (wp) | Vector 3 (v3) | FALSO | FALSO |
Rotación mundial (wr) | Vector 4 (v4) | FALSO | FALSO |
Escala(s) | Vector 3 (v3) | FALSO | FALSO |
Notas :
Segment Scale Compensate
debe tener el valor predeterminado True
cuando no se especifica.
Scale
siempre es local al hueso actual.
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Esqueleto | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | FALSO |
Iniciar Bone Hash (algn) | Entero 64 (l) | FALSO | Verdadero |
Hash de hueso final (eb) | Entero 64 (l) | FALSO | Verdadero |
Hash de hueso objetivo (tb) | Entero 64 (l) | FALSO | FALSO |
Hash de hueso vectorial de polo (pv) | Entero 64 (l) | FALSO | FALSO |
Hash de hueso de polo (pb) | Entero 64 (l) | FALSO | FALSO |
Usar rotación de destino (tr) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Notas :
Use Target Rotation
debe tener el valor predeterminado False
cuando no se especifica.
Pole Bone
solo debe efectuar el giro de la cadena; en general, tienes un Pole Bone
o un Pole Vector Bone
.
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Esqueleto | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | FALSO |
Tipo de restricción (ct) | Cadena (s) [pt, o, sc] | FALSO | Verdadero |
Restricción Bone Hash (cb) | Entero 64 (l) | FALSO | Verdadero |
Hash de hueso objetivo (tb) | Entero 64 (l) | FALSO | Verdadero |
Mantener compensación (mes) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Saltar X (sx) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Saltar Y (sy) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Saltar Z (tamaño) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Notas :
Los valores del tipo de restricción corresponden a:
pt
Restricción de punto, que se aplica a las traducciones.
or
Orientar restricción, que se aplica a las rotaciones.
sc
Restricción de escala, que se aplica a escalas.
Mantener compensación debe tener el valor predeterminado False
cuando no se especifica.
Saltar X, Saltar Y y Saltar Z deben tener el valor predeterminado False
cuando no se especifican y hacen referencia a ignorar ese eje en la restricción.
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Archivo | Verdadero | FALSO |
Padre | Modelo | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | Verdadero |
Tipo (t) | Cadena(s) | FALSO | Verdadero |
Hash de archivo de Albedo (albedo) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo difuso (difuso) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo normal (normal) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo especular (especular) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo emisivo (emisivo) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo de brillo (brillo) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo de rugosidad (rugosidad) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo de oclusión ambiental (ao) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo de cavidad (cavidad) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo de anisotropía (aniso) | Entero 64 (l) | FALSO | FALSO |
Hash de archivo adicional (x) (%d adicional) | Entero 64 (l) | FALSO | FALSO |
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | CastNodo | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Camino (p) | Cadena(s) | FALSO | Verdadero |
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Esqueleto, Curva, Anulación de modo de curva, Pista de notificación | Verdadero | Verdadero |
Padre | Raíz | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | FALSO |
Velocidad de fotogramas (fr) | Flotador (f) | FALSO | Verdadero |
Bucle (lo) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Animación | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre de nodo (nn) | Cadena(s) | FALSO | Verdadero |
Nombre de propiedad clave (kp) | Cadena(s) [rq, tx, ty, tz, sx, sy, sz, bs, vb] | FALSO | Verdadero |
Búfer de fotogramas clave (kb) | Byte (b), corto (h), entero 32 (i) | Verdadero | Verdadero |
Búfer de valor clave (kv) | Byte (b), corto (h), entero 32 (i), flotante (f), vector 4 (v4) | Verdadero | Verdadero |
Modo (m) | Cadena(s) [aditiva, absoluta, relativa] | FALSO | Verdadero |
Peso de la mezcla de aditivos (ab) | Flotador (f) | FALSO | FALSO |
Notas :
Todos los fotogramas clave de curva están en el espacio de objeto/nodo.
El Mode
determina cómo se aplica cada fotograma clave de curva al nodo.
additive
: el fotograma clave se agrega al valor del fotograma de escena actual de la propiedad de nodos.
absolute
: el fotograma clave es el valor exacto para el fotograma dado.
relative
: el fotograma clave se agrega al valor de la posición de descanso de la propiedad de nodos.
Los valores de la propiedad corresponden a:
=0
= oculto.
>=1
= visible.
rq
Rotation Quaternion y espera valores v4
.
tx
traduce 'X' y espera valores f
.
ty
Traducción 'Y' y espera valores f
.
tz
traduce 'Z' y espera valores f
.
sx
Escala 'X' y espera valores f
.
sy
Escala 'Y' y espera valores f
.
sz
Escala 'Z' y espera valores f
.
bs
BlendShape Peso y espera valores f
.
vb
Visibilidad y valores esperados b
, h
o i
.
Las propiedades tx
, ty
, tz
, sx
, sy
, sz
, bs
, vb
deben interpolarse linealmente.
La propiedad rq
debe interpolarse con el cuaternión slerp.
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Animación | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre de nodo (nn) | Cadena(s) | FALSO | Verdadero |
Modo (m) | Cadena(s) [aditiva, absoluta, relativa] | FALSO | Verdadero |
Anular curvas de traducción (ot) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Anular curvas de rotación (o) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Anular curvas de escala (os) | Byte (b) [Verdadero, Falso] | FALSO | FALSO |
Notas:
Consulte las notas Curve
anteriores para conocer la definición de cada valor Mode
.
Override Translation Curves
debe tener el valor predeterminado False
cuando no se especifica.
Override Rotation Curves
debe tener el valor predeterminado False
cuando no se especifica.
Override Scale Curves
debe tener el valor predeterminado False
cuando no se especifica.
El nodo de anulación y todos sus hijos deben anular su modo de curvas al nuevo modo.
El nodo de anulación debe estar presente en el momento del procesamiento para poder determinar si un hueso hijo es descendiente.
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Animación | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | Verdadero |
Búfer de fotogramas clave (kb) | Byte (b), corto (h), entero 32 (i) | Verdadero | Verdadero |
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Archivo | Verdadero | FALSO |
Padre | Raíz | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Nombre (n) | Cadena(s) | FALSO | FALSO |
Archivo de referencia (Hash de CastNode:Archivo) (rf) | Entero 64 (l) | FALSO | Verdadero |
Posición (p) | Vector 3 (v3) | FALSO | Verdadero |
Rotación (r) | Vector 4 (v4) | FALSO | Verdadero |
Escala(s) | Vector 3 (v3) | FALSO | Verdadero |
Campo | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Niños | Ninguno | Verdadero | FALSO |
Padre | Raíz | FALSO | Verdadero |
Propiedad (identificación) | Tipo(s) | esmatriz | Requerido |
---|---|---|---|
Autor (un) | Cadena(s) | FALSO | FALSO |
Software(s) | Cadena(s) | FALSO | FALSO |
Eje arriba (arriba) | Cadena (s) [x, y, z] | FALSO | FALSO |
Notas:
Author
y Software
sirven solo para etiquetar archivos de transmisión y no tienen ningún uso fuera de los metadatos.
Up Axis
se puede utilizar como una pista para que el software ajuste la escena para que coincida con un eje ascendente específico.
Un archivo de conversión puede tener cualquier cantidad de metanodos, pero las propiedades diseñadas para sugerencias solo deben usar la primera instancia del nodo de metadatos.
Formato diseñado por DTZxPorter con aportes de la comunidad.
Iconos de Smashicons