Цель каста — создать простой в использовании формат для моделей, анимации, материалов и игровых миров. Кроме того, актеры должны иметь возможность создавать одни и те же сцены в любом 3D-программном обеспечении.
Autodesk Maya (2012+): выпуски
Blender (3.0+): релизы
.NET Framework (Справочник): Библиотеки/DotNet
.NET Framework (от Scobalula): Cast.NET
Python: библиотеки/Python
CastModelViewer (от echo000): Github
SECast, конвертер без потерь для преобразования: SECast
Примечание. Если ваш инструмент поддерживает прямой экспорт для трансляции, это всегда лучше.
Часто задаваемые вопросы: FAQ
Все файлы начинаются с приведения заголовка:
struct CastHeader { uint32_t Magic; // char[4] cast (0x74736163)uint32_t Version; // 0x1uint32_t RootNodes; // Количество корневых узлов, которые при необходимости содержат различные подузлы uint32_t Flags; // Зарезервировано для флагов или заполнения, в зависимости от того, что необходимо};
Файл приведения — это, по сути, группа общих узлов. Узлам присваивается уникальный зарегистрированный идентификатор, который может сообщить загрузчику, что это за данные и как с ними обращаться.
За заголовком приведения следует коллекция узлов, которая должна иметь тип CastId::Root.
Узел выглядит так:
структура CastNodeHeader { Идентификатор CastId; // Используется для обозначения того, какой класс использует этот узел suint32_t NodeSize; // Размер всех данных и дополнительных данных, следующих за nodeuint64_t NodeHash; // Уникальный хеш, например идентификатор, используемый для связи узлов друг с другом uint32_t PropertyCount; // Количество свойств uint32_t ChildCount; // Количество прямых дочерних узлов // Мы должны читать до тех пор, пока не будет достигнут размер узла, и это означает, что мы закончили. // Узлы расположены в виде стека, поэтому их легко загружать, порядок FILO.};
Доступно несколько зарегистрированных идентификаторов трансляции:
класс перечисления CastId: uint32_t{ Корень = 0x746F6F72, Модель = 0x6C646F6D, Сетка = 0x6873656D, БлендШейп = 0x68736C62, Скелет = 0x6C656B73, Кость = 0x656E6F62, IKHandle = 0x64686B69, Ограничение = 0x74736E63, Анимация = 0x6D696E61, Кривая = 0x76727563, CurveModeOverride = 0x564F4D43, NotificationTrack = 0x6669746E, Материал = 0x6C74616D, Файл = 0x656C6966, Экземпляр = 0x74736E69, Метаданные = 0x6174656D, };
После узла идет список свойств [Node.PropertyCount], свойство выглядит следующим образом:
структура CastPropertyHeader { Идентификатор CastPropertyId; // Тип элемента этого свойстваuint16_t NameSize; // Размер имени этого свойства uint32_t ArrayLength; // Количество элементов, содержащихся в этом свойстве (1 для одного)// Далее следует строка в нижнем регистре UTF-8, размер имени, НЕ завершающийся нулем // cast_property[ArrayLength] массив данных};
Для свойств приведение имеет несколько встроенных типов:
класс перечисления CastPropertyId: uint16_t{ Byte = 'b', //Короткий = 'h', // Integer32 = 'i', // Integer64 = 'l', // Float = 'f', // Double = 'd', // String = 's', // строка UTF-8 с нулевым завершением Vector2 = 'v2', // Вектор XY с плавающей запятой Vector3 = 'v3', // Вектор точности с плавающей запятой XYZ Vector4 = 'v4'// Вектор точности с плавающей запятой XYZW};
Чтобы прочитать файл приведения, вам просто нужно пройти через корневые узлы и их дочерние узлы. Свойства всегда предшествуют дочерним узлам. Каждый узел имеет общий размер самого себя и всех дочерних узлов, поэтому, если процессор не понимает идентификатор узла, он может пропустить весь узел и продолжить чтение.
Идентификаторы приведения хранятся в виде целых чисел, что ускоряет сериализацию и десериализацию.
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Скелет, Сетка, Материал | Истинный | ЛОЖЬ |
Родитель | Корень | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | ЛОЖЬ |
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Модель | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | ЛОЖЬ |
Буфер позиции вершин (vp) | Вектор 3 (v3) | Истинный | Истинный |
Вершинный нормальный буфер (vn) | Вектор 3 (v3) | Истинный | ЛОЖЬ |
Касательный буфер вершин (vt) | Вектор 3 (v3) | Истинный | ЛОЖЬ |
Буфер цвета вершин (c%d) | Целое число 32 (я) | Истинный | ЛОЖЬ |
Вершинный УФ-буфер (u%d) | Вектор 2 (v2) | Истинный | ЛОЖЬ |
Костный буфер Vertex Weight (wb) | Целое число 32 (i), короткое (h), байтовое (b) | Истинный | ЛОЖЬ |
Буфер значений веса вершин (wv) | Поплавок (ж) | Истинный | ЛОЖЬ |
Лицевой буфер (f) | Целое число 32 (i), короткое (h), байтовое (b) | Истинный | Истинный |
Количество цветных слоев (cl) | Целое число 32 (i), короткое (h), байтовое (b) | ЛОЖЬ | True, если есть цветные слои, иначе False |
Количество УФ-слоев (ul) | Целое число 32 (i), короткое (h), байтовое (b) | ЛОЖЬ | True, если есть UV-слои, иначе False |
Максимальное влияние веса (ми) | Целое число 32 (i), короткое (h), байтовое (b) | ЛОЖЬ | True, если имеет веса, иначе False |
Метод снятия шкуры (см) | Строка(ы) [линейная, кватернион] | ЛОЖЬ | ЛОЖЬ |
Материал (хэш CastNode:Material) (m) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Примечания :
Face Buffer
— это индекс буферов данных вершин текущей сетки, где (0, 1, 2) — первые три вершины этой сетки.
Face Buffer
следует порядку обхода CCW (правостороннему), в других API он может быть другим, где вам, возможно, придется переназначить индексы.
Если лицо содержит недопустимую комбинацию индексов (0, 1, 1), (0, 1, 0), (0, 0, 0)
где два или более индексов одинаковы, пользователю, обрабатывающему эти лица, разрешено игнорируйте их, чтобы правильно визуализировать сетку. Было бы разумно предоставить пользователю предупреждение о том, что это произошло.
Каждый буфер дескриптора вершин должен содержать одинаковое количество элементов, например: если у вас 16 вершин, у вас должно быть 16 нормалей, если они существуют, 16 цветов, если буфер существует. В противном случае предполагается, что они установлены по умолчанию/пропущены.
Веса являются аддитивными, что означает, что наличие одной и той же кости с 0.5
и 0.5
в конечном итоге приведет к тому, что кости будут влиять, например, 1.0
.
Метод скининга по умолчанию — linear
. Если установлено значение quaternion
используется двойной кватернионный скин.
НОВИНКА, 18 августа 2024 г .: изменена спецификация цвета вершин. Для поддержки нескольких цветовых слоев было добавлено новое Color Layer Count (cl)
которое имитирует свойство UV Layer Count (ul)
.
Чтобы обеспечить обратную совместимость, процессоры приведения должны проверять cl
и использовать его по умолчанию вместе с новыми свойствами слоя c%d
.
Если свойство cl
не существует, процессор должен проверить наличие устаревшего свойства vc
, которое является единственным цветовым слоем, если оно существует.
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Модель | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | Истинный |
Базовая форма (хеш CastNode:Mesh) (b) | Целое число 64 (л) | ЛОЖЬ | Истинный |
Индексы вершин целевой формы (vi) | Байт (b), короткий (h), целое число 32 (i) | Истинный | Истинный |
Позиции вершин целевой формы (vp) | Вектор 3 (v3) | Истинный | Истинный |
Целевая шкала веса (тс) | Поплавок (ж) | Истинный | ЛОЖЬ |
Примечания :
Base Shape
должна быть существующей литой сеткой.
Target Shape Vertex Indices
и Target Shape Vertex Positions
должны быть одинаковой длины, поскольку они соединены в пары.
Target Shape Vertex Positions
— это окончательное значение каждой измененной позиции вершины, игнорирующее соответствующую вершину Base Shape
.
Target Weight Scale
указывает максимальное значение, до которого может деформироваться целевая форма, и по умолчанию должно быть равно 1.0
.
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Кость, IKHandle, Ограничение | Истинный | ЛОЖЬ |
Родитель | Модель | ЛОЖЬ | Истинный |
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Скелет | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | Истинный |
Родительский индекс (п) | Целое число 32 (я) | ЛОЖЬ | ЛОЖЬ |
Компенсация масштаба сегмента (ssc) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Местная позиция (lp) | Вектор 3 (v3) | ЛОЖЬ | ЛОЖЬ |
Локальное вращение (слева) | Вектор 4 (v4) | ЛОЖЬ | ЛОЖЬ |
Мировая позиция (wp) | Вектор 3 (v3) | ЛОЖЬ | ЛОЖЬ |
Мировое вращение (п) | Вектор 4 (v4) | ЛОЖЬ | ЛОЖЬ |
Масштаб(ы) | Вектор 3 (v3) | ЛОЖЬ | ЛОЖЬ |
Примечания :
Если Segment Scale Compensate
не указан, по умолчанию он должен иметь значение True
.
Scale
всегда локальный для текущей кости.
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Скелет | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | ЛОЖЬ |
Начать Bone Hash (sb) | Целое число 64 (л) | ЛОЖЬ | Истинный |
End Bone Hash (eb) | Целое число 64 (л) | ЛОЖЬ | Истинный |
Целевой хэш кости (ТБ) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Полюсный векторный костный хэш (pv) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Полюсный костяной хэш (pb) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Использовать вращение цели (tr) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Примечания :
Если Use Target Rotation
умолчанию не указан, он должен иметь значение False
.
Pole Bone
должна влиять только на скручивание цепи, обычно у вас есть либо Pole Bone
, либо Pole Vector Bone
.
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Скелет | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | ЛОЖЬ |
Тип ограничения (ct) | Строка (s) [pt или sc] | ЛОЖЬ | Истинный |
Ограничение Bone Hash (cb) | Целое число 64 (л) | ЛОЖЬ | Истинный |
Целевой хэш кости (ТБ) | Целое число 64 (л) | ЛОЖЬ | Истинный |
Сохранить смещение (мес.) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Пропустить X (sx) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Пропустить Y (сы) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Пропустить Z (sz) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Примечания :
Значения типа ограничения соответствуют:
pt
Point Constraint, применимый к переводам.
or
«Ограничение ориентации», которое применяется к поворотам.
sc
Scale Constraint, которое применяется к масштабам.
Если параметр «Сохранять смещение» не указан, по умолчанию должно быть установлено значение False
.
Пропустить X, Пропустить Y и Пропустить Z по умолчанию должны иметь значение False
если они не указаны, и относятся к игнорированию этой оси в ограничении.
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Файл | Истинный | ЛОЖЬ |
Родитель | Модель | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | Истинный |
Тип (т) | Строка (ы) | ЛОЖЬ | Истинный |
Хэш файла Альбедо (альбедо) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Диффузный хэш файла (диффузный) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Обычный хеш файла (обычный) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Зеркальный хэш файла (зеркальный) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Эмиссионный хэш файла (эмиссивный) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Глянец Хэша файла (глянец) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Хэш файла шероховатости (шероховатость) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Хэш файла Ambient Occlusion (ao) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Хэш файла полости (полость) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Хэш файла анизотропии (aniso) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Дополнительный (x) хэш файла (extra%d) | Целое число 64 (л) | ЛОЖЬ | ЛОЖЬ |
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | CastNode | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Путь (п) | Строка (ы) | ЛОЖЬ | Истинный |
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Скелет, Кривая, CurveModeOverride, NotificiationTrack | Истинный | Истинный |
Родитель | Корень | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | ЛОЖЬ |
Частота кадров (фр.) | Поплавок (ж) | ЛОЖЬ | Истинный |
Цикл (ло) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Анимация | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя узла (nn) | Строка (ы) | ЛОЖЬ | Истинный |
Имя ключевого свойства (кп) | Строка (s) [rq, tx, ty, tz, sx, sy, sz, bs, vb] | ЛОЖЬ | Истинный |
Буфер ключевых кадров (КБ) | Байт (b), короткий (h), целое число 32 (i) | Истинный | Истинный |
Буфер ключевого значения (кВ) | Байт (b), короткий (h), целое число 32 (i), число с плавающей запятой (f), вектор 4 (v4) | Истинный | Истинный |
Режим (м) | Строка(ы) [добавочная, абсолютная, относительная] | ЛОЖЬ | Истинный |
Вес смеси добавок (ab) | Поплавок (ж) | ЛОЖЬ | ЛОЖЬ |
Примечания :
Все ключевые кадры кривой находятся в пространстве объектов/узлов.
Mode
определяет, как каждый ключевой кадр кривой применяется к узлу.
additive
: Ключевой кадр добавляется к текущему значению кадра сцены свойства узлов.
absolute
: Ключевой кадр представляет собой точное значение для данного кадра.
relative
: ключевой кадр добавляется к значению позиции покоя свойства узлов.
Значения свойств соответствуют:
=0
= скрыто.
>=1
= видимый.
rq
Rotation Quaternion и ожидает значений v4
.
tx
Переводит «X» и ожидает значений f
.
ty
Переводит 'Y' и ожидает значений f
.
tz
Переводит «Z» и ожидает значений f
.
sx
Масштабирует 'X' и ожидает значений f
.
sy
Масштабирует 'Y' и ожидает значений f
.
sz
Масштабирует «Z» и ожидает значений f
.
bs
BlendShape Вес и ожидаемые значения f
.
vb
Видимость и ожидает значений b
, h
или i
.
Свойства tx
, ty
, tz
, sx
, sy
, sz
, bs
, vb
должны интерполироваться линейно.
Свойство rq
должно интерполироваться с помощью кватерниона slerp.
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Анимация | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя узла (nn) | Строка (ы) | ЛОЖЬ | Истинный |
Режим (м) | Строка(ы) [добавочная, абсолютная, относительная] | ЛОЖЬ | Истинный |
Переопределить кривые перемещения (ot) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Переопределить кривые вращения (или) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Переопределить кривые масштаба (os) | Байт (b) [Истина, Ложь] | ЛОЖЬ | ЛОЖЬ |
Примечания:
См. выше примечания Curve
для определения каждого значения Mode
.
Override Translation Curves
должно иметь значение False
, если оно не указано.
Если Override Rotation Curves
не указан, по умолчанию должно быть установлено значение False
.
Override Scale Curves
умолчанию должны иметь значение False
, если они не указаны.
Узел переопределения и все его дочерние элементы должны переопределить режим своих кривых в новый режим.
Узел переопределения должен присутствовать во время обработки, чтобы определить, является ли дочерняя кость потомком.
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Анимация | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | Истинный |
Буфер ключевых кадров (КБ) | Байт (b), короткий (h), целое число 32 (i) | Истинный | Истинный |
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Файл | Истинный | ЛОЖЬ |
Родитель | Корень | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Имя (н) | Строка (ы) | ЛОЖЬ | ЛОЖЬ |
Справочный файл (хеш CastNode:File) (rf) | Целое число 64 (л) | ЛОЖЬ | Истинный |
Позиция (п) | Вектор 3 (v3) | ЛОЖЬ | Истинный |
Вращение (р) | Вектор 4 (v4) | ЛОЖЬ | Истинный |
Масштаб(ы) | Вектор 3 (v3) | ЛОЖЬ | Истинный |
Поле | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Дети | Никто | Истинный | ЛОЖЬ |
Родитель | Корень | ЛОЖЬ | Истинный |
Свойство (идентификатор) | Тип(ы) | IsArray | Необходимый |
---|---|---|---|
Автор(а) | Строка (ы) | ЛОЖЬ | ЛОЖЬ |
Программное обеспечение(а) | Строка (ы) | ЛОЖЬ | ЛОЖЬ |
Верхняя ось (вверх) | Строка (s) [x, y, z] | ЛОЖЬ | ЛОЖЬ |
Примечания:
Author
и Software
предназначены только для маркировки файлов приведения и не используются за пределами метаданных.
Up Axis
можно использовать как подсказку программному обеспечению для настройки сцены в соответствии с определенной осью вверх.
Файл приведения может иметь любое количество метаузлов, но свойства, предназначенные для хинтинга, должны использовать только первый экземпляр узла метаданных.
Формат разработан DTZxPorter при участии сообщества.
Иконки от Smashicons