feat(labs): opticsbench round 1 — instruments + aberrations + dispersion + chain

9 готовых пресетов приборов (OB_PRESETS):
- Лупа, Микроскоп, Телескопы Кеплера/Галилея, Камера, Перископ, Проектор
- Световод (TIR), Согнутая ложка в воде
- HUD с подписью на 5 сек при загрузке + chime/whoosh sounds

ThinLensSim — стрелка-объект + анимация 3 главных лучей:
- Slider высоты объекта h_o, расчёт h_i и Г с учётом знака
- Real (cyan) vs Virtual (pink, dashed) image
- Кнопка «Построить лучи» → tween (easeOutCubic) по 500мс каждый
- Финальный chime при сходимости

ThinLensSim — формула lensmaker (R₁, R₂, n):
- Toggle «Подробный / Простой» переключает между f-слайдером и R₁/R₂/n
- Вычисление f и диоптрий D=1000/f
- Силуэт линзы динамически меняется (биконвекс/мениск/...)

MirrorSim — переменная кривизна R:
- Slider R: -250..+250 (signed, convex/concave/flat)
- Toggle «Параболическое / Сферическое» → 5-ray aberration fan
- На спherической краевые лучи разъезжаются; на параболе — точечный фокус

FreeBuildSim — multi-lens chain (новый класс):
- Каскадный расчёт изображений: image_n становится object_(n+1)
- F_sys = f1·f2 / (f1+f2-d), общее Г = Г1·Г2·...
- 3 ray tracing через всю цепочку
- 3 пресета: микроскоп / телескоп / relay
- Новая вкладка «Цепочка линз»

ThinLensSim — сферическая и хроматическая аберрации:
- Toggle «Сферическая»: 5 параллельных лучей с f_eff(h) = f - h²/(2f), spread видно
- Toggle «Хроматическая»: 3 bundle R/G/B с f×{1.02,1.0,0.98}, focal spread метки

Wavelength slider 380–780 нм:
- wavelengthToRGB() — sRGB-приближение CIE
- Цвет лучей применён во всех 3 модулях (lens/mirror/refraction)
- Toggle «Белый свет» — 3 RGB bundle с физически корректным n(λ) сдвигом
- n(λ) = 1.55 - 0.0002*(λ-550) — линейная дисперсионная модель

PrismSim — призма (новый класс):
- Равносторонняя стеклянная призма, draggable + rotatable
- Double-Snell на двух гранях, n(λ) → веер радуги при белом свете
- Новая вкладка «Призма»

Спектрометр-панель:
- 280×80 панель с rainbow gradient 380–780 nm
- Маркер текущей длины волны + точки выхода после призмы
- Авто-показ в режиме призмы

Все добавления additive — ни один из существующих 4 режимов не сломан.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-26 12:16:39 +03:00
parent 02009a8c94
commit 2a8011d68e
3 changed files with 1759 additions and 33 deletions
+35
View File
@@ -428,6 +428,17 @@
}
.proj-preset-chip:hover { border-color: var(--violet); color: var(--violet); background: rgba(155,93,229,.06); }
/* opticsbench instrument preset chips — reuse proj-preset-chip style */
.ob-preset-chip {
padding: 4px 10px; border-radius: 7px; font-size: 0.72rem; font-weight: 700;
border: 1.5px solid var(--border-h); background: transparent;
color: var(--text-2); cursor: pointer; transition: all .15s; white-space: nowrap;
}
.ob-preset-chip:hover { border-color: var(--cyan); color: var(--cyan); background: rgba(103,232,249,.07); }
.ob-preset-chip.active { border-color: var(--cyan); color: var(--cyan); background: rgba(103,232,249,.12); }
.ob-preset-chip.ob-preset-clear { border-color: #333; color: #666; }
.ob-preset-chip.ob-preset-clear:hover { border-color: #EF476F; color: #EF476F; background: rgba(239,71,111,.07); }
/* stats bar */
.proj-stats-bar {
flex-shrink: 0; display: flex; align-items: stretch;
@@ -1477,3 +1488,27 @@ canvas[data-draggable]:active { cursor: grabbing; }
#lab-sim {
view-transition-name: sim-view;
}
/* ═══ Optical Bench — wavelength slider ═══ */
#ob-wavelength-bar {
min-height: 34px;
}
#ob-wavelength-bar input[type=range] {
height: 4px;
background: linear-gradient(to right,
#8000ff 0%, #0000ff 10%, #00ffff 30%,
#00ff00 50%, #ffff00 65%, #ff8000 80%, #ff0000 100%);
border-radius: 2px;
outline: none;
cursor: pointer;
}
/* ═══ Spectrometer panel ═══ */
#ob-spectrometer-panel {
overflow: hidden;
}
#ob-spectrometer-canvas {
border: 1px solid #1a1a2e;
border-radius: 4px;
background: #0a0a18;
}