diff --git a/doc/ru/main-page.md b/doc/ru/main-page.md index 772f327fd..6f264ea87 100644 --- a/doc/ru/main-page.md +++ b/doc/ru/main-page.md @@ -21,4 +21,5 @@ - [Скриптинг](scripting.md) - [Стили текста](text-styles.md) - [Формат моделей VCM](vcm.md) +- [Формат анимации VCA](vca.md) - [Частицы](particles.md) diff --git a/doc/ru/vca.md b/doc/ru/vca.md new file mode 100644 index 000000000..0ad664e73 --- /dev/null +++ b/doc/ru/vca.md @@ -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] +> Использование незадокументированных функций может иметь иметь любые незадокументированные последствия. +