Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewVERIFIED 2026-10-01 · UPDATED 2026-10-01
IDENTITY
module
KW I14 · A living face from a single drawing
series
KAGAMI Way · Track I — Infrastructure
level
Intermediate
duration
~12 min
trust_label
VERIFIED 2026-10-01 (tools and licences against official docs) · UPDATED 2026-10-01 (public edition; see "what changed" in the human view). Not labelled TESTED: the cutting scripts were not re-run for this edition.
language
human view: bg · english edition: /en/academy/moduli/KW_I14_Living_Face_Layers.html
next
KW_I15_Aliveness_Behaviour.html · Behaviour that makes a character feel alive
PURPOSE

Turn several separately generated frames of one drawn head into a single set of layers (one base, eyes, eyelids, mouth, glyph, colour from CSS) from which every state is assembled live in the browser, with no new render per state. The method is portable to any drawn head you have the rights to use.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

KW_I15_Aliveness_Behaviour.html · Behaviour that makes a character feel alive · offer: Quick experiment (kagami.bg/stalbata/)

SOURCES
TAGS
characterlayersriggingalpha-maskpillowcssno-new-render
ПРОВЕРЕНО · 01.10.2026 ОБНОВЕНО · 01.10.2026

Живо лице от една рисунка

Как пет отделни рисувани кадъра на една и съща глава се превръщат в един набор от слоеве, от които всяко състояние се сглобява наживо. Подходът е преносим: важи за всяка рисувана глава, която имаш право да ползваш.

⏱ ~12 мин Средно Инфраструктура Персонаж · слоеве
Python + Pillow🔒 локално CSS / браузър🔒 локално Генератор на изображения🌐 глобален
🔄
Обновено 01.10.2026 — какво
Съдържанието е същото, преработено за публично четене: имената на персонажите и вътрешните пътища са махнати, добавена е част „Преди да започнеш“, проверени са упоменатите инструменти и лицензи по документацията им и са добавени източници. Скриптовете не са пускани наново за това издание, затова няма етикет „ТЕСТВАНО“.

01Какво ще научиш

02Преди да започнеш

03Стъпки

  1. Части, не състояния

    Изходният материал са пет пълни PNG кадъра на една и съща глава. Между тях се менят само три неща: цветът, очите и устата, и надграденият знак. Всичко останало е една база, изрисувана пет пъти.

    Обръщаме сметката: една база + очи + клепачи + уста + знак × цвят от CSS — вместо пет пълни изображения, около 15 малки файла. Ново състояние струва един цвят и един знак, не нов рендер.

    ✅
    Преносимо правило
    Не произвеждай състояния — произвеждай частите, от които се сглобяват. Пет състояния са продукт; петнайсет части са система.
  2. Кадрите не се подравняват

    Допускането, че петте кадъра са пиксел-подравнени, е грешно. Мерените силуети (след изрязване по прозрачността):

    КадърРазмерСилуетСъвпадение с базата
    покой (база)1254×1254889×1113—
    говорене1312×1199925×114896,7%
    мислене1221×12891054×122496,7%
    гледане1199×13121172×122985,3%
    слушане1173×13411200×119276,9%
    ⚠️
    Свойство на генератора, не пропуск
    Два независимо генерирани кадъра на практика никога не съвпадат пиксел в пиксел — дори при заявка „същото, само промени еди-какво“. Затова режи слоевете от ЕДИН кадър (базовия), не от смес. Това е наше наблюдение върху един набор кадри, не твърдение за всички генератори.
  3. Мери, преди да режеш

    Геометрията на всяка черта се мери, не се отгатва, и живее на едно място — файл geom.json, откъдето кодът я чете. В нашата рисунка: ирис r≈36 при (462, 692) и (786, 693); зеница r≈23; ос на симетрия x = 624, докато центърът на изображението е 627; устни x 489–761, шев y 942.

    geom.json · пример за формата (стойности от нашата рисунка)
    {
      "iris_centres": [[462, 692], [786, 693]],
      "iris_radius": 36,
      "pupil_radius": 23,
      "axis_x": 624,
      "lips_x_range": [489, 761],
      "seam_y": 942
    }
    📏
    3-пикселовата разлика има смисъл
    Оста между ирисите (x = 624) и центърът (x = 627) не съвпадат. Именно тази разлика прави огледалния ляв слой точния десен. Приемеш ли 627 за ос, очите изглеждат кривогледи. Твоите числа ще са други — важи принципът: измери оста.

    По избор можеш да ползваш автоматичен сегментатор, който предлага маски — например Segment Anything на Meta 🔒 локално, чийто код и модел са под лиценз Apache 2.0. Ние не сме го пробвали за този урок; приеми маските като чернова и ги прегледай на око.

  4. Ригът „око отзад, лице отпред“

    Първата идея — „изрежи ириса и го плъзгай“ — не работи: под ириса не е нарисувано нищо, плъзгането отваря дупка. Работещото решение: цяло око отзад, което се плъзга свободно, и лице с прозорци в прозрачността отгоре, което го подрязва до формата на цепката. Нищо не се дорисува — горният слой скрива излишъка. Редът е: очи → клепачи → лице отпред.

    В браузъра подрязването е обикновено наслагване на PNG със прозрачност; за по-сложни форми има и CSS mask-image.

    ✅
    Преносима поука
    Когато слой не може да се движи, защото под него няма нищо, питай не „как да дорисувам под него“, а „какво да сложа ОТГОРЕ, което да го подрязва“.
  5. Кое НЕ се реже: устата

    Устните са затворени и плътни; зад тях няма нарисувана кухина, която подрязването да разкрие. Отварянето на устата не се изрязва — рисува се. Затова устата е единственият слой, вързан за нов рендер; останалите шест се правят без генератор.

    🔁
    Кодът не чака изкуството
    Кодът приема четири степени на отвореност според силата на звука и пада към наличния кадър, докато другите дойдат. Непълен комплект работи още днес.
    bash · възпроизвеждане (скриптовете се пишат сам — не са публикувани)
    # Оригиналите не се пипат; работиш върху копие
    cd <папка-на-проекта>
    python cut_layers.py    # → layers/ (по geom.json)
    python build_page.py    # → самостоятелен HTML с вградени слоеве

04Проверка

1. Защо слоевете се режат от ЕДИН кадър, а не от смес?

2. Защо „изрежи ириса и го плъзгай“ не проработи?

3. Каква е преносимата поука от „око отзад, лице отпред“?

4. Защо устата е вързана за нов рендер, а не за рязане?

05Какво следва

06Източници

  1. Pillow: Image — документация на alpha_composite и работата с RGBA изображения.
  2. MDN: mask-image — подрязване на елемент по маска в CSS.
  3. Segment Anything (Meta) — сегментатор с маски; кодът и моделът са под Apache 2.0 (по README на проекта).
  4. Собствени измервания на КАГАМИ върху пет генерирани кадъра на една глава (таблицата и координатите в урока).