# Признаки болезней на 3D-модели сердца

Статус: принята · 12.10.2026 · issue #99. Порядок выбрал Никита: сначала признаки на нашей модели, потом модели пороков
Опирается на спеку вьюера ([2026-10-11-stage-1-viewer.md](2026-10-11-stage-1-viewer.md), раздел «Сердцебиение»), пресеты часов сердца ([2026-10-11-stage-3-presets.md](2026-10-11-stage-3-presets.md)) и синхронизацию с часами ([2026-10-11-stage-2-cycle-sync.md](2026-10-11-stage-2-cycle-sync.md)).

## Цель

Никита спросил 12.10.2026, есть ли другие 3D-модели. Открытых моделей приобретённых болезней сердца с подходящей лицензией нет (поиск ниже). Поэтому признаки болезней показываем на нашей модели нормального сердца тем же шейдером, что даёт сердцебиение. Статья о болезни и пресет часов сердца меняют не только ЭКГ, тоны и диаграмму Виггерса, но и вид модели. Читатель переключает «норма / болезнь» и видит разницу на одном и том же сердце.

## Что нашли из готовых моделей

| Источник | Лицензия | Что внутри | Решение |
|---|---|---|---|
| [Heart Library, NIH 3D](https://3d.nih.gov/collections/heart-library) (Jump Simulation, OSF HealthCare) | У проверенных моделей CC0: [#80](https://3d.nih.gov/entries/3DPX-016079/2) и [#70](https://3d.nih.gov/entries/3DPX-016151/2) (тетрада Фалло), [#42](https://3d.nih.gov/entries/3DPX-007813) (l-TGA, ДМПП и др.), [#141](https://3d.nih.gov/entries/3DPX-016242/2) (ДМЖП после операции Норвуда). [FAQ](https://3d.nih.gov/faqs): «Licensing varies» | Сердца пациентов с врождёнными пороками по МРТ. Обычно один меш (кровь в полостях или миокард), без названных структур | Второй шаг: отдельный просмотрщик в статьях о пороках. Лицензию проверяем у каждой модели |
| [HRA «Heart, Male/Female»](https://3d.nih.gov/entries/3DPX-021000) | CC BY 4.0 | Нормальное сердце, без коронаров и проводящей системы (этап 1) | Не берём, у нас уже есть нормальное сердце |
| Sketchfab | Чаще всего NC | — | Не берём |

Готовых открытых моделей гипертрофии, дилатации, инфаркта или стеноза аортального клапана не нашли.

## Что входит

Вьюер получает «форму болезни»: набор параметров деформации и подсветки поверх нормальной модели. Признак рисуется, только если его описывает источник уровня guideline или reference из `content/trusted-sources.yaml`. Число (например, во сколько раз больше желудочек) берётся из источника или помечается как допущение, как в спеке пресетов. Источники ниже уже проверены в статьях о болезнях (номер `<Cite>` в статье) или открыты при написании спеки; во втором случае вьюер показывает их под моделью, потому что в списке источников статьи их нет.

Ключ формы это id статьи о болезни. Форма статична: размер ЛЖ, зона, подсветка и метка видны и в покое, и при reduced motion, без запущенного сердцебиения. Сердцебиение их только дополняет.

| Статья | Что видно на модели | Как рисуем | Источник |
|---|---|---|---|
| `heart-failure` | Слабое сжатие желудочков | Уже есть: сжатие идёт от ФВ часов с пресетом `heart-failure` | Спека пресетов |
| `atrial-fibrillation` | Предсердия не сжимаются, нет свечения синусового узла | Уже есть, из часов с пресетом `atrial-fibrillation` | Спека пресетов |
| `coronary-heart-disease` | Пример: инфаркт нижней стенки ЛЖ в бассейне правой коронарной артерии, стенка в зоне движется хуже | Вес вершин ЛЖ 0..1 по расстоянию до меша `right-coronary-artery` с плавным спадом; в зоне свой цвет и меньшее сжатие. Нижняя стенка выбрана, потому что отведение монитора похоже на II, а подъём ST пресета `stemi` это признак нижнего инфаркта | Инфаркт как гибель клеток при остром недостатке кровоснабжения: ESC 2023 ACS (статья, [2]). «In most patients, the RCA supplies the inferior myocardium» и «Inferior MI is associated with ST-segment elevations in the inferior leads (II, III, and aVF)»: [StatPearls, Inferior Myocardial Infarction](https://www.statpearls.com/point-of-care/23500). «Regional wall motion abnormalities induced by ischemia can be detected by echocardiography»: [StatPearls, Acute Myocardial Infarction](https://www.ncbi.nlm.nih.gov/books/NBK459269/). Насколько меньше сжатие в зоне, источник не говорит: допущение |
| `hypertension` | Гипертрофия левого желудочка | ЛЖ подсвечен своим цветом, подпись «стенка ЛЖ утолщена»; форму не меняем (см. ограничения) | Гипертрофия ЛЖ как поражение органа-мишени: Минздрав «АГ у взрослых» 2024 (статья, [2]) |
| `aortic-stenosis` | Клапан раскрывается не полностью | `valveOpen` аортального клапана умножается на коэффициент меньше 1 (допущение: площадь отверстия модель не считает) | Сужение аортального отверстия, чаще всего из-за кальция на створках: Минздрав «Аортальный стеноз» 2025 (статья, [3]) |
| `hypertrophic-cardiomyopathy` | Утолщение стенки ЛЖ, чаще неравномерное за счёт перегородки | ЛЖ подсвечен, межжелудочковая перегородка подсвечена ярче, подпись про порог 15 мм словами | Стенка ЛЖ 15 мм и больше у взрослых, перегородка утолщена неравномерно, особенно у основания: Минздрав ГКМП 2025 и StatPearls HCM (статья, [2, 3]) |
| `dilated-cardiomyopathy` | Расширенный ЛЖ (иногда оба желудочка), сжимается слабее | ЛЖ увеличен к собственному центру, за ним двигаются его сосочковые мышцы и митральный клапан; величина ограничена допущением и проверена на пересечения с ПЖ. Слабое сжатие из часов с пресетом `heart-failure` | Расширение ЛЖ: ESC 2023 cardiomyopathies и Минздрав ДКМП 2025 (статья, [1, 2]); сниженная ФВ: Минздрав ([2]) |
| `atrial-septal-defect` | Отверстие в межпредсердной перегородке | Значок на якоре зоны `interatrial-septum`, отдельно от подписи выбранной структуры; дыру не вырезаем | Минздрав ДМПП 2023 (статья, [1]) |

### Пресет часов → форма

На странице часов сердца форма следует за выбранным пресетом. Тест проверяет, что каждый id из `presetIds` есть в этой таблице.

| Пресет | Форма |
|---|---|
| `normal` | нет |
| `atrial-fibrillation` | `atrial-fibrillation` |
| `stemi` | `coronary-heart-disease` |
| `heart-failure` | `heart-failure` |
| `hypertension` | `hypertension` |
| `aortic-stenosis` | `aortic-stenosis` |
| `atrial-septal-defect` | `atrial-septal-defect` |

## API

- Вьюер получает проп `disease?: DiseaseId` (id статьи из таблицы выше). `packages/viewer/src/disease.ts` хранит формы по id статьи и таблицу «пресет → форма». Тесты проверяют, что у каждой формы есть источник, а у каждого допущения пометка `assumption`.
- Подпись под моделью говорит только о том, что модель показывает сейчас: статичные признаки всегда, признаки движения (зона инфаркта, клапан при стенозе) только при сердцебиении, а признаки из пресета часов (СН, ФП, слабое сжатие при ДКМП) только когда часы идут с этим пресетом.
- `CycleState` получает необязательное поле `preset?: PresetId`; `HeartClockDemo` заполняет его выбранным пресетом. Вьюер с `cycle="page"` берёт форму оттуда, когда проп `disease` не задан. Это изменение в `packages/heart-clock` согласуем с тредом «Часы сердца».
- Обёртка `<HeartModel>` из [спеки анатомии и диагностики](2026-10-11-stage-3-anatomy-diagnostics.md) получает пропсы `disease` и `cycle`. В статье с пресетом рядом уже стоит монитор часов, поэтому модель идёт с `cycle="page"` и бьётся в такт ему; свои часы завели бы вторые часы, которые разойдутся с монитором и не знают пресета. В статье без пресета (сейчас ГКМП) модель показывает форму без сердцебиения. Страница статьи сама ставит модель в раздел «Как это выглядит в модели» под монитором, если id статьи есть среди форм, поэтому в MDX её добавлять не нужно; `<HeartModel>` зарегистрирован и для статей анатомии. Модель читает пресет из `CycleState` на каждом кадре и сообщает вьюеру, когда он меняется.
- Подсветка болезни идёт тем же каналом `emissive`, что выделение и свечение проводящей системы; выделение пользователя важнее, порядок как в `useFrame` вьюера. Цвет зоны инфаркта на части меша требует цвета вершин или правки фрагментного шейдера, а уменьшенное сжатие в зоне требует атрибута веса вершин: оба считаются при загрузке модели.

## Ограничения модели

- В BodyParts3D желудочки заданы поверхностью полости, а не стенкой (спека модели), и эта же поверхность видна снаружи как контур желудочка. Утолщение стенки так не нарисовать: уменьшенный ЛЖ выглядел бы как сердце, которое стало меньше снаружи. Поэтому гипертрофия показана подсветкой и подписью, а не формой.
- Коронарные артерии сжимаются вместе с желудочками. В зоне инфаркта, где сжатие меньше, артерия в систолу немного отходит от стенки: допущение схемы.
- Перегородки это зоны без собственного меша, поэтому отверстие ДМПП обозначено значком, а не вырезом.
- Всё это схема: под моделью пометка, что признаки показаны схематично и размеры увеличены для наглядности, и ссылки на источники, которых нет в статье.

## PR

1. Формы болезней в `packages/viewer`: веса вершин и цвет зоны инфаркта, увеличение ЛЖ, подсветка, значок ДМПП, таблица «пресет → форма», юнит-тесты.
2. Поле `preset` в `CycleState` (с тредом «Часы сердца»), проп `disease`, обёртка `<HeartModel>` для статей о болезнях, строки en/ru и тестовой RTL-локали, e2e.
3. Модели пороков из Heart Library: своя спека с проверкой лицензии каждой модели.
