Jak działa śledzenie promieni w układach optycznych.
1. Wprowadzenie
Śledzenie promieni w układach optycznych polega zasadniczo na wielokrotnym stosowaniu zasad geometrii optycznej w przestrzeni trójwymiarowej. Promień definiowany jest przez jego położenie \(\mathbf{x}\), kierunek \(\mathbf{k}\), długość fali \(\lambda\) oraz moc optyczną \(P\). Podczas przechodzenia przez scenę promień oddziałuje z powierzchniami poprzez załamanie, odbicie, absorpcję i odcinanie.
Na każdym z przejściowych obszarów kierunek promienia jest określany przez prawo Snella. W postaci skalarniej:
\[ n_1 \sin(\theta_1) = n_2 \sin(\theta_2) \]
W praktycznych symulacjach śledzenie promieni odbywa się w pełnym trójwymiarze. Wymaga to zastosowania notacji wektorowej, w której obliczane są kierunek padającego promienia \(\mathbf{k}_i\), wektor normalny do powierzchni \(\mathbf{n}\) oraz kierunek promienia odbitego \(\mathbf{k}_t\). Jedna z powszechnie stosowanych form zapisu to:
\[ \mathbf{k}_t = \frac{n_1}{n_2}\mathbf{k}_i + \left(\frac{n_1}{n_2}\cos\theta_i - \cos\theta_t\right)\mathbf{n} \]
gdzie \(\cos\theta_i = -\mathbf{k}_i \cdot \mathbf{n}\) i \(\cos\theta_t\) wynikają z prawa Snella. Operację tę stosuje się na każdej powierzchni styku w układzie, co umożliwia śledzenie promieni przez dowolnie skomplikowane zestawy soczewek, warstw i powierzchni o określonej strukturze (patrz ?? i ??).
Oprócz zmian kierunku, każda interakcja powoduje redystrybucję mocy optycznej między promieniami odbitymi i transmitowanymi. Proces ten jest opisywany przez równania Fresnela. W przypadku światła niepolarizowanego, zwarta postać tych równań wygląda następująco:
\[ R = \left|\frac{n_1 \cos\theta_i - n_2 \cos\theta_t}{n_1 \cos\theta_i + n_2 \cos\theta_t}\right|^2, \quad T = 1 - R \]
Ogólnie rzecz biorąc, można wykorzystać współczynniki zależne od polaryzacji, oznaczone jako \(R_s, R_p\) i \(T_s, T_p\). Określają one sposób podziału mocy optycznej na każdym z brzegów i są niezbędne do przewidywania strat, przepustowości i wydajności.
2. Proste, naiwne podejście do śledzenia promieni.
Zasadniczo, śledzenie promieni jest więc procesem prostym: rozpoczynamy od promienia, znajdujemy kolejny punkt przecięcia, stosujemy prawo Snella i relacje Fresnela, a następnie kontynuujemy. Jednak podczas symulacji realistycznych układów optycznych (np. wyświetlaczy OLED, soczewek lub wydobywania światła z urządzeń) często konieczne jest śledzenie setek tysięcy, a nawet milionów promieni. Główny koszt nie wynika z obliczeń fizycznych, lecz z problemu wyszukiwania: ustalenia, z którym obiektem promień przecina się jako pierwszy.
W dyskretyzowanej scenie powierzchnie są zazwyczaj reprezentowane jako siatki trójkątów. Proste rozwiązanie polegałoby na sprawdzeniu, czy promień przecina każdy trójkąt w scenie. Dla promienia \(\mathbf{r}(t) = \mathbf{o} + t\mathbf{d}\) i trójkąta zdefiniowanego przez wierzchołki \(\mathbf{v}_0, \mathbf{v}_1, \mathbf{v}_2\), punkt przecięcia można zapisać w postaci barycentrycznej:
\[ \mathbf{o} + t\mathbf{d} = \mathbf{v}_0 + u(\mathbf{v}_1 - \mathbf{v}_0) + v(\mathbf{v}_2 - \mathbf{v}_0), \quad u,v \ge 0,\; u+v \le 1 \]
Obliczenie wartości \(t,u,v\) (np. za pomocą algorytmu Möllera–Trumbore'a) pozwala ustalić, czy promień przecina trójkąt. Metoda polegająca na przeszukiwaniu wszystkich możliwości ma złożoność obliczeniową \(\mathcal{O}(N)\) dla każdego promienia i \(N\) trójkątów, co szybko staje się zbyt kosztowne obliczeniowo.
3. Szybsze śledzenie promieni.
Aby rozwiązać ten problem, scena jest dzielona za pomocą struktur przyspieszających obliczenia przestrzenne, takich jak hierarchie ograniczających objętości (BVH). Geometria jest rekurencyjnie dzielona na ograniczające prostopadłościany (AABBs), tworząc strukturę drzewiastą. Każdy węzeł zawiera ograniczającą objętość, która obejmuje podzbiór trójkątów. Następnie śledzenie promieni odbywa się hierarchicznie: najpierw następuje przecięcie z ograniczającym prostopadłościanem, a dopiero jeśli do tego dojdzie, przechodzi się do węzłów potomnych.
W praktyce upraszcza to proces sprawdzania kolizji, zmniejszając jego złożoność od poziomu \(\mathcal{O}(N)\) do poziomu \(\mathcal{O}(\log N)\), co znacznie przyspiesza symulacje. Przykładowa struktura BVH została przedstawiona na ilustracji ??.
Dodatkowe optymalizacje obejmują wykorzystanie wielowątkowości na wszystkich rdzeniach procesora, wczesne odrzucanie trójkątów znajdujących się za promieniem oraz grupowanie danych dotyczących długości fali. Niemniej jednak, podstawowy problem pozostaje problemem wyszukiwania: efektywnego identyfikowania pierwszej powierzchni, z którą promień się styka.
4. Co to oznacza dla użytkownika takiego jak Ty? (czyli jak mogę przyspieszyć działanie symulacji)
Definiując scenę optyczną, na wydajność znacząco wpływa liczba elementów geometrycznych. Należy dążyć do minimalizacji liczby trójkątów, zachowując jednocześnie dokładność fizyczną. Na przykład, podczas importowania modeli CAD, należy usunąć zbędne detale (np. śruby, gwinty, drobne elementy mechaniczne).
Każdy dodatkowy trójkąt zwiększa koszt obliczeń związanych z przecięciem promienia z geometrią. Koszt ten jeszcze bardziej wzrasta podczas symulacji wielu długości fal lub dużych grup promieni. Dlatego, w przeciwieństwie do standardowych procesów CAD, efektywne modelowanie optyczne wymaga starannie uproszczonej geometrii, która uwzględnia jedynie istotne z punktu widzenia optyki elementy.
Podsumowując, śledzenie promieni w układach optycznych obejmuje: wielokrotne stosowanie prawa Snella w przestrzeni trójwymiarowej, obliczanie odbicia i transmisji zgodnie z prawami Fresnela oraz efektywne przeszukiwanie geometrii sceny. Wszystkie te elementy razem stanowią podstawę fizycznie wiernego modelowania optycznego w programie OghmaNano.