.[ ČeskéHry.cz ].
Skeletal animations :: bone vertex weights

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
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ň

PříspěvekZaslal: 5. duben 2009, 19:36:55    Předmět: Skeletal animations :: bone vertex weights Odpovědět s citátem

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
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: 6. duben 2009, 04:32:49    Předmět: Odpovědět s citátem

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



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 6. duben 2009, 07:54:14    Předmět: Odpovědět s citátem

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... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kerekes



Založen: 29. 07. 2007
Příspěvky: 57

PříspěvekZaslal: 6. duben 2009, 09:36:45    Předmět: Odpovědět s citátem

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



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 6. duben 2009, 09:51:57    Předmět: Odpovědět s citátem

Nechápu... Crying or Very sad

Stejně to ale neřeší ty bone weighting...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kerekes



Založen: 29. 07. 2007
Příspěvky: 57

PříspěvekZaslal: 6. duben 2009, 10:22:41    Předmět: Odpovědět s citátem

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



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 6. duben 2009, 12:12:47    Předmět: Odpovědět s citátem

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
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. duben 2009, 21:36:45    Předmět: Odpovědět s citátem

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
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 -> C / C++ Č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