Как мы воссоздали Обнинскую АЭС в браузере и с какими проблемами столкнулись

Прокомментировать Просмотры: 4

Модель Обнинской АЭС 1954 года в браузере

В нашей модели Обнинской АЭС можно нажать кнопку аварийной защиты и посмотреть, как в домах посёлка гаснет свет. На моём телефоне всё работало. Но когда я отправил статью на SE7EN, модератор не смог даже нажать кнопку на своём ноутбуке. Я открыл ту же ссылку на MacBook Air и наконец понял, в чём дело.

А началось всё, как ни странно, в спортзале. Мне хотелось разобраться, как правильно выполнять одно упражнение. В сети я нашёл видео: скелет с мышцами повторял нужное движение, и было видно, что при этом происходит внутри тела. Меня это впечатлило.

Подобные вещи всегда меня увлекали. Одна из моих любимых передач — «Как это устроено» на Discovery: заводы, корабли, принципы работы техники. Я человек технического склада. В детстве разобрал отцовский магнитофон и пообещал сделать из него вертолёт, за что получил нагоняй. А теперь у меня появился инструмент, который позволяет создавать такие объяснения самостоятельно.

К тому моменту я прошёл обучение у Ивана Замесина и уже активно экспериментировал с нейросетями. Для первого англоязычного канала мы сделали в Blender два коротких видео — про подшипник и сцепление. Затем мне встретилась интерактивная модель объектива Райана Сейла. Я понял, что именно этого мне и не хватало: возможности самому повращать механизм, разобрать его и заглянуть внутрь. Так родился проект «Изнутри». Интерактивные сцены Райана

Обнинскую АЭС я выбрал по личным причинам. Я вырос в Малоярославце, недалеко от Обнинска. Мне хотелось попасть в реакторный зал и собственными глазами проследить, как тепло превращается в электричество. Открыть Обнинскую АЭС в браузере

Обнинская АЭС в нашей сцене: общий вид

Что увидит зритель

Сцена состоит из семи шагов. С улицы вы попадаете в зал, где можно проследить весь путь энергии. Реактор нагревает воду, которая в парогенераторе передаёт тепло воде второго контура. Образовавшийся пар вращает турбину, а она приводит в движение генератор. На пульте расположена кнопка «АЗ» — аварийная защита. Нажмите её и посмотрите в зал: стержни опустятся, мощность снизится, а за окнами погаснет свет в домах. Так мы показываем последствия одного нажатия.

Аварийная защита: пульт и окна посёлка
Реакторный зал: после нажатия АЗ стержни уходят в кладку, мощность снижается с 5 до 0,7 МВт, окна города гаснут
Реакторный зал: после нажатия АЗ стержни уходят в кладку, мощность снижается с 5 до 0,7 МВт, окна города гаснут

Та же запись в формате MP4

Затем можно заглянуть внутрь реактора, самостоятельно подвигать стержни и повторить в модели первый пуск 1954 года. Загружайте каналы и наблюдайте, как меняются показания счётчика нейтронов. После этого реактор можно разобрать послойно, включить тепловизор для двух контуров и, наконец, рассчитать КПД. Станция выделяла 30 МВт тепла, а в сеть отдавала 5 МВт электроэнергии. Куда же уходили остальные 25?

Первый пуск: показания счётчика при загрузке каналов
Шаг «Первый пуск»: при каждом нажатии «+10 каналов» счёт нейтронов растёт; на 61-м канале появляется сообщение «Реакция пошла сама»
Шаг «Первый пуск»: при каждом нажатии «+10 каналов» счёт нейтронов растёт; на 61-м канале появляется сообщение «Реакция пошла сама»

Запись первого пуска модели в MP4

Тепловизор: как первый контур нагревает второй
Два контура на тепловизоре: горячая вода реактора нагревает воду второго контура
Два контура на тепловизоре: горячая вода реактора нагревает воду второго контура

Почему сцена зависала на ноутбуке

До замечания модератора я проверял, как быстро загружается модель и помещается ли она на экране. При локальном тестировании она появлялась примерно через полторы секунды. Когда мы заново проверили версию по ссылке из статьи, обнаружились две разные проблемы.

