Stout теперь содержит отдельную разреженную взвесь микропузырьков. Полная фазовая функция вычисляется по теории Лоренца — Ми для каждой RGB-полосы. Концентрация и распределение размеров — явные допущения; это физически мотивированная модель, не калибровка конкретного Guinness.
Исследование каскадов пузырьков Guinness (Scientific Reports, 2019) указывает средний диаметр около 50 мкм. В модели принят равномерный по числу диапазон диаметров 40–60 мкм: это наш выбор ширины и формы распределения. Объёмная доля газа φ регулируется от 0 до 0,5%, в базовых численных проверках 0,20%; стартовый демонстрационный пресет редактора использует 0,35%. Эти концентрации не измерены в напитке. Состав газа учитывается через близкий к единице показатель преломления, принят nгаз = 1; сама по себе надпись «азот» не задаёт мутность.
Форма и размеры жидкой линзы остаются прежними, показатель основной среды — представительная модель пива около 1,34. Поглощение стаута задано отдельно через 80 EBC и приближённую спектральную кривую: см. цвет стаута. Цветность EBC относится к дегазированному образцу; рассеяние на газе не добавляется в этот коэффициент повторно.
Используется стандартное решение Ми и опубликованные численные эталоны для непоглощающей сферы в непоглощающей среде. Аргументы: m = nгаз / nсреды < 1, x = 2π nсреды r / λвакуум. Радиус в миллиметрах, вакуумная длина волны переведена из нанометров. Учёт nсреды в x принципиален.
Из коэффициентов aₙ,bₙ получаем Qsca и интенсивности S₁,S₂. Для неполяризованного света dCsca/dΩ = (|S₁|² + |S₂|²)/(2k²), где k = 2π nсреды/λ. Проверяем Qext = Qsca и интеграл угловой интенсивности до нормировки. Функция включает узкую дифракционную долю вперёд, широкое преломление/отражение и обратное рассеяние. Единственное число g или гауссово размытие эту форму не восстанавливает.
Для распределения радиусов: N = φ / E[4πr³/3], σs = N E[πr² Qsca]. Угловая смесь взвешивается сечениями и численностью, а не простым средним нормированных фаз. Средний объём пузырька ≈ 6,807 × 10⁻⁵ мм³; при φ = 0,002 около 29,4 пузырька на мм³.
| Параметр, 20°C, Dispersion 1× | Красный 643,8 нм | Зелёный 546,1 нм | Синий 467,8 нм |
|---|---|---|---|
| σs при 0,20%, мм⁻¹ | 0,118456 | 0,118414 | 0,118293 |
| g = E[cos θ] | 0,846108 | 0,844352 | 0,842187 |
| Средний свободный пробег, мм | 8,442 | 8,445 | 8,454 |
Для прямого пути 8 мм вероятность не испытать ни одного микропузырькового рассеяния около 38,8%. Это не всё пропускание: рассеянные фотоны тоже могут попасть на матрицу. Приведённый коэффициент σ′s = σs(1−g) около 0,0184 мм⁻¹ характеризует потерю направления, но в трассировке используется полный σs и полная фаза, без замены на диффузионное приближение.
Каждый обратный луч проходит заднюю поверхность, затем случайный путь в жидкости. Общее рассеяние σtotal = σnitro,λ + σHG. Свободный пробег s = −ln(1−u)/σtotal; при событии выбирается компонент с вероятностью его σ/σtotal. Для азота угол берётся из нормированной функции Ми, для фоновой настройки Haze — из HG с g = 0,85. Азимут равномерен. После события трассировка продолжается. Экспонента exp(−σtotal L) не умножается повторно: свободные пробеги уже учитывают выживание.
Крупные сферы из Bubbles & haze остаются явными геометрическими границами с Френелем, преломлением и полным внутренним отражением; внутри них рассеяние и поглощение выключены. Для микровзвеси поглощающая длина в основной среде умножена на (1−φ): это гомогенизированное приближение вытеснения жидкости газом, а не точное восстановление каждого газового хорда. Поглощение экспоненциально по фактическому накопленному жидкому пути.
Источник излучения — исходная фотография как далёкая угловая сцена. Задняя полусфера, боковая стенка и неизвестная сцена за краями кадра чёрные. Поэтому модель не добавляет белую пелену и не может осветлить полностью чёрный кадр. «Кремовый» характер зависит от света: яркие области перераспределяют свет в соседние направления, контраст падает, длинные пути сильнее окрашиваются поглощением. Микропузырьки не рисуются кружками на плоскости готового фото.
33 узла Гаусса — Лежандра по радиусу, 8192 интервала по сетке θ = π(i/N)². Для GPU сохраняются 2049 Float32-квантилей угла, а не косинуса: это сохраняет малые отклонения и позволяет считать sin θ без потери точности вычитания 1−cos² θ. Выборка CPU использует те же квантильные таблицы. Для контрольной зелёной полосы дополнительно проверены массы угловых интервалов 1°, 5°, 90° с абсолютной погрешностью менее 0,00008 и сходимость первого момента между 2049 и 4097 квантилями менее 0,00002. Стандартные таблицы включены в локальные файлы; новые значения температуры и дисперсии вычисляет отменяемый Web Worker.
Проверки Qsca, g, комплексных коэффициентов и относительных угловых интенсивностей совпадают с опубликованными эталонами. Сходимость 9→17→33→65 радиусов и 4096→8192→16384 углов записана в численные результаты. При переходе 33/8192 → 65/16384: отличие σs менее 0,003%, g менее 4 × 10⁻⁵; абсолютная ошибка вероятности задней полусферы менее 2 × 10⁻⁵. Ошибка нормировки до исправления масштаба менее 3 × 10⁻⁹ для стандартных полос. Это сходимость выбранной модели, не точность по реальному Guinness.
Проверены выживание прямой компоненты по exp(−σL), частоты конкурирующих компонентов, пассивность, нулевой азот, отсутствие влияния на другие жидкости, фактическая CPU/GPU-трассировка и цветовой интеграл. Дополнительно проверяются рабочий поток, его отмена, настройки, рецепт, Undo/Redo и мобильная компоновка. При 0% отключаются все добавочные случайные выборки, поэтому старые пути восстанавливаются точно.
С азотом путь ограничен 128 событиями, без него прежними 32. В опыте по 30 000 путей для стандартного и предельного режима (0,5%, 18 мм, отверстие 30 мм, 24 крупных пузырька, Haze 0,025, деформация 0,12) лимит не достигнут: максимум 17 и 61 событие соответственно. Сравнение с 256 событиями совпало в этих выборках; это не доказательство отсутствия редких обрезанных путей. Лимит даёт отрицательное смещение при достижении, особенно заметное при искусственном отключении поглощения и необычных seed.
Независимое рассеяние на разреженных сферах, скалярный неполяризованный перенос. Ми здесь использует вещественный показатель основной среды, а поглощение стаута считается между событиями: это приближение, не строгое электромагнитное решение пузырька в поглощающей жидкости. Не моделируются корреляции соседних пузырьков, их движение, каскады, плотная пена, изменение эффективного показателя смеси, поляризация, дифракция на отверстии и оптика оболочки. Три полосы не восстанавливают спектр или неизвестное окружение камеры. Концентрация, разброс размеров и спектр поглощения требуют измерений для калибровки конкретного образца.
Воспроизведение: node --test tests/*.test.mjs, node research/nitro-experiments.mjs, node research/nitro-transport.mjs. Обновление встроенных стандартных таблиц: node research/generate-nitro-tables.mjs. Модули: nitro-mie.mjs, nitro.mjs, nitro-worker.mjs, beer-volume.mjs и GPU-пара.