O objetivo do elenco é criar um formato fácil de usar para modelos, animações, materiais e mundos de jogo. Além disso, o elenco deverá ser capaz de produzir as mesmas cenas em qualquer software 3D.
Autodesk Maya (2012+): lançamentos
Blender (3.0+): Lançamentos
.NET Framework (Referência): Bibliotecas/DotNet
.NET Framework (por Scobalula): Cast.NET
Python: Bibliotecas/Python
CastModelViewer (por echo000): Github
SECast, um conversor sem perdas para conversão: SECast
Nota: Se a sua ferramenta suporta exportação direta para transmissão, isso é sempre melhor.
Perguntas frequentes: Perguntas frequentes
Todos os arquivos começam com um cabeçalho de conversão:
struct CastHeader{ uint32_t Magic; // char[4] lançado (0x74736163)uint32_t Versão; //0x1uint32_t RootNodes; // Número de nós raiz, que contêm vários subnós, se necessáriouint32_t Flags; // Reservado para flags ou preenchimento, o que for necessário};
Um arquivo cast é basicamente um grupo de nós genéricos. Os nós recebem um ID registrado exclusivo, que pode informar ao carregador quais são os dados e como lidar com eles.
Após o cabeçalho de conversão há uma coleção de nós que devem ser do tipo CastId::Root.
Um nó se parece com:
estrutura CastNodeHeader{ Identificador CastId; // Usado para indicar qual classe este nó usauint32_t NodeSize; // Tamanho de todos os dados e subdados seguindo nodeuint64_t NodeHash; // Hash exclusivo, como um id, usado para vincular nós juntosuint32_t PropertyCount; // A contagem de propriedadesuint32_t ChildCount; // A contagem de nós filhos diretos // Devemos ler até que o tamanho do nó atinja, e isso significa que terminamos. // Os nós estão em um layout de pilha, então é fácil de carregar, ordem FILO.};
Existem vários IDs de elenco registrados disponíveis:
classe enum CastId: uint32_t{ Raiz = 0x746F6F72, Modelo = 0x6C646F6D, Malha = 0x6873656D, BlendShape = 0x68736C62, Esqueleto = 0x6C656B73, Osso = 0x656E6F62, IKHandle = 0x64686B69, Restrição = 0x74736E63, Animação = 0x6D696E61, Curva = 0x76727563, CurveModeOverride = 0x564F4D43, NotificationTrack = 0x6669746E, Material = 0x6C74616D, Arquivo = 0x656C6966, Instância = 0x74736E69, Metadados = 0x6174656D, };
Seguindo um nó, está a lista de propriedades [Node.PropertyCount], uma propriedade se parece com:
estrutura CastPropertyHeader{ Identificador CastPropertyId; // O tipo de elemento desta propriedadeuint16_t NameSize; // O tamanho do nome desta propriedadeuint32_t ArrayLength; // O número de elementos que esta propriedade contém (1 para único) // A seguir está a string UTF-8 minúscula, tamanho do tamanho do nome, NÃO terminada em nulo // cast_property[ArrayLength] array de dados};
Para propriedades, o cast possui vários tipos integrados:
classe enum CastPropertyId: uint16_t{ Byte = 'b', //Curto = 'h', // Inteiro32 = 'i', // Inteiro64 = 'l', // Flutuador = 'f', // Duplo = 'd', // String = 's', // String UTF-8 terminada em nulo Vector2 = 'v2', // Vetor de precisão flutuante XY Vector3 = 'v3', // Vetor de precisão flutuante XYZ Vector4 = 'v4' // Vetor de precisão flutuante XYZW};
Para ler um arquivo cast, você só precisa percorrer os nós raiz e seus filhos. As propriedades sempre vêm antes dos nós filhos. Cada nó tem o tamanho total de si mesmo e de todos os filhos; portanto, se um processador não entender o ID do nó, ele poderá pular o nó inteiro e continuar lendo.
Os IDs de conversão são armazenados como números inteiros para tornar a serialização e desserialização mais rápida.
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Esqueleto, Malha, Material | Verdadeiro | Falso |
Pai | Raiz | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Falso |
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Modelo | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Falso |
Buffer de posição de vértice (vp) | Vetor 3 (v3) | Verdadeiro | Verdadeiro |
Buffer normal de vértice (vn) | Vetor 3 (v3) | Verdadeiro | Falso |
Buffer tangente de vértice (vt) | Vetor 3 (v3) | Verdadeiro | Falso |
Buffer de cores de vértice (c%d) | Inteiro 32 (i) | Verdadeiro | Falso |
Buffer UV do vértice (u%d) | Vetor 2 (v2) | Verdadeiro | Falso |
Buffer ósseo de peso de vértice (wb) | Inteiro 32 (i), Curto (h), Byte (b) | Verdadeiro | Falso |
Buffer de valor de peso de vértice (wv) | Flutuador (f) | Verdadeiro | Falso |
Protetor facial (f) | Inteiro 32 (i), Curto (h), Byte (b) | Verdadeiro | Verdadeiro |
Contagem de camadas de cores (cl) | Inteiro 32 (i), Curto (h), Byte (b) | Falso | Verdadeiro se tiver camadas de cores, caso contrário, Falso |
Contagem de camadas UV (ul) | Inteiro 32 (i), Curto (h), Byte (b) | Falso | Verdadeiro se tiver camadas UV, caso contrário, Falso |
Influência Máxima do Peso (mi) | Inteiro 32 (i), Curto (h), Byte (b) | Falso | Verdadeiro se tiver pesos, senão Falso |
Método de esfola (sm) | String(s) [linear, quatérnio] | Falso | Falso |
Material (hash de CastNode:Material) (m) | Inteiro 64 (l) | Falso | Falso |
Notas :
Face Buffer
é um índice para os buffers de dados de vértices da malha atual, onde (0, 1, 2) são os três primeiros vértices desta malha.
O Face Buffer
segue a ordem de enrolamento CCW (destro), isso pode ser diferente em outras APIs, onde pode ser necessário remapear os índices.
Se uma face contém uma combinação de índice inválida (0, 1, 1), (0, 1, 0), (0, 0, 0)
onde dois ou mais índices são iguais, é aceitável que o usuário processe essas faces para ignore-os para renderizar a malha corretamente. Seria sensato apresentar ao usuário um aviso informando que isso aconteceu.
Cada buffer descritor de vértice deve conter o mesmo número de elementos, por exemplo: se você tiver 16 vértices, deverá ter 16 normais se existirem, 16 cores se o buffer existir. Caso contrário, presume-se que eles sejam padrão/ignorados.
Os pesos são aditivos, o que significa que ter o mesmo osso com 0.5
e 0.5
acabaria fazendo com que os ossos influenciassem 1.0
por exemplo.
O método de skin padrão é linear
. Quando definido como quaternion
a skin de quatérnio duplo é usada.
NOVO 18/08/2024 : A especificação de cores do vértice foi alterada , para suportar múltiplas camadas de cores, uma nova Color Layer Count (cl)
foi adicionada que imita a propriedade UV Layer Count (ul)
.
Para serem compatíveis com versões anteriores, os processadores de conversão devem verificar cl
e usá-lo por padrão junto com as novas propriedades da camada c%d
.
Se a propriedade cl
não existir, um processador deverá verificar a propriedade vc
herdada, que é a única camada de cores, se existir.
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Modelo | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Verdadeiro |
Forma Base (Hash de CastNode:Mesh) (b) | Inteiro 64 (l) | Falso | Verdadeiro |
Índices de vértices da forma alvo (vi) | Byte (b), Curto (h), Inteiro 32 (i) | Verdadeiro | Verdadeiro |
Posições de vértices da forma alvo (vp) | Vetor 3 (v3) | Verdadeiro | Verdadeiro |
Escala de Peso Alvo (ts) | Flutuador (f) | Verdadeiro | Falso |
Notas :
A Base Shape
deve ser uma malha fundida existente.
Os Target Shape Vertex Indices
e Target Shape Vertex Positions
devem ter o mesmo comprimento, pois estão emparelhados.
Target Shape Vertex Positions
é o valor final de cada posição de vértice alterada, ignorando o vértice correspondente da Base Shape
.
Target Weight Scale
indica o valor máximo para o qual a forma do alvo pode se deformar e deve ser padronizada como 1.0
.
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Osso, IKHandle, Restrição | Verdadeiro | Falso |
Pai | Modelo | Falso | Verdadeiro |
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Esqueleto | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Verdadeiro |
Índice pai (p) | Inteiro 32 (i) | Falso | Falso |
Compensação de escala de segmento (ssc) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Posição Local (lp) | Vetor 3 (v3) | Falso | Falso |
Rotação Local (lr) | Vetor 4 (v4) | Falso | Falso |
Posição Mundial (wp) | Vetor 3 (v3) | Falso | Falso |
Rotação Mundial (wr) | Vetor 4 (v4) | Falso | Falso |
Escala(s) | Vetor 3 (v3) | Falso | Falso |
Notas :
Segment Scale Compensate
deve ser padronizada como True
quando não especificada.
Scale
é sempre local ao osso atual.
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Esqueleto | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Falso |
Iniciar hash ósseo (sb) | Inteiro 64 (l) | Falso | Verdadeiro |
Fim do hash ósseo (eb) | Inteiro 64 (l) | Falso | Verdadeiro |
Hash ósseo alvo (tb) | Inteiro 64 (l) | Falso | Falso |
Hash de osso de vetor de pólo (pv) | Inteiro 64 (l) | Falso | Falso |
Hash de osso de pólo (pb) | Inteiro 64 (l) | Falso | Falso |
Usar rotação alvo (tr) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Notas :
Use Target Rotation
deve ser padronizado como False
quando não for especificado.
Pole Bone
deve afetar apenas a torção da corrente, em geral você tem um Pole Bone
ou um Pole Vector Bone
.
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Esqueleto | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Falso |
Tipo de restrição (ct) | String(s) [pt, ou, sc] | Falso | Verdadeiro |
Hash ósseo de restrição (cb) | Inteiro 64 (l) | Falso | Verdadeiro |
Hash ósseo alvo (tb) | Inteiro 64 (l) | Falso | Verdadeiro |
Manter deslocamento (mês) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Pular X (sx) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Pular Y (sy) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Pular Z (sz) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Notas :
Os valores do tipo de restrição correspondem a:
pt
Point Constraint, que se aplica a traduções.
or
Orient Constraint, que se aplica a rotações.
sc
Restrição de escala, que se aplica a escalas.
Manter o deslocamento deve ser padronizado como False
quando não for especificado.
Ignorar X, Ignorar Y e Ignorar Z devem ser padronizados como False
quando não especificados e referem-se a ignorar esse eixo na restrição.
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Arquivo | Verdadeiro | Falso |
Pai | Modelo | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Verdadeiro |
Tipo (t) | Corda(s) | Falso | Verdadeiro |
Albedo Arquivo Hash (albedo) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo difuso (difuso) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo normal (normal) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo especular (especular) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo emissivo (emissivo) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo brilhante (brilho) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo de rugosidade (rugosidade) | Inteiro 64 (l) | Falso | Falso |
Hash do arquivo de oclusão de ambiente (ao) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo de cavidade (cavidade) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo de anisotropia (aniso) | Inteiro 64 (l) | Falso | Falso |
Hash de arquivo extra (x) (extra%d) | Inteiro 64 (l) | Falso | Falso |
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | CastNode | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Caminho (p) | Corda(s) | Falso | Verdadeiro |
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Esqueleto, Curva, CurveModeOverride, NotificiationTrack | Verdadeiro | Verdadeiro |
Pai | Raiz | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Falso |
Taxa de quadros (fr) | Flutuador (f) | Falso | Verdadeiro |
Looping (lo) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Animação | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome do nó (nn) | Corda(s) | Falso | Verdadeiro |
Nome da propriedade chave (kp) | String(s) [rq, tx, ty, tz, sx, sy, sz, bs, vb] | Falso | Verdadeiro |
Buffer de quadro-chave (kb) | Byte (b), Curto (h), Inteiro 32 (i) | Verdadeiro | Verdadeiro |
Buffer de valor-chave (kv) | Byte (b), Curto (h), Inteiro 32 (i), Flutuante (f), Vetor 4 (v4) | Verdadeiro | Verdadeiro |
Modo (m) | String(s) [aditivo, absoluto, relativo] | Falso | Verdadeiro |
Peso da Mistura de Aditivos (ab) | Flutuador (f) | Falso | Falso |
Notas :
Todos os quadros-chave da curva estão no espaço objeto/nó.
O Mode
determina como cada quadro-chave da curva é aplicado ao nó.
additive
: o quadro-chave é adicionado ao valor do quadro de cena atual da propriedade dos nós.
absolute
: o quadro-chave é o valor exato do quadro fornecido.
relative
: o quadro-chave é adicionado ao valor da posição de repouso da propriedade dos nós.
Os valores dos imóveis correspondem a:
=0
= oculto.
>=1
= visível.
rq
Rotation Quaternion e espera valores v4
.
tx
Tradução 'X' e espera valores f
.
ty
Tradução 'Y' e espera valores f
.
tz
Tradução 'Z' e espera valores f
.
sx
Escala 'X' e espera valores f
.
sy
Escala 'Y' e espera valores f
.
sz
Escala 'Z' e espera valores f
.
bs
BlendShape Weight e espera valores f
.
vb
Visibilidade e espera valores b
, h
ou i
.
As propriedades tx
, ty
, tz
, sx
, sy
, sz
, bs
, vb
devem interpolar linearmente.
A propriedade rq
deve interpolar com o quaternion slerp.
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Animação | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome do nó (nn) | Corda(s) | Falso | Verdadeiro |
Modo (m) | String(s) [aditivo, absoluto, relativo] | Falso | Verdadeiro |
Substituir curvas de tradução (ot) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Substituir curvas de rotação (ou) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Substituir curvas de escala (os) | Byte (b) [Verdadeiro, Falso] | Falso | Falso |
Notas:
Consulte as notas Curve
acima para a definição de cada valor Mode
.
Override Translation Curves
deve ser padronizado como False
quando não especificado.
Override Rotation Curves
deve ser padronizado como False
quando não for especificado.
Override Scale Curves
deve ser padronizado como False
quando não for especificado.
O nó de substituição e todos os seus filhos devem substituir seu modo de curvas para o novo modo.
O nó de substituição deve estar presente no momento do processamento para determinar se um osso filho é descendente.
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Animação | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Verdadeiro |
Buffer de quadro-chave (kb) | Byte (b), Curto (h), Inteiro 32 (i) | Verdadeiro | Verdadeiro |
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Arquivo | Verdadeiro | Falso |
Pai | Raiz | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Nome (n) | Corda(s) | Falso | Falso |
Arquivo de referência (hash de CastNode:File) (rf) | Inteiro 64 (l) | Falso | Verdadeiro |
Posição (p) | Vetor 3 (v3) | Falso | Verdadeiro |
Rotação (r) | Vetor 4 (v4) | Falso | Verdadeiro |
Escala(s) | Vetor 3 (v3) | Falso | Verdadeiro |
Campo | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Crianças | Nenhum | Verdadeiro | Falso |
Pai | Raiz | Falso | Verdadeiro |
Propriedade (id) | Tipo(s) | ÉArray | Obrigatório |
---|---|---|---|
Autor (a) | Corda(s) | Falso | Falso |
Programas | Corda(s) | Falso | Falso |
Eixo superior (para cima) | Cadeia(s) [x, y, z] | Falso | Falso |
Notas:
Author
e Software
servem apenas para marcar arquivos de elenco e não têm uso fora dos metadados.
Up Axis
pode ser usado como uma dica para o software ajustar a cena para corresponder a um eixo superior específico.
Um arquivo de conversão pode ter qualquer número de meta-nós, mas as propriedades projetadas para dicas devem usar apenas a primeira instância do nó de metadados.
Formato desenvolvido por DTZxPorter com contribuições da comunidade.
Ícones por Smashicons