Если модель всё же загружалась, высокое разрешение и дополнительные эффекты могли перегружать графику. Поэтому мы ограничили количество пикселей, которые браузер отрисовывает в каждом кадре, а тяжёлые эффекты перенесли на отдельную кнопку. Но иногда вместо станции появлялось сообщение «3D не загрузилось». В этом случае уменьшать модель не имело смысла: браузер не мог скачать движок three.js с внешнего сервера jsDelivr. При блокировке этого адреса на Mac появлялось то же сообщение.

Теперь русская версия АЭС загружает движок с нашего сайта. 11 ноября мы оставили jsDelivr заблокированным на MacBook Air и открыли опубликованную сцену. Первый кадр с моделью появился через 0,60 секунды. В Chrome на Windows два запуска без кеша заняли 1,93 и 2,23 секунды. Мы прошли все семь шагов: в зале и в финале нажали кнопку защиты, дождались, пока погаснут окна, а затем снова запустили реактор.

Отдельно я проверил сцены на слабом ПК. С отключёнными эффектами они загрузились. А когда я включил эффекты, заметной разницы в изображении, признаться, не увидел. Пока базового режима вполне достаточно, чтобы понять устройство станции. А когда мы вернёмся к освещению и материалам, я буду задавать себе простой вопрос: что именно зритель увидит после нажатия этой кнопки?

Откуда берутся показания на пульте

Мощность пересчитывается на каждом временном шаге. В основе лежит простая модель точечной кинетики с одной группой запаздывающих нейтронов. Мы перешли на неявную численную схему, когда расчёт начал расходиться в условиях глубокой подкритичности.

Фрагмент расчёта из gen/aes/v3/aes_src.html
var P_TH=30, P_EL=5, NCH=128, NCRIT=60;
var BETA=0.0065, LAM=1e-3, LD=0.08, RHO_MAX=0.006, H_CRIT=0.5, RHO_SCRAM=-0.04;

