Jedna souřadnice navíc — a matice umí posunout
MatrixLab skončil u nepříjemného faktu: A·0 = 0 pro každou matici. Násobení je vážený součet sloupců a nulový vstup má nulové váhy, takže počátek zůstává na místě, ať se do matice napíše cokoli.
Jenže stroj potřebuje věci posouvat. A ne jednou — celý řetěz od základny robota k chapadlu je posun, otočení, posun, otočení… a chtělo by to mít v jedné matici.
- A·0 = 0 — pro KAŽDOU matici
MatrixLab skončil u nepříjemného faktu: násobení maticí je vážený součet sloupců, takže nulový vstup má nulové váhy. Počátek zůstává na místě, ať se do matice napíše cokoli. Jenže stroj potřebuje věci posouvat.
- (x, y) → (x, y, 1)
Trik: k rovinnému bodu se přidá třetí souřadnice, vždycky rovná jedné. Rovina se tím zvedne do výšky 1 v prostoru — a všechny naše body teď leží v jedné vodorovné hladině.
- poslední sloupec × 1 = posun
A teď to podstatné: násobení je vážený součet sloupců, takže ta jednička vždycky přibere celý poslední sloupec — ať je bod kdekoli. Do posledního sloupce se tedy napíše posun a je hotovo.
- [[1,0,2,0],[0,1,1,0],[0,0,1]]
Jednotková matice s posunem v posledním sloupci. Vypadá to jako podvod a je to poctivé: v trojrozměrném prostoru je to obyčejné lineární zobrazení — konkrétně zkos —, které naši vodorovnou hladinu posune do strany.
- posun · otočení · škála = jedna matice
Teď se všechno — posun, otočení, změna měřítka — dá zapsat jako matice, a skládá se to obyčejným součinem. Celý řetěz od základny robota k chapadlu je jedna matice. To je celý důvod, proč se homogenní souřadnice používají všude.
Není to podvod
Přidat souřadnici, která je vždycky 1, vypadá jako trik k obejití pravidla. Ve skutečnosti se úloha jen přesunula o rozměr výš: rovina se zvedla do výšky 1 v prostoru a matice, která ji posouvá do strany, je v tom prostoru úplně obyčejné lineární zobrazení — konkrétně zkos. Počátek prostoru se přitom nehne. Pravidlo z MatrixLabu tedy platí dál; my jsme si jen našli rovinu, která přes počátek neprochází.
Co se tím získá
- Všechno je matice. Posun, otočení, změna měřítka, zkos, zrcadlení — jeden typ objektu.
- Skládá se to součinem. Řetěz operací je součin matic, a ten se dá předpočítat: robot spočítá jednu matici a pak jí násobí body.
- Inverze je zase matice. Cesta zpátky se neřeší jinak než cesta tam.
- A jde to i pro perspektivu. Když se poslední řádek nechá být jiný než (0, 0, 1), vznikne projektivní transformace — přesně to, čím kamera promítá prostor do obrázku. Viz VisionLab.
Rozměry. Rovinné transformace jsou matice 3×3, prostorové 4×4. Poslední řádek je u všeho, co není perspektiva, roven (0, …, 0, 1). Nosí se s sebou schválně, i když je pořád stejný: jakmile se z něj v kódu udělá zvláštní případ, přestane se dát násobit obyčejným součinem — a tím se ztratí jediná věc, kvůli které to celé stojí za to.