Skip to content

Документация

Piotr Horban edited this page May 28, 2023 · 21 revisions

Шейп - .json файл с параметрами модели.
Файлы шейпов располагаются в папке makriva, которая в свою очередь находится в корневой папке Minecraft.
При изменении файлов шейпов, они автоматически обновляются в игре в реальном времени.

Моделинг в Blockbench

Нам понадобятся:

Чтобы установить плагин, его файл (makriva.js) нужно перетащить в окно Blockbench и подтвердить.
Для экспорта шейпа нужно выбрать пункт меню File -> Export -> Export Makriva shape

Примеры проектов Blockbench и модели-шаблоны Стива: https://github.com/msifd/makriva/tree/master/blockbench.
Примеры готовых шейпов: https://github.com/msifd/makriva/tree/master/examples.

Важно! Особенности моделей для Макривы

В корне проекта обязательно должны находится группы с именем части тела. К ним будут привязаны кости внутри этих групп.
Имена групп/частей тела следующие: head, body, right_arm, left_arm, right_leg, left_leg.
Группы с другими именами в корне проекта игнорируются.

Группы частей тела должны находится на определенных координатах. Любое их перемещение изменит их отступ в шейпе. Стандартные координаты можно найти в моделях Стивов в примерах или в плагине в текстовом виде.

Для скрытия части тела надо поставить галочку напротив нее на экране экспорта.

Анимации

Анимации описываются с помощью рекурсивной структуры с условиями и модификаторами.
Пример структуры:

{
	"BoneName.rotation": [0, "10 * sin(age / 3)", 0],
	"if sneaking": {
		"skeleton.head": [0, 0, -5],
		"BoneName.rotation": [10, 0, 0],
		"BoneName.visible": true
	}
}

В данном примере анимации применяются к кости с id BoneName и к скелету головы.
BoneName будет всегда вращаться по синусоиде по оси Y, а во время наклона еще и на 10 градусов по оси X. Также во время наклона голова будет смещена по оси Z.

Поля в анимации делятся на два типа: условия и модификаторы.
Условие - это поле начинающееся со сроки "if ". Значением такого поля должен быть другой объект-анимация.
Модификатор состоит из двух частей разделенных точкой X.Y. Первая часть обычно содержит идентификатор, а вторая его свойство.

Активные модификаторы с одинаковыми именами суммируются, поэтому их можно комбинировать и друг с другом, и с значениями вне раздела анимации.

Виды модификаторов:

  • Модификатор скелета. Начинается с skeleton., а свойствами являются имена частей тела. Складывается со значениями из поля skeleton.
  • Модификатор кости. Идентификатор это id кости. Доступные свойства: rotation: [number; 3], visible: bool.

Полезные анимации

Контр вращение рук и ног

Коэффициенты для настройки к самом конце - 0.3 и 0.6.

"right_arm2.rotation": [ "cos(limbSwingTick * 0.6662) * 2 * limbSwing * rad * 0.3", 0, 0 ],
"left_arm2.rotation": [ "cos(limbSwingTick * 0.6662 + pi) * 2 * limbSwing * rad * -0.3", 0, 0 ],
"right_leg2.rotation": [ "cos(limbSwingTick * 0.6662) * 1.4 * limbSwing * rad * -0.6", 0, 0 ],
"left_leg2.rotation": [ "cos(limbSwingTick * 0.6662 + pi) * 1.4 * limbSwing * rad * 0.6", 0, 0 ],

Выражения

Выражения - это формулы, вычисляющие значения во время рендеринга модели.
Записываются в виде строки: 1 + 2 * 3 + sin(age).

Поддерживаемые операции: Общие: скобки (), булевы: ! && ||, числовые: операции сравнения и арифметика + - * / %.

Функции

  • if(c: bool, a: expr, b: expr) - Если условие c истинно, то будет возвращено выражение a, иначе b
  • sin(num)
  • cos(num)
  • sqrt(num) - Квадратный корень
  • floor(num) - Округление вниз
  • ceil(num) - Округление вверх
  • clamp(x: num, min: num, max: num) - Обрезание значения x до пределов min и max
  • min(num, num)
  • max(num, num)
  • random() - Равномерно случайное значение в пределах [0, 1.0]
  • time() - Время суток в дробных тиках

Переменные

Константы:

  • pi - Число Пи

