add vca docs

This commit is contained in:
MihailRis 2026-09-06 17:01:09 +03:00
parent 9826aedee3
commit b180a29bb5
2 changed files with 106 additions and 0 deletions

View file

@ -21,4 +21,5 @@
- [Скриптинг](scripting.md)
- [Стили текста](text-styles.md)
- [Формат моделей VCM](vcm.md)
- [Формат анимации VCA](vca.md)
- [Частицы](particles.md)

105
doc/ru/vca.md Normal file
View file

@ -0,0 +1,105 @@
# VCA
Текстовый формат анимации, использующий синтаксис [VCM](vcm.md).
VCA файл состоит из набора директив, порядок следования которых не влияет на порядок применение трансформаций.
Директивы применяются к переданной цели, которая может быть скелетом сущности и камерой.
При использовании скелета, в директиве указывается имя кости через атрибут `bone`:
```vcd
@move bone имя_кости ...
```
Директивы отвечают за отдельные скалярные значения, такие как x, y, z и т.д., указываемые через атрибут `by`:
```vcd
@move bone hand by y ...
```
На данный момент доступны два вида описания кривых, дающих значение `f(t) = x` где t - время:
- [кривые с ключевыми кадрами (curve)](#кривые-с-ключевыми-кадрами)
- [кривые через выражения (func)](#)
## Директивы анимации
- `@move` - смещение объекта/кости
- `@rotate` - поворот объекта/кости
- `@scale` - масштабирование объекта/кости (множитель)
- `@zoom` - масштаб камеры (множитель)
## Мета-информация
Информация о анимации в файле настраивается через директиву `configure`:
- `fps` - частота кадров, являющаяся делителем при рассчёте длительности
- `frames` - число кадров анимации, являющееся делимым при рассчёте длительности
- `duration` - явно указанная длительность в секундах (требуется указание fps при наличии ключевых кадров)
- `rotation-order` - указывает порядок применения углов Эйлера при вращении (так как порядок директив не учитывается форматом). Примеры: XYZ, ZYX, YZX.
## Кривые с ключевыми кадрами
Требуется через атрибут `curve` указать тип кривой:
- `const` - значения не интерполируются, сменяясь в момент достижения ключевого кадра
- `linear` - ломанная линия, используется линейная интерполяция
- `bezier` - ключевые кадры кривой Безье с явно указанными левой и правой касательными (lx, ly, rx, ry)
Ключевые кадры описываются в последующем `{...}` блоке в виде упорядоченных `@key` директив:
```vcd
@rotate by z curve linear {
@key ...
@key ...
}
```
Ключевой кадр должен содержать номер кадра `frame` и значенин `value`. Для `bezier` кадров также описываются касательные.
Пример для `curve bezier`:
```vcd
@key frame 138 value 53.00411 lx 127.067 ly 53.00411 rx 138.001 ry 53.00411
```
## Кривые через выражения
Через атрибут описывается функция `f(t) = x` где t - время в секундах.
Пример: `func (sin(t * 2.5) + pi)`.
Операции доступные в выражениях:
- `a + b` - сложение
- `a * b` - умножение
- `a / b` - деление
- `a % b` - деление по модулю
- `a ^ b` - возведение в степень
Константы доступные в выражениях:
- `pi` число π
- `e` число Эйлера
Функции доступные в выражениях:
- `sin(x)` - синус от x
- `cos(x)` - косинус от x
- `tan(x)` - тангенс от x
- `noise(x, octaves)` - быстрый одномерный шум от x с указанным числом октав
- `noise2d(x, y, octaves)` - двумерный шум от x,y с указанным числом октав
- `sign(x)` - целое число, указывающее знак x (-1/0/1)
- `rand(low, high)` - псевдослучайное дробное число в диапазоне от low до high
- `round(x, places)` - округляет значение x до указанного количества знаков после запятой places (опционально).
- `floor(x)` - округляет значение x до ближайшего меньшего целого
- `ceil(x)` - округляет значение x до ближайшего большего целого
- `exp(x)` - $e^{x}$
- `min(x, ...)` - выбирает наименьшее значение из переданных аргументов
- `max(x, ...)` - выбирает наибольшее значение из переданных аргументов
- `sqrt(x)` - квадратный корень от x
- `log(x)` - $ln({x})$
- `log10(x)` - $log_{10}({x})$
- `deg(x)` - конвертирует радианы в градусы
- `rad(x)` - конвертирует градусы в радианы
>[!WARNING]
> Использование незадокументированных функций может иметь иметь любые незадокументированные последствия.