Bod a směr: ta nula na konci
VectorLab začal tím, že bod je místo a vektor je posun. Vypadá to jako filozofie, dokud se nedostane na řadu transformace — tam se z toho stane chyba, kterou je těžké najít, protože u počátku se neprojeví.
- bod má polohu · směr nemá
VectorLab kapitola 1: bod je místo, směr je posun. Vypadají stejně — obojí je dvojice čísel — a při transformaci se chovají jinak.
- T(2,0, 1,0)
Posuneme celou scénu. Bod se očividně přemístí. Ale co ta šipka — má se přemístit taky?
- „sever" po posunu je pořád „sever"
Ne. Normála plochy, rychlost, osa otáčení — to všechno jsou směry, a směr nemá kde. Posunout „sever" o pět metrů na východ nedává smysl: pořád je to sever.
- bod → (x, y, 1) · směr → (x, y, 0)
A tady je ta elegance homogenních souřadnic: bod má na konci 1, směr 0. Ta nula vynásobí poslední sloupec nulou, takže se posun na směr nepřenese — a nemuselo se pro to psát nic navíc.
Kdo směr omylem transformuje jako bod, dostane u počátku správný výsledek — posun je tam skoro nulový. Chyba vyleze až daleko od počátku, obvykle jako „normály se rozbily, když jsem model odsunul". Proto to má vlastní funkci a vlastní test.
Ta nula udělá přesně to, co je potřeba: vynásobí poslední sloupec nulou, takže posun se na směr nepřenese. Rotace, škála a zkos se přenesou, protože ty jsou v horním bloku. Nemuselo se pro to napsat nic navíc — jen se použije 0 místo 1.
Co je směr
- Normála plochy — nejčastější oběť téhle chyby. Model se odsune od počátku a osvětlení se rozbije.
- Rychlost — rychlost bodu je rozdíl dvou poloh, tedy směr.
- Osa otáčení.
- Rozdíl dvou bodů — obecně. A naopak: bod plus směr je bod, bod plus bod není nic (VectorLab, kapitola 1).
Kontrola, která to odhalí. Transformuj dva body, odečti je — a musí vyjít totéž, jako když se transformuje jejich rozdíl jako směr. Testy v repu to ověřují na osmi stech náhodných transformacích, protože je to přesně ten druh chyby, který jeden ručně vybraný příklad (obvykle blízko počátku) nechytí.
A jedna past navíc: normály se netransformují rotací. Pokud je v transformaci nerovnoměrná škála, normála plochy se musí transformovat maticí (M⁻¹)ᵀ, ne M — jinak přestane být kolmá. U tuhých transformací je rozdíl žádný (protože Rᵀ = R⁻¹), takže tahle past čeká přesně na toho, kdo si zvykl na tuhý případ a pak něco zploští.