Dwa prawa, jeden promień
Każdy promień w labiryncie obeysz dokładnie dwóm zasadom. Przy lustrze prawo odbicia mówi, że kąt padania równa się kątowi zwierciadła, mierzone oba od normalnej powierzchni: θᵢ = θᴨ. Przy granicy szkła promień ugięcia zachodzi zgodnie z prawem Snella, które wiąże kąty padający i przechodzący z indeksami załamań dwóch ośrodków po obu stronach powierzchni.
prawo odbicia: θᵢ = θᴨ Prawo Snella: n₁ * sin(θᵢ) = n₂ * sin(θ₂) n₁, n₂ = współczynnik załamań ośrodka 1 i 2 (pusty/powietrze ≈ 1,0, szkło ≈ 1,5) θ mierzone od normalnej powierzchni, a nie od samej powierzchni live demo · fali rozchodzącej się przez granicę● ŻYWO Oba prawa wynikają z jednej idei: zasady Fermata, że światło przebywa między dwoma punktami po ścieżce, która zapewnia najkrótszy czas (zwykle minimalny). W jednorodnym ośrodku najszybszą ścieżką jest linia prosta, więc promień jest segmentem prostym do momentu uderzenia w interfejs. Przy lustrze odbicie jest jedyną ścieżką, która utrzymuje światło w tym samym ośrodku i spełnia warunek minimalnego czasu, co zmusza do równych kątów. Przy granicy refrakcyjnej światło wymienia prędkość na kierunek – porusza się wolniej w gęstszym ośrodku (prędkość v = c/n) – a geometria minimalizująca całkowity czas podróży jest dokładnie prawem Snella.
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
Budowa śledzia
Symulacja jest 2D-owym śledziem: w każdym kadrze, rzutuje się promień z źródła, znajduje najbliższą powierzchnię, którą przecina, i albo odbija go, albo refrakcji, a następnie powtarza się to do momentu aż promień opuści scenę, uderzy w cel lub zostanie osiągnięty limit odbić. Odbicie jest formułą wektorową, nie potrzeba używać trygonometrii w czasie wykonywania: // d = kierunek padający (wektor jednostkowy), n = normalna powierzchni (wektor jednostkowy) r = d - 2 * dot(d, n) * n; // kierunek odbity, jeden iloczyn skalarny. Refrakcja wykorzystuje wektorową formę prawa Snell'a, składając sinusy i cosinusy w iloczyny skalarne tak, aby renderer nigdy nie wywoływał funkcji asin w pętli głównej. Współczynnik złomienia eta = n1/n2 decyduje, czy promień ugięcia powinien skierować się w stronę lub z dala od normalnej powierzchni. Istnieje dodatkowy przypadek, który musi obsłużyć działka optyczna: całkowite wewnętrzne odbicie. Kiedy światło próbuje opuścić gęstsze medium pod zbyt małym kątem, nie istnieje rzeczywisty promień przesyłany – wyrażenie pod pierwiastkiem w prawym ujęciu prawa Snell'a staje się ujemne – i promień odbija zamiast refrakcji. Ten próg, kąt krytyczny, to właśnie sprawia, że słupki szklane i włókna optyczne zatrzymują światło, odbijając je w nieskończoność po wewnętrznej ścianie.
// d = incoming direction (unit vector), n = surface normal (unit vector) r = d - 2 * dot(d, n) * n; // reflected direction, one dot product
Rozszczepienie: dlaczego pryzmaty rozdzielają białe światło
Współczynnik załamania nie jest pojedynczą liczbą dla materiału – zależy słabo od długości fali, cecha ta nazywana jest rozszczepieniem. Światło niebieskie ugięcie się bardziej niż światło czerwone przechodzące przez ten sam szkło, ponieważ n(niebieskie) > n(czerwone). Pryzma wykorzystuje to: białe światło wpadające jednym końcem ulega innym odchyleniom dla poszczególnych kolorów, więc kolory oddzielają się i opuszczają drugim końcem pod rozwartym kątem. Podobnie prawdy fizyczne wyjaśniają tęczę, gdzie załamanie w kropelkach wodnych (plus jedno wewnętrzne odbicie) rozprasza światło słoneczne na jego spektrum pod stałym kątem 42° od punktu antisolarnego.
Projektowanie zagadek: dlaczego cele są rozwiązywalne
Labirynt laserowy to w rzeczywistości problem odwrotny: przy ustalonych lustrach i blokach szklanych, należy znaleźć obroty, które skierują wiązkę na cel. Ponieważ odbicie i refrakcja są zarówno deterministyczne, cała ścieżka jest czystą funkcją kątów luster – obrót lustra o 5° powoduje przewidywalny obrót całej dalszej części wiązki wokół osi, a nie zmiany w kierunku.
Ta determinacja sprawia, że gra jest uczciwa: zawsze istnieje osiągalna konfiguracja, a niewielkie korekty powodują małe, śledzone zmiany w tym, gdzie ląduje wiązka, zamiast chaotycznych skoków.
Frequently asked questions
Dlaczego wiązka czasami odbija się od szkła zamiast w niego wchodzić?
Jest to zjawisko odbicia Fresnela, a przy wystarczająco dużym kącie względem normalnej powierzchni, całkowite wewnętrzne odbicie. Prawdziwe szkło zawsze odbija kilka procent światła na każdej granicy, a powyżej kąta krytycznego dla światła opuszczającego gęstsze medium, 100% odbija się i nie przechodzi.
Czy kolor wiązki ma tutaj znaczenie?
W tym symulatorze wiązka jest traktowana jako pojedyncza długość fali, więc ugięcie się jej przy każdej powierzchni ze szkła jest stałe. W rzeczywistości każda długość fali ma nieco inny współczynnik załamania (rozszczepienie), dlatego prawdziwy pryzmat rozszczepia białe światło na spektrum zamiast zakrzywiać je jako pojedynczą wiązkę.
Co decyduje, czy lustro odbija, a blok zakrzywia?
Materiał przypisany do powierzchni. Lustra są modelowane jako w pełni odbijające, więc obowiązuje tylko prawo odbicia. Bloki ze szkła są modelowane z współczynnikiem załamania około 1,5, co oznacza, że światło wchodzące lub wychodzące z nich ulega odchyleniu zgodnie z prawem Snella i może również częściowo lub całkowicie się odbijać w zależności od kąta.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Laser Labyrinth i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację Laser Labyrinth