function pstep(dt){ if(!(dt>0)) return;   // см. ниже, почему на пульте появлялось NaN
  // …
  var rho=rhoNow(), src=R.mode==='start'?1:1e-6,
      sub=Math.max(1,Math.ceil(dt/0.002)), h=dt/sub;
  for(var i=0;i

У модели есть вполне определённые ограничения. Из истории станции мы взяли номинальные мощности, 128 каналов при полной загрузке и ориентир для первого пуска — около 60 каналов. Сам порог задан в коде. То, что в сцене реакция становится самоподдерживающейся на 61-м канале, отражает выбранные нами настройки. Восстановить историческую загрузку с точностью до одного канала таким способом нельзя.

Числа и источники мы собирали в отдельном файле. Разбираясь с июньскими датами, я понял, почему важно записывать и событие, к которому относится каждая цифра. 26 июня пар подали на турбину, а генератор синхронизировали с сетью Мосэнерго. В сообщении ТАСС 27 июня указан как день пуска станции в эксплуатацию. В короткой подписи «дала ток» это различие легко упустить. История пуска Обнинской АЭС в библиотеке Росатома

Там, где надёжных данных у нас не было, мы сохранили условности. Например, количество стержней в модели приблизительное. Голубое свечение на разрезе — художественный приём. В реальном АМ-1 вода проходила по закрытым каналам внутри графита.

Как я работал с агентами

Сам я код не пишу, но в тему пришёл не с нуля: у меня опыт работы в IT, с компьютерами я знаком давно и когда-то изучал C++. Я умею поставить задачу, подключить агента к Blender или DaVinci Resolve и разобраться в результате. Остальное делает ИИ. На мне — идеи, приёмка и критика: смотрю, поправляю, ругаюсь.

Начинал я с Codex и постоянно с ним спорил. Позже перешёл на Claude. В октябре у меня работало несколько чатов: «отдел сцен», «отдел роликов» и «штаб». На пятый день, в 23:45, у аккаунта закончился недельный лимит. Все чаты остановились одновременно. Потом лимит обновился, но работа сама собой не продолжилась.

Тогда я перенёс задачи из переписки в файлы. Планировщик Windows каждые полчаса запускал исполнителя, который брал одну задачу. Если закончить её не удавалось, он оставлял короткую запись: на чём остановился и что нужно проверить дальше. Следующий запуск начинался с этой записи. Тяжёлый рендер отправлялся в отдельную очередь Blender на моей RTX 3080 Ti.

Отдельная очередь понадобилась по вполне прозаической причине. Однажды исполнитель запустил рендер в фоне, написал «жду уведомления» и завершил работу. Вместе с ним остановился и процесс, от которого он ждал уведомления.

Мы составили список проверок перед сдачей: вес первой загрузки, время кадров, ошибки консоли и положение модели в кадре на пяти размерах экрана. Исполнитель присылал ссылку, а я открывал её и изучал сцену. Вскоре выяснилось, что некоторые наши тесты успешно проходят даже тогда, когда модель сломана.

Что пропустили наши проверки

Реактор в чёрной пустоте

После переноса на новый шаблон тест не обнаружил ошибок в консоли и подтвердил, что реактор помещается в кадр. Я открыл сцену: реактор действительно был в кадре. Только вокруг него оказалась чёрная пустота. Исчезли здание, город, лес и половина кнопок.

Проверка положения реактора у нас была, а проверки наличия города — нет. Перед следующей попыткой мы перечислили всё, что человек мог увидеть, услышать и нажать в прежней сцене. Получилось 36 строк. По этому списку мы восстановили окружение и все девять кнопок.

Дальний план запекли в Blender: сумеречное небо (Sky Multiple Scattering), 34 тыс. деревьев (Geometry Nodes), 900 условных кварталов с окнами. Всё это поместилось в двух изображениях: pano_base.jpg весом 105 КБ и pano_lights.jpg весом 66 КБ. Огни на втором изображении загораются, когда станция начинает вырабатывать электричество. Ближний лес выполнен в 3D: 520 деревьев на телефоне и 1000 на десктопе.

Почему вместо мощности появилось NaN

На шагах 2, 5 и 7 модель исчезала, а пульт показывал «NaN МВт». Причиной был вызов pstep(0). В первом кадре после смены шага dt равнялся 0, и производная мощности делилась на ноль. Некорректное значение попадало в последующие вычисления, а затем и в матрицы отрисовки — поэтому исчезала модель. Исправление заняло одну строку: if(!(dt>0)) return;. Агент нашёл её, но только после того, как скриншоты в QA показали пустые кадры.

Почему модель помещалась в кадр только по отчёту

Первым эту ошибку заметил человек, открывший нашу модель микроволновки. Она создана на том же шаблоне. На шаге «разбери печь» вся начинка смещалась в правые 45 % экрана. Алгоритм кадрирования выбирал «свободную зону» и присваивал узкой полосе справа от большой формулы больше баллов, чем широкой области под ней. Автоматическая проверка сравнивала положение модели с той же зоной, но саму зону ни с чем не сопоставляла. В результате — ноль нарушений при очевидно неудачном кадрировании.

Мы изменили проверку и добавили два экрана небольшой высоты — 390 × 744 и 360 × 680. На той же сцене АЭС новый тест выявил замечания в 19 кадрах из 58. В некоторых местах модель смещалась на 75–124 пикселя. Теперь у меня появились конкретные кадры, на которых можно увидеть, что именно зашло за панель.

Октябрьские замеры оставлю под спойлером. В строке «4G» отдельно указаны первая отрисовка страницы (FCP) и появление самой модели. Частота кадров при отключённой вертикальной синхронизации относится только к тестовому прогону.

Локальные замеры 24–29 октября

Показатель

Старая сцена (24.10)

v3 (016, 29.10 02:40)

v3b, паритет (016b, 29.10 13:15)

three.js

r128

r186

r186

Страница

один HTML, 3,4 МБ, модели внутри

1,38 МБ, 27 запросов

1,20 МБ при первой загрузке (1,61 МБ с догрузкой)

Модель

встроенная

GLB 0,52 МБ, Meshopt, 99,6 тыс. треуг.

то же

4G

—

FCP 0,56 с, модель 1,48 с

FCP 0,52 с, модель 1,52 с

Ошибки консоли

—

0 на 5 размерах

0 на 5 размерах

Кадров > 50 мс

—

0 (макс. кадр 4–5 мс)

0 (FPS без vsync 670–1460)

fit STRICT

—

0 нарушений, 32 кадра

1 перекрытие + 4 «мелко» из 37 кадров

Время работы агента

—

≈ 1,5 ч (01:06 → 02:40, с одним падением)

≈ 2,5 ч (10:36 → 13:15, с одним падением)

С коробкой передач пока не получилось

Третий ролик, посвящённый коробке передач, мы начали ещё с Codex, используя купленную за $100 модель. Идея была такой: либо камера из салона ныряет под тоннель и показывает вращающийся механизм изнутри, либо автомобиль снаружи разлетается на части, после чего камера приближается к коробке. Для нейросети задача оказалась очень сложной. Кузов мы собирали, наверное, целую неделю. Я потратил немало денег на модели для генерации видео и моушн-дизайна, искал референсы. В итоге кое-что получилось, но кузов вышел угловатым и разъезжается непонятно как. По-настоящему красивой осталась только купленная модель. И самое обидное — машину мы так и не закончили. Столько времени, сил и денег, а готового результата до сих пор нет.

Тогда фразу «Это плохо, переделывай» я повторял по десять раз в день. В какой-то момент Codex сам сдался и написал, что, возможно, работу лучше передать другому агенту. Видимо, тоже устал.

С Claude на том этапе такое происходило реже: он точнее понимал мои просьбы, часто с первого раза. Потом мы перестроили процесс, и модели стали выглядеть гораздо лучше — и в 3D, и в видео. До желаемого фотореализма нам ещё далеко, но я примерно представляю, как к нему прийти.

А впервые меня по-настоящему впечатлил двигатель МиГ-19. Мы добавили звук, пламя форсажа и помпаж. Я даже не знал такого слова, пока мы не собрали модель. Но забавнее всего получилось с микроволновкой: прожил сорок лет и узнал, зачем в ней вращается тарелка, только благодаря собственной модели.

С Blender я раньше вообще не работал — впервые услышал о нём от племянницы, которая учится на дизайнера. А недавно мы купили плагины для создания естественного леса, дыма и огня, и разбираться во всём этом мне становится всё интереснее.

Сколько это стоило и кто пришёл посмотреть

Когда я готовил первый черновик 6 ноября, подписка на Claude стоила мне $100 в месяц, хостинг в Yandex Cloud — около 3 800 ₽ в месяц, домен — примерно 500 ₽ в год. На голос в ElevenLabs с дополнительными покупками ушло около $50. Среди разовых расходов — $100 за модель коробки передач и $50 за сцепление. Видеокарта у меня уже была.

Самая неприятная цифра в том черновике — ноль покупателей. Именно поэтому я пишу статьи и снимаю видео: хочу выяснить, интересно ли это кому-нибудь ещё.

К 6 ноября четыре шортса за месяц набрали 5,6 тыс. просмотров. Каждый ролик собирал примерно полторы тысячи, после чего рост резко замедлялся. Почему так происходило, по имеющимся данным сказать нельзя. По доле зрителей, продолживших просмотр в ленте Shorts, лидировал МиГ-19 — 70,5 %. Первым просмотрам я радовался как ребёнок и обновлял шортс каждые пять минут, а первые лайки вызвали отдельный восторг.

За тот же месяц Метрика зафиксировала на сайте 13 посетителей и 40 визитов. Из них 29 — прямые заходы. Думаю, значительная часть пришлась на нас: мы сами постоянно открывали сцены. Меня удивило уже то, что кто-то вообще заглянул на сайт. Очень не хватает обратной связи. В планах — создать нечто вроде YouTube для 3D-моделей, с комментариями и предложениями о том, что стоит добавить или исправить.

Кому бы я это показал

Школам и музеям. Микроволновку не принесёшь на урок, чтобы разобрать, а в интерактивной модели это можно сделать без труда. Я живу в Москве, хожу на выставки и видел немало стендов, где посетителям предлагают повращать модели. Мне хочется дополнить привычное вращение другими действиями: раздвинуть детали, запустить реактор, нажать аварийную защиту. Это ещё не «Железный человек», собирающий костюм руками в воздухе, но на экране кое-что подобное уже возможно.

Заводам такие модели могли бы помочь показывать продукцию на экране или интерактивном стенде. А с «Бураном» у меня отдельная история. Мой основной бизнес — ремонт квартир и офисов; однажды мы делали актовый зал на заводе, который производил «Буран». Установили там огромный экран, контакты сохранились. Я хочу собрать модель «Бурана» и предложить им ролик для этого экрана, интерактивную сцену для музея и стенд с сенсорным дисплеем. Если это интересно мне и находит отклик за рубежом, думаю, в России спрос тоже найдётся.

Если откроете сцену АЭС, попробуйте нажать в зале аварийную защиту. Мне интересно, куда вы посмотрели после нажатия и как поняли, что произошло. А если сцена зависнет, напишите, пожалуйста, на каком устройстве и на каком шаге это случилось. С таким описанием я хотя бы буду знать, с чего начать поиск проблемы.

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов