ORIGIN · ODIR · D (unit)T · ≥ 0TEST · sphere
Rozdział 2 / Podstawy

Wektory, promienie i pierwsze przecięcie

W Rozdziale 1 poznałeś intuicję. Teraz przechodzimy do liczb: jak zapisać promień jako wzór matematyczny i jak sprawdzić, czy trafia w sferę — pierwszy kształt, który zaprogramujesz.

TL;DR
Pass: Reprezentacja

Punkt czy wektor?

W większości silników i DCC-ek position i direction wyglądają identycznie — trójka (x, y, z). Matematycznie zachowują się jednak inaczej, i ta różnica będzie miała znaczenie już za chwilę.

Kluczowa różnica: gdy przesuwasz (translate) scenę, punkty się przesuwają, a wektory kierunkowe — nie. Kierunek „w prawo” pozostaje „w prawo”, niezależnie od tego, gdzie stoisz. To dlatego w reprezentacji jednorodnej punkty i wektory bywa się oznacza inną „czwartą współrzędną” — ale na razie wystarczy sama intuicja.

Pass: Toolkit

Operacje, które będziesz używać bez przerwy

Cały ray tracing stoi na czterech operacjach na wektorach. Żadna z nich nie jest skomplikowana — chodzi tylko o to, żeby ich geometryczny sens wszedł w krew, bo pojawiają się dosłownie w każdym wzorze w tej książce.

Vector.toolkitOps · 3
PUNKT − PUNKT NORMALIZACJA ILOCZYN SKALARNY B A A − B wektor = cel − start V u u = V / |V|, |u| = 1 A B θ A·B = cosθ (dla wersorów) >0 zgodne =0 prostopadłe <0 przeciwne
Trzy operacje, które wracają w każdym kolejnym rozdziale tej książki.
Pass: Definicja promienia

Promień jako wzór

Mając wektory, możemy zapisać promień. Promień to punkt startowy O (origin — najczęściej pozycja kamery albo poprzedni punkt trafienia) i znormalizowany kierunek D. Każdy punkt na promieniu opisuje jeden wzór:

P(t) = O + t · Dt — skalar: „jak daleko wzdłuż D od punktu O”

t = 0 to sam punkt O. t = 1 to punkt w odległości |D| (czyli 1, jeśli D jest znormalizowany). Każde kolejne t oddala nas dalej w tym samym kierunku. W ray tracingu liczą się tylko t > 0 — promień „istnieje” fizycznie tylko przed kamerą, nie za nią.

Ray.parametrizeP(t) = O + t·D
t = 2,00 · P(t) leży 2,00 wzdłuż D od O
CAM t < 0 (odrzucone) D (znormalizowany) O · t=0 t=1 t=2 t=3
Przesuń t — punkt jedzie wzdłuż promienia; dla t<0 szarzeje, bo taki punkt fizycznie nie istnieje.
Pass: Ray–sphere intersection

Pierwsze przecięcie: promień i sfera

Sfera jest najprostszym kształtem do przecięcia, dlatego prawie każda książka o ray tracingu — ta też — zaczyna właśnie od niej. Sferę o środku C i radiusie r definiuje jeden warunek: każdy punkt P na jej powierzchni spełnia

|P − C|² = r²

Podstawiamy nasz wzór promienia w miejsce P i wprowadzamy pomocniczy wektor L = O − C (od środka sfery do kamery). Po rozwinięciu dostajemy klasyczne równanie kwadratowe:

a·t² + b·t + c = 0a = D·D (= 1, gdy D jest znormalizowany)  ·  b = 2·(D·L)  ·  c = L·L − r²

To dosłownie wzór ze szkoły średniej — litery a, b, c mają teraz geometryczne znaczenie. Rozwiązujemy go przez wyróżnik:

Δ = b² − 4ac
Discriminant.casesΔ = 4(r²−d²)
d = 1,00 · r = 2,00 · Δ = 12,00 · HIT · Δ>0
HIT · Δ>0 C d t₀ t₁ przesuń d — ten sam promień, ten sam wyróżnik, teraz na żywo
d — odległość promienia od środka sfery po prostopadłej. Δ zmienia znak dokładnie przy d = r — dokładnie ten sam wyróżnik co we wzorze wyżej, tylko przepisany geometrycznie.
Pass: Zapowiedź

Co z innymi kształtami?

Sfera jest wygodna, bo jej równanie jest proste — ale świat nie składa się z samych kul. W kolejnych rozdziałach sprawdzimy przecięcia z płaszczyznami i trójkątami (czyli z każdą siatką, którą wyeksportujesz z Blendera albo Maya), korzystając z tych samych narzędzi: wektorów, iloczynu skalarnego i tego samego wzoru P(t) = O + t·D.

Słowniczek
Punkt
Pozycja w przestrzeni (kamera, środek sfery, punkt trafienia).
Wektor
Kierunek albo przesunięcie; niezmienny względem translacji.
Normalizacja / wersor
Skalowanie wektora do długości 1, zachowując kierunek.
Iloczyn skalarny (dot product)
Miara zgodności kierunkowej dwóch wektorów; dla wersorów równa cosθ.
Parametr t
Odległość wzdłuż promienia od punktu O w kierunku D.
Wyróżnik (discriminant, Δ)
Decyduje, czy promień mija, dotyka, czy przecina sferę w dwóch punktach.