Два закони, один промінь
Кожен промінь у лабіринті дотримується точно двох правил. На дзеркалі закон відбиття стверджує, що кут падіння дорівнює куту відбиття, обидва виміряні від нормалі поверхні: θ_i = θ_r. На межі скла, промінь згибається відповідно до закону Снелла, який пов'язує кут паданого та кут відбитих променів із показниками заломлення двох середовищ по обидва боки від поверхні: n1 * sin(θ_i) = n2 * sin(θ_2)
Закон відбиття: θ_i = θ_r Закон Снелла: n1 * sin(θ_i) = n2 * sin(θ_2) n1, n2 = показник заломлення середовища 1 та 2 (вакуум/повітря ≈ 1.0, скло ≈ 1.5) θ вимірюється від поверхні, а не від самої поверхні ● LIVE демонстрація · хвильовий фронт, що згинається через межу● LIVE Обидва закони випливають з однієї ідеї: принципу Ферма, який стверджує, що світло проходить між двома точками найкоротшим шляхом (зазвичай найменшим часом). У однорідному середовищі найшвидший шлях є прямою лінією, тому промінь є прямим сегментом доки не зустрінеться з інтерфейсом. На дзеркалі відбиття - єдиний шлях, який утримує світло в тій самій середині та задовольняє умову стаціонарного часу, яка змушує кути бути рівними. На перегрівальній межі світло обмінюється швидкістю на напрямок — воно рухається повільніше у щільнішому середовищі (швидкість v = c/n) і геометрія, що мінімізує загальний час подорожі, дорівнює точно закону Снелла.
law of reflection: theta_i = theta_r Snell's law: n1 * sin(theta_i) = n2 * sin(theta_2) n1, n2 = refractive index of medium 1 and 2 (vacuum/air ~= 1.0, glass ~= 1.5) theta measured from the surface normal, not the surface itself
Розробка трасувальника променів
Симуляція є 2D трасувальником променів: у кожному кадрі кидайте промінь від джерела, знайдіть найближчу поверхню, з якої він перетинає, і або відбийте його, або розломте, потім повторюйте це до тих пір, поки промінь не вийде зі сцени, потрапить у ціль або буде досягнуто ліміту відскоків. Відбиття – це векторна формула, для якої не потрібна тригонометрія під час виконання:
// d = вхідний напрямок (вектор одиничної довжини), n = норма поверхні (вектор одиничної довжини) r = d - 2 * dot(d, n) * n; // відбитий напрямок, один добуток
Розломлення використовує векторну форму закону Снелла, об'єднуючи синуси та косинуси в добутки, щоб рендерер ніколи не викликав asin у гарячій петлі. Відношення η = n1/n2 визначає, чи згинається промінь до або від нормалі. Є один додатковий випадок, який повинен обробляти робочий ящик оптики: повне внутрішнє відбиття. Коли світло намагається покинути щільнішу середу під достатньо невеликим кутом, реального переданого променя не існує – термін під квадратним коренем з закону Снелла стає від’ємним – і промінь відбивається замість того, щоб розломлюватися. Цей поріг, критичний кут, дозволяє скляним стерням та оптичним волокнам утримувати світло, відбиваючи його всередині стіни безперервно.
// d = incoming direction (unit vector), n = surface normal (unit vector) r = d - 2 * dot(d, n) * n; // reflected direction, one dot product
Розсіювання: чому призми розділяють біле світло
Дисперсія – це не єдине число для матеріалу; вона слабко залежить від довжини хвилі, властивість, яка називається розсіюванням. Синій колір трохи більше викривляє шлях, ніж червоний, коли проходить через один і той же скляний матеріал, оскільки n(синій) > n(червоний). Призма використовує це: біле світло, що потрапляє на один бік, відхиляється різними способами для кожної кольорової складової, тому кольори розділяються та виходять з іншого боку під кутом розмазу. Таке ж фізичне явище пояснює веселку, де відбувається відхилення всередині сферичних крапель дощу (плюс один внутрішній відбиття), що розсіює сонячне світло в його спектр під фіксованим кутом 42° від антисонного пункту.
Дизайн головоломок: чому цілі вирішувані
Лазерна лабіринтська головоломка насправді є інверсійною проблемою: маючи задані дзеркала та скляні блоки, знайти повороти, щоб направити промінь на ціль. Оскільки відбиття та заломлення є детермінованими, весь шлях є чистою функцією кутів дзеркал — поверніть дзеркало на 5° і кожний наступний сегмент променя обертається передбачувано навколо осі повороту. Ця детермінація робить головоломку справедливою: завжди існує досяжна конфігурація, і невеликі коригування призводять до невеликих та відстежуваних змін у тому, куди падає промінь, а не хаотичних стрибків.
Frequently asked questions
Чому промінь іноді відбивається від скла замість того, щоб увійти в нього?
Це Френельове відбиття плюс, при достатньо великих кутах відносно нормалі, повноекранне відбиття. Реальне скло завжди відбиває кілька відсотків світла на будь-якій поверхні; за критичним кутом для виходу з щільнішого середовища 100% від нього відбивається і не проходить.
Чи має значення колір променя тут?
У цьому симуляторі промінь розглядається як одна довжина хвилі, тому він згибається на фіксовану величину при кожному контакті зі склом. У реальності кожна довжина хвилі має трохи індекс заломлення (дисперсія), через що справжній призма розсіює біле світло на спектр замість того, щоб його одноразово викривляти.
Що визначає, чи відбивається дзеркало, чи блокує скло?
Матеріал, призначений для поверхні. Дзеркала моделюються як повністю відбиваючі, тому застосовується лише закон відбиття. Скляні блоки моделюються з індексом заломлення близько 1,5, тому світло, що входить або виходить з них, змінює свій напрямок відповідно до закону Снеліуса і також може частково або повністю відбиватися залежно від кута.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте Laser Labyrinth і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію Laser Labyrinth