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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user