Руководства / Строительство и ресурсы
Слим или классика: игра читает ваш аккаунт, а инструменту приходится угадывать по 24 пикселям
Игра берёт слим или классику из настройки скина в вашем аккаунте, а не из PNG. Инструменту, получившему голый PNG, приходится угадывать по двум столбцам, которые слим-рука оставляет пустыми. Плюс полная UV-карта и почему старые скины 64×32 получают зеркальное отражение.
Ничто в PNG-файле скина не говорит «слим». Нет ни флага, ни соглашения об именах — и игра никогда не смотрит на пиксели, чтобы это выяснить. Она берёт модель из настройки model, которую ваш аккаунт привязывает к скину (это выбор, который вы делаете при загрузке), а профиль без скина получает один из 18 стандартных скинов, 9 слим и 9 классических, выбранный по его UUID.
Только инструменту, получившему голый PNG — редактору, сборщику паков, просмотрщику — приходится определять модель самому, и делает он это, глядя на конкретный прямоугольник 2 × 12 и считая, сколько его пикселей там действительно есть.
Проверка
sample x 54–55, y 20–31 — 2 wide, 12 tall = 24 pixels
count pixels with alpha > 0
slim if fewer than 6 are opaque
Классические руки — 4 пикселя в ширину; слим-руки — 3. Грани слим-руки упакованы на один пиксель уже, поэтому боковая и задняя грани сдвигаются влево, а последние два столбца блока руки, x 54–55, остаются пустыми. На собственных стандартных скинах Mojang этот прямоугольник непрозрачен на 0 из 24 у всех девяти слим-скинов и на 24 из 24 у всех девяти классических — двадцати четырёх пикселей достаточно, чтобы определить.
Порог — 6 из 24, а не 1: четверть столбца должна быть заполнена, прежде чем он считается классическим. Этот допуск важен: слим-скин с несколькими случайными пикселями в мёртвом столбце всё ещё читается как слим, а это именно то, что нужно, потому что такие случайные пиксели почти всегда — случайность при редактировании, а не намерение.
Это также означает, что ошибка проявляется тихо. Если вы рисуете классический скин, но лишь слегка используете эти столбцы — тонкий контур, пара пикселей тени — вы можете оказаться ниже 6 и быть автоматически определённым как слим, потеряв пиксель ширины руки без всякого объяснения. Если скин в инструменте определяется как не та модель, эти столбцы — то место, куда стоит смотреть — а в игре — настройка в вашем аккаунте.
UV-карта, полностью
Каждая часть скина — это фиксированный прямоугольник, и у каждой есть слой наложения где-то ещё на листе:
| часть | основа | наложение | смещение | размер |
|---|---|---|---|---|
| голова | (8, 8) | шляпа (40, 8) | 32 вправо | 8 × 8 |
| тело | (20, 20) | куртка (20, 36) | 16 вниз | 8 × 12 |
| правая рука | (44, 20) | рукав (44, 36) | 16 вниз | 4 × 12 |
| правая нога | (4, 20) | штаны (4, 36) | 16 вниз | 4 × 12 |
| левая рука | (36, 52) | рукав (52, 52) | 16 вправо | 4 × 12 |
| левая нога | (20, 52) | штаны (4, 52) | 16 влево | 4 × 12 |
Пять из шести наложений находятся ровно в 16 пикселях от своей основы — но не в одном направлении. Три исходные части идут на 16 вниз. Левая рука и левая нога, добавленные позже и втиснутые в нижнюю половину, где под ними не было места, идут вместо этого на 16 в сторону — и в противоположных направлениях друг от друга.
Шляпа — единственная, что вообще не на 16: она на 32 вправо, в той же строке, что и голова.
Так что «наложение находится под основой» — правило, которое верно ровно для половины листа. Копирование прямоугольника основы и смещение его вниз, чтобы найти наложение, работает для тела, правой руки и правой ноги, и молча попадает не на ту часть для остальных трёх.
На слим-скине каждый прямоугольник руки шириной 4 читается как 3 в ширину. Передние грани не двигаются, но всё после них — да: боковая грань и задняя грань начинаются на один пиксель левее, а задняя грань на пиксель уже, из-за чего x 54–55 остаются пустыми.
Старый формат 64 × 32 вообще не имеет левой стороны
Скин до 1.8 — это 64 × 32: нижней половины листа просто не существует, а именно там живут левая рука и левая нога. Рисовать их не из чего.
Решение — зеркалирование: правая нога (0, 16) копируется в (16, 48), а правая рука (40, 16) — в (32, 48), обе отражаются по горизонтали. Вот почему старые скины идеально симметричны, а современные могут и не быть — асимметрия — единственное, что формат 64 × 32 не может выразить, и любой старый скин, который вы конвертируете, получает симметрию навязанной, хочет он того или нет.
Файл редактора 128 × 128 — та же раскладка, вдвое больше
Java принимает 64 × 64 или старый 64 × 32 и отвергает всё остальное. Редактор скинов Bedrock на этом сайте работает с 128 × 128 и не принимает ничего другого — но этот файл — та же UV-раскладка, нарисованная в двойном разрешении, каждая часть в удвоенных координатах Java, а не другой формат.
Стена — в инструментах, а не в раскладке. Текстурный конвейер каждой сборки редактора рассчитан на своё число, поэтому ни один не откроет файл другого, а PNG 128 × 128, переданный Java, будет отвергнут, а не показан в половинном размере. Конвертация — это механическое масштабирование в 2×, поэтому редактор скинов рассматривает эти два варианта как отдельные сборки, а не как одно полотно.