Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 31. prosinec 2009, 14:08:36 Předmět: Skeletal animation pomocí quaternionů |
|
|
Ahoj lidi, tak zas mám malej problém s implementací animací:-/ Chtěl jsem použít místo matic quaterniony, abych na gpu posílal co nejméně informací, narazil jsem ale na problém. Teď nevím, zda jsem úplně mimo, nebo je to fakt, ale abych mohl implementovat skeletární animace, tak mi nestačí na gpu posílat pouze quaternion s rotací a pozici kosti, ale musím poslat i pozici, podle které se rotuje, je to tak? Nebo lze nějak připočítat rotation axis do quaternionu?
Funkce ve vertex shaderu aktuálně vypadá pak takto:
kód: |
vec3 skinPosition(in vec3 position, float weight, int index)
{
return ((boneRotationAxisArray[index] + bonePositionArray[index] + quatRotation(boneRotationArray[index], position - boneRotationAxisArray[index])) * weight);
}
|
Přijde mi to jako hodně neoptimální řešení, navíc posílám do gpu skoro stejně hodnot, jako při použití matic. |
|
Návrat nahoru |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 4. leden 2010, 13:52:57 Předmět: Re: Skeletal animation pomocí quaternionů |
|
|
Hmm, koukám, že jsem se s problémem moc netrefil |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 4. leden 2010, 14:18:02 Předmět: |
|
|
Kua, ja som mal aj nieco rozpisane, ale potom som to zabudol odoslat
Takze, quaternion je pre teba 100% nahradou 3x3 rotacnej (pod)matice (nema shear, scale, je ortogonalna a ortonormalna). K tomu este musis prihodit poziciu (3-4 cisla). Takze namiesto 16 cisel mas 7-8 cisel a mas 100% tu istu informacnu hodnotu. To je vyhra nie?
Aj operacii pri nasobeni tam bude menej, ale netreba zabudat na to, ze GPU robi maticove nasobenie kurva rychlo, no analyzu poctu instrukcii nemam.
Repete: ci tam posles maticu 4x4, kde mas rotaciu aj translaciu je 100% ekvivalentne (v nasom pripade) s tym, ked tam posles kvaternion + translaciu.
Pozicia okolo ktorej rotujes je obycajne predchadzajuci klb (joint, pekne slovo ) na tvojej kostre. Tvoje rotacie budu lokalne, takze ho potrebujes.
Ja si to predstavujem tak, ze tam posles celu kostru, co je normalny strom, kde v kazdom uzle je 4x4 matica (pripadne ekvivalent) a odkaz na predchadzajuci (index). No a pomocou toho budes animovat. Kazdy vertex potom musi poznat index svojho klbu (pripadne viacero indexov a vah klbov), na ktory je naviazany. A to je cela informacia. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 4. leden 2010, 15:08:39 Předmět: |
|
|
Super, díky za odpověď. Alespoň jsi mi potvrdil mou domněnku.
Quaterniony používám, protože se snažím posílat menší počet hodnot do shaderu. Model využívá poměrně dost kostí a při GLSL 1.2 bych nezvládl dostat tak velké pole do vertex shaderu - narazil jsem na omezení. S Quaternionem + pozicí se mi to daří.
Pole kostí (rotací a pozic), které posílám do shaderu, mám již přednásobené z exporteru, takže jej posílám jen jako lineární seznam. Kosti pak nemusí nést informaci o svých rodičích. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 4. leden 2010, 18:18:13 Předmět: |
|
|
Používání quaternionů je dobrý nápad. Ještě malej postřeh: Pokud je 3x3 matice ortogonální a ortonormální a známe točivost prostoru, stačí uložit 2x2 submatici a zbytek dopočítat.
pcmaster napsal: |
Aj operacii pri nasobeni tam bude menej, ale netreba zabudat na to, ze GPU robi maticove nasobenie kurva rychlo, no analyzu poctu instrukcii nemam. |
4D vektor * 4x4 matice = 4 instrukce skalárního součinu, ano kurva rychlé. Transformace quaternionem je dost náročná (q^-1 * 4D vektor * q), takže je lepší ten quaternion v shaderu převést na 3x3 matici (vyplatí se to už pro jedno násobení myslím). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 5. leden 2010, 11:43:16 Předmět: |
|
|
Eosie napsal: |
je lepší ten quaternion v shaderu převést na 3x3 matici (vyplatí se to už pro jedno násobení myslím). |
To je dobrý nápad.
kód: |
float xx = q.x*q.x;
float yy = q.y*q.y;
float zz = q.z*q.z;
float xy = q.x*q.y;
float xz = q.x*q.z;
float xw = q.x*q.w;
float yz = q.y*q.z;
float yw = q.y*q.w;
float zw = q.z*q.w;
mat3 rotationMatrix = mat3(
1.0-2.0*(yy+zz), 2.0*(xy-zw), 2.0*(xz+yw),
2.0*(xy+zw), 1.0-2.0*(xx+zz), 2.0*(yz-xw),
2.0*(xz-yw), 2.0*(yz+xw), 1.0-2.0*(xx+yy),
);
|
Rychleji spočítat rotační matici asi nepůjde, že?
Eosie napsal: |
Pokud je 3x3 matice ortogonální a ortonormální a známe točivost prostoru, stačí uložit 2x2 submatici a zbytek dopočítat. |
Mohl by jsi prosím naznačit, jak by jsi to spočítal? Je asi zbytečné, abych se o to pokoušel, když se mohu zeptat:-) |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 5. leden 2010, 12:18:48 Předmět: |
|
|
klapauciusk napsal: |
Mohl by jsi prosím naznačit, jak by jsi to spočítal? Je asi zbytečné, abych se o to pokoušel, když se mohu zeptat |
LOL. SRY za oneliner . _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 5. leden 2010, 12:24:11 Předmět: |
|
|
ta 3x3 matica su tri vektory su na seba kolme maju jednotkovu dlzku. takze ked mas 2x2 tak si vies dopocitat tretiu zlozku tychto dvoch vektorov x*x+y*y+z*z=1 a x1*x2+y1*y2+z1*z*2=0 a treti je uz hracka kedze je to vektorovy sucin tychto vektorov. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 5. leden 2010, 12:28:43 Předmět: |
|
|
Jasný, omlouvám se. Zmátl mne pojem točivost prostoru. Už je mi to jasné |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 5. leden 2010, 12:29:56 Předmět: |
|
|
Vidis, to je zaujimave zistenie a to tym, ze rotaciu v 3D menej ako 4 cislami jednoducho nepopises! Otazka uz len je, co bude uspornejsie na vypocet. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 5. leden 2010, 12:37:54 Předmět: |
|
|
pcmaster napsal: |
Vidis, to je zaujimave zistenie a to tym, ze rotaciu v 3D menej ako 4 cislami jednoducho nepopises! Otazka uz len je, co bude uspornejsie na vypocet. |
No, ještě bych mohl použít Eulerovy úhly, tj. 3 hodnoty. Ale hrozí tam nebezpeční Gimbal Locku.
Nakonec zůstanu u quaternionů a v shaderu je převedu na matici.
Děkuji všem za rady |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 5. leden 2010, 15:02:33 Předmět: |
|
|
Jaké nebezpečí? Víš, co to vůbec Gimbal Lock je? Vážně to není problém. Je to vlastnost, která většinou nevadí.
pcmaster> Slyšel jsi někdy o exponenciálních mapách? Dá se pomocí toho reprezentovat rotační osa a úhel ve třech proměnných. Nevím o tom, že by to někdo používal. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 5. leden 2010, 15:18:28 Předmět: |
|
|
Eosie napsal: |
Jaké nebezpečí? Víš, co to vůbec Gimbal Lock je? Vážně to není problém. Je to vlastnost, která většinou nevadí. |
Tak, vím jen, že je to stav, při kterém lze ztratit jeden stupeň volnosti a orientačně vím, jak ho docílit. Popravdě, jsem se s ním ještě nesetkal, ale mám nějak v paměti uloženo - Eulerovy úhly / Gimbal Lock / Fuj Tak si říkám - proč riskovat. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 5. leden 2010, 15:40:18 Předmět: |
|
|
Nechť pořadí aplikace Eulerových úhlů je ZXY. Když se v 3D fps hře podíváš přesně nahoru (směr osy Y), tak si všimneš, že když se rozhlížíš doleva a doprava, tak se motáš kolem té jedné osy. Jenomže úplně stejnou rotaci můžeš dosáhnout i kolem osy Z (směr pohledu), takže když je rotace kolem osy X +- 90 stupnu, pak rotace kolem osy Y = rotace kolem osy Z, to je Gimbal Lock. Více různých Eulerových úhlů tedy může popisovat úplně stejnou rotaci, takže máš více možností jak převést 3x3 matici na Eulerovy úhly.
Já tedy říkám: Gimbal Lock - mňam.
BTW pokud děláš 3D fps, tak bez Eulerových úhlů neuděláš kameru. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 5. leden 2010, 15:49:57 Předmět: |
|
|
FPS nedělám
Děkuji za vysvětlení. Tohle spojení mi nikdy nedošlo |
|
Návrat nahoru |
|
|
|