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

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 5. duben 2009, 19:36:55 Předmět: Skeletal animations :: bone vertex weights |
|
|
Zdravím, opět bych potřeboval trochu poradit, či popostrčit...
Trochu vylepšuji svůj animační systém a chtěl bych zvětšit počet kostí na vertex (nyní mám jednu kost na vertex)...
Vím jak transformovat bod požadovanou maticí, ale nevím jak provést zpětnou transformaci, kterou potřebuji udělat na začátku...
Toto provedu, ale neumím spočítat "r_vert"...
kód: |
vertex = (r_vert*matrix1)*w1 + (r_vert*matrix2)*w2; |
(r_vert - zpětně transformovaný vertex, w1 a w2 - váhy, matrix1 a matrix2 jsou matice kostí)
Doufám, že mi rozumíte...z gmaxe vyexportuji referenci, což je mesh a kostra v libovolné animaci v libovolném framu (nejlépe v baseframe)...
Zkrátka, potřebuji inverzní rovnici k té co jsem uvedl...
Díky...
PS: pokud znáte nějakou jinou variantu, jak to řešit tak sem s ní, ale myslím, že ta rovnice se takhle normálně využívá... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 6. duben 2009, 04:32:49 Předmět: |
|
|
Předpokládejme, že matice představují afinní transformace, tzn. v = u*matrix = u*r + t, kde r je rotační část matice a t je posun. Pro pohodlí to budu zapisovat v této formě.
Zkrátíme si proměnné: u = r_vert, v = vertex
Dále budeme potřebovat distributivitu násobení matic vůči jejich sčítání. To se dá aplikovat i na transformaci vektorů, jelikož vektor je přece matice s jedním řádkem (viz dále).
Tvoji rovnici upravíme na tuhle oddělením rotace a posunu:
v = (u*r1 + t1)*w1 + (u*r2 + t2)*w2, roznásobíme:
v = u*r1*w1 + t1*w1 + u*r2*w2 + t2*w2, posun přesuneme nalevo:
v - t1*w1 - t2*w2 = u*r1*w2 + u*r2*w2, využijeme distributivitu násobení matic vůči sčítání:
v - t1*w1 - t2*w2 = u*(r1*w2 + r2*w2), rotace přesuneme vlevo vynásobením inverzí celé závorky zprava:
(v - t1*w1 - t2*w2)*(r1*w2 + r2*w2)^-1 = u
Toto je inverzní funkce k té původní. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. duben 2009, 07:54:14 Předmět: |
|
|
OK, tak to by byla rovnice, děkuji...
Teď ale další problém...když r1 a r2 budou reprezentovány quaterniony, tak jak je sečtu a vynásobím w2 (float)...
Když jsem skoušel součet a násobení po složkách tak vycházeli kraviny...
A na netu jsem nic jiného nenašel...
Mějte se mnou trochu trpělivosti...  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
kerekes
Založen: 29. 07. 2007 Příspěvky: 57
|
Zaslal: 6. duben 2009, 09:36:45 Předmět: |
|
|
Podla mna vobec nieje potrebne spetne ratat tuto poziciu. Dolezite je co ti reprezntuju matice.
Pri exporte z maxa alebo cohokolvek si povedz ze toto je moja bind pose (pricom to moze byt lubovolny frame animacie).
Kedze si v bind pose, nasobenie vrchola animacnou maticou ti nesmie tento zmenit, tj tato matica musi byt jednotkova.
Takze mas svetove matice kostry v bind pose (ktore samozrejme niesu jednotkove) .. nech sa volaju Mb (ako bind) .. to je to co je aktualne pri exporte mesha.
Mas animacny kontroler, ktory ti v kazdom snimku da na vystup animovane svetove matice kostry (pri exporte animacie si ich nasamplujes v case a potom interpolujes) .. nech sa volaju Ma (ako animacne).
Vrcholy potom treba nasobit niecim ako Mb^-1*Ma ... co ti v pripade bind posy (Ma = Mb) da jednotkovu maticu a teda model zostane v exportovanej bind polohe.
Budes teda potrebovat akurat 2 polia vrcholov (normal, tangentov). Jeden set vo vyexportovanj bind polohe, ktory bude sluzit ako zaklad pri transformaciach (pripadne to co posles do shadera pri HW skiningu).. a druhe transformovane pole ktore uz bude mat aktualnu polohu podla animacie)
V pripade quaternionov by to malo byt ok tiez.
Naposledy upravil kerekes dne 6. duben 2009, 12:38:18, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. duben 2009, 09:51:57 Předmět: |
|
|
Nechápu...
Stejně to ale neřeší ty bone weighting... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
kerekes
Založen: 29. 07. 2007 Příspěvky: 57
|
Zaslal: 6. duben 2009, 10:22:41 Předmět: |
|
|
Riesi.
Normalne s tymito final maticami (Mf = Mb^-1*Ma) transformujes vrchol zo zakladnej polohy do finalnej.
Vf= (Vb*Mf1)*w1 + (Vb*Mf2)*w2
S tym ze Vb je to co si vyexportoval, V je to co renderujes, Ma, Mb su opisane hore. |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. duben 2009, 12:12:47 Předmět: |
|
|
Jasný, takže v podstatě to co normálně dělám, ale dohromady, ne postupně...jasnačka...
To mě nenapadlo...díky, to je lepší než řešit tu rovnici... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. duben 2009, 21:36:45 Předmět: |
|
|
VODA napsal: |
Teď ale další problém...když r1 a r2 budou reprezentovány quaterniony, tak jak je sečtu a vynásobím w2 (float)... |
NE. Quaterniony tady musíš převést na 3x3 matice.
Chytřejší si z toho odvození odnesou i zajímavý důsledek - geometrický význam lineární interpolace mezi 3x3 maticema... _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|