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.

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.

xypočátekbod jako trojice(x, y, 1)ta 1 je pořád 11,00,02,00,01,01,00,00,01,0poslední sloupec = posun
  1. 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.

  2. (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ě.

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

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

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

Pět kroků. Třetí je ten, o který jde: ta jednička vždycky přibere celý poslední sloupec, ať je bod kdekoli.
(x, y) → (x, y, 1)     T = [[1, 0, tx], [0, 1, ty], [0, 0, 1]]homogenní souřadnice a matice posunu

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.

Vzorce v této kapitole

T — matice posunu (2-D)
T = [[1,0,tx],[0,1,ty],[0,0,1]] [—] kap. 1
(x,y,1) — homogenní souřadnice bodu
bod → (x, y, 1)ᵀ [—] kap. 1