Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 7. říjen 2010, 09:06:02 Předmět: World space -> Object space |
|
|
Opacnu transformaciu vektorov, tj object -> world robim pomocou nasobenia maticou world inverse transpose (HLSL, ale to je jedno). Ale ja by som to potreboval aj opacne a za boha neviem prist ako na to. Asi to nebude take jednoduche, ze?  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 7. říjen 2010, 09:40:15 Předmět: |
|
|
vsak ked mas maticu M z A -> B tak z B -> A to bude M^-1 teda inverzna matica. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
igor

Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 7. říjen 2010, 18:53:44 Předmět: |
|
|
Nejde ten proces prostě obrátit? Pak z toho vyjde jenom transpozice. Když je ta matice pro vektory (všechno v [] je název jedné matice, ^T je transpozice)
[Mnormal_o->w] = ([Mo->w]^-1)^T
pak opačný proces by mohl být
[Mnormal_w->o] = ([Mw->o]^-1)^T
A protože pro neprojekční transformace
[Mw->o] = [Mo->w]^-1
tak
[Mnormal_w->o] = (([Mo->w]^-1)^-1)^T = [Mo->w]^T
Edit: upravena čitelnost zápisu, smazány zmatené myšlenky o orientaci normály
Naposledy upravil igor dne 7. říjen 2010, 21:43:01, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 7. říjen 2010, 18:58:23 Předmět: |
|
|
A^-1 = A^T plati len pre orthonormalne matice. teda tie ktorych stlpce su vektory na seba kolme a jedotkovej dlzky. to plati o beznych rotacnych maticiach bez translacie. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. říjen 2010, 20:21:21 Předmět: Re: World space -> Object space |
|
|
pcmaster napsal: |
Opacnu transformaciu vektorov, tj object -> world robim pomocou nasobenia maticou world inverse transpose (HLSL, ale to je jedno). Ale ja by som to potreboval aj opacne a za boha neviem prist ako na to. Asi to nebude take jednoduche, ze?  |
Když tam nebudeš srát scale, zkosení, a jiný blbiny, ale máš tam jen rotaci a translaci, pak je to snadný. Pozici a rotaci si ulož zvlášť. Ty vztahy jsou pak skoro stejný pro vektory i normály. I když tam máš scale, tak se furt vyplatí mít tu pozici zvlášť.
R - rotace (3x3 matice), případně i se scale (kromě pár jednoduchých případů ho stejně nejde od rotace oddělit)
P - posun (translace) (3x1 vektor)
Object->World
PosWorld = PosObject * R + P
VecWorld = VecObject * R // funguje obecně pro R bez scale, a pro případ se scale to funguje pouze pokud VecObject je tečna na povrchu modelu
VecWorld = VecObject * (R^-1)^T // funguje pouze pro případ se scale, kde VecObject je normála povrchu modelu; pokud tam není scale, pak je to stejné jako ta první varianta, protože v tomto případě platí: (R^-1)^T = (R^T)^T = R
Odvození inverze je triviální a dá se zjednodušit podle toho, jestli tam scale je nebo není:
World->Object (bez scale)
PosObject = (PosWorld - P) * R^T
VecObject = VecWorld * R^T
World->Object (se scale)
PosObject = (PosWorld - P) * R^-1
VecObject = VecWorld * R^-1 // pouze pro tečny
VecObject = VecWorld * R^T // pouze pro normály, ((R^-1)^T)^-1 se dá totiž zjednodušit na R^T (na pořadí inverzí a transpozicí nezáleží)
Tady ty vztahy fungují obecně pro převod mezi dvěma souřadnicovými systémy a počítají pouze s posunem, rotací a scale.
A na konec geometrický význam inverze a transpozice:
R^-1 // invertuje rotaci a scale
R^T // invertuje pouze rotaci, scale zůstává stejný
(R^-1)^T // invertuje pouze scale, rotace zůstává stejná
Proč jeden vzorec funguje jen pro tečny a jiný jen pro normály, to už si zdůvodnite sami.  _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
igor

Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 7. říjen 2010, 21:38:47 Předmět: |
|
|
nou:
Já tam nic o tom, že by inverze byla obecně totožná s transpozicí, nemám. Pouze odvození pro matice pro normály (kde se dělá inverze transpozice), má to tak i Eosie.
Eosie:
Normála se v těchto případech nechová tak úplně jako vektor z matematického hlediska, zajímá nás kolmost k povrchu, neuniformní scale a zkosení mění úhly. U "true" vektorů to nevadí. Tu pozici snad ani není třeba ukládat zvlášť, akorát u vektorů položit w=0 (a pak samozřejmě nedělit w), popř. u vektorů pracovat s podmaticí 3x3.
S těmi orientacemi jsem se trochu sekl, ono je to asi třeba řešit jen pro divočejší transformace typu perspektivní projekce, kde jsou nenulové hodnoty v těch nehezkých čtvrtých řádcích/sloupcích.
jinak pokud by ještě někoho dalšího zajímalo, např. tady je hezky vysvětleno, proč se dělá tu inverzi a transpozici
http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/backfacecull.shtml |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 8. říjen 2010, 17:37:45 Předmět: |
|
|
Ten vzorec na transformaci normál se dá i formálně odvodit (dokázat) přímo, z toho, že chceme zachovat kolmost tedy když normála a tečna jsou na sebe kolmé, pak i normála a tečna po transformaci musí být taktéž na sebe kolmé. Popsáno vzorcem:
n . t = (N * n) . (M * t) = 0 // předpoklad
. - skalární součin, n - normála, t - tečna, M matice pro transformaci, N - matice pro tranformaci normály, kterou hledáme.
n^T * t = (N * n)^T * M * t = 0 // skalární součiny upraveny na násobení 3x1 a 1x3 matice
n^T * t = n^T * N^T * M * t = 0 // odstranění závorky
Teď aby se tohle mohlo rovnat, pak N^T * M musí být identita. Pro ty, co to nevidí:
n^T * t = n^T * I * t = 0 // I se může škrtnout a je to stejný jako ta první část
Tak tedy máme:
N^T * M = I
N^T = M^-1
N = (M^-1)^T
[] _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|