Значения модели персонажа:

  • limbSwingTick
  • limbSwing - Как сильно поднимаются ноги.
  • partialTicks - Дробные тики (время)
  • age - Время жизни модели персонажа (в тиках)
  • netHeadYaw - Рыскание головы
  • headPitch - Наклон головы
  • modelScale - Размер модели при рендеринге

Наличие предметов: hasMainhandItem, hasOffhandItem, hasHelmetItem, hasChestItem, hasLegsItem, hasFeetItem
Состояния: swimming, overWater, sprinting, riding, burning, onGround
Позы: standing, sneaking, sitting, sleeping, elytraFlying, crawling, hugging, dancing, waving, bowing, wagging, crying, pointing, yesPose, noPose. Важно отметить, что это переменные, а не названия поз и использовать их вне выражений, например в качестве ключа к eyeHeight, не получится.

Структура шейпа

Основные понятия:

  • список - список элементов. Обозначается квадратным скобками [].
  • объект - список пар ключ-значение. Обозначается фигурными скобками {}.
  • поле - ключ в объекте.

Нотация типов:

  • type - просто тип
  • [type] - список типов
  • [type; 3] - список типов обязательного размера (3)
  • {type1, type2} - объект с ключами типа type1 и значениями type2

Типы:

  • part - Часть тела игрока. Значения: head, body, right_arm, left_arm, right_leg, left_leg
  • pose - Поза игрока. Значения: stand, sneak, sit, sleep, elytraFly, crawl, hug, dance, wave, bow, wag, cry, point, yes, no
  • url - Ссылка
  • expr - Выражение
  • animation - Анимация
  • bone - Кость
  • qube - Куб
  • quad - Куад
{
	"metadata": {string, string},
	"textures": {string, url},
	"textureSize": [number; 2],
	"hide": [part],
	"skeleton": {part, [number; 3]},
	"eyeHeight": {pose, number},
	"boundingBox": {pose, [number; 2]},
	"modelScale": number,
	"animation": {animation entries},
	"bones": [bone],
	"debug": {string, expr}
}

Полезные поля шейпа

textures: {string, url}

Список именованных текстур. Могут использоваться в отдельных костях. Имена skin, cape и elytra устанавливают скин, плащ и крылья соответственно. Текстуры с другими именами также могут использоваться, но ни на что более не влияют.

textureSize: [number; 2]

Регулирует размер сетки координат текстуры (UV). По-умолчанию 64x64, но при экспорте из Blockbench берется тот размер, что указан в проекте.

hide: [part]

Скрывает указанные части тела.

skeleton: {part, [expr; 3]}

Регулирует позицию каждой части тела, относительно их точки вращения по-умолчанию.

eyeHeight: {pose, number}

Регулирует высоту глаз для каждой позы. Значения по-умолчанию:

  • stand - 1.62
  • sneak - 1.54
  • sit - 1.62
  • sleep - 0.2
  • elytraFly - 0.4
  • crawl - 0.4

boundingBox: {pose, [number; 2]}

Регулирует размер кубоида персонажа - ширину и высоту, для каждой позы. Значения по-умолчанию:

  • stand - 0.6, 1.8
  • sneak - 0.6, 1.65
  • sit - 0.6, 1.8
  • sleep - 0.2, 0.2
  • elytraFly - 0.6, 0.6
  • crawl - 0.6, 0.6

modelScale: number

Регулирует масштаб модели в целом. Позволяет делать большие модели и уменьшать их до требуемого размера.

animation: {animation entries}

Рекурсивная структура с динамическими модификаторами - анимациями

bones: [bone]

Список костей шейпа.

Кости

Основной структурный элемент шейпа. Каждая кость:

  • Может быть привязана к части тела игрока.
  • Может иметь свою текстуру.
  • Может иметь сдвиг (отступ) и угол наклона по трем осям.
  • Имеет кубы и куады.
  • Имеет дочерние кости.

Структура:

{
	"id": string,
	"parent": part,
	"texture": string,
	"offset": [number; 3],
	"rotation": [number; 3],
	"cubes": [cube]
}

Кубы и Куады

Кубы это кубы, а куады это плоские кубы.
Структура:

{
	"uv": [number, number],
	"pos": [number, number, number],
	"size": [number, number, number],
	"delta": number,
	"mirror": boolean,
}

Прочие поля шейпа

metadata: <string, string>

Список дополнительных значений:

  • model - Регулирует тип модели. Значения: default, slim.

debug: {string, expr}

Список выражений (значения) с названиями (значения). Если добавить выражения, то их результат будет выводиться на экране. Полезно при составлении выражений.