TransformLab posunout, otočit, složit

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

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í.

xybodsměrchybněbod → (x, y, 1)směr → (x, y, 0)délka směru1,7088 → 1,7088tuhá transformace ji neměníchyba, když se plete s bodem2,236= přesně velikost posunu
  1. 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.

  2. 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?

  3. „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.

  4. 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.

  5. 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.

Poslední krok kreslí i tu chybnou verzi, aby velikost omylu byla délka na obrázku a ne přídavné jméno.
bod → (x, y, 1)      směr → (x, y, 0)jediný rozdíl — a hlídá to celé

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í.

Vzorce v této kapitole

(x,y,0) — směr v homogenních souřadnicích
směr → (x, y, 0)ᵀ — posun se neuplatní [—] kap. 4
n′ — transformace normály
n′ = (M⁻¹)ᵀ · n [—] kap. 4