.[ ČeskéHry.cz ].
World space -> Object space

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 7. říjen 2010, 09:06:02    Předmět: World space -> Object space Odpovědět s citátem

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? Sad
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 7. říjen 2010, 09:40:15    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
igor



Založen: 28. 07. 2007
Příspěvky: 196

PříspěvekZaslal: 7. říjen 2010, 18:53:44    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 7. říjen 2010, 18:58:23    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 7. říjen 2010, 20:21:21    Předmět: Re: World space -> Object space Odpovědět s citátem

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? Sad


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. Wink
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
igor



Založen: 28. 07. 2007
Příspěvky: 196

PříspěvekZaslal: 7. říjen 2010, 21:38:47    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 8. říjen 2010, 17:37:45    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna