.[ ČeskéHry.cz ].
Skeletal animation pomocí quaternionů
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 31. prosinec 2009, 14:08:36    Předmět: Skeletal animation pomocí quaternionů Odpovědět s citátem

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. Confused
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 4. leden 2010, 13:52:57    Předmět: Re: Skeletal animation pomocí quaternionů Odpovědět s citátem

Hmm, koukám, že jsem se s problémem moc netrefil Crying or Very sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 4. leden 2010, 14:18:02    Předmět: Odpovědět s citátem

Kua, ja som mal aj nieco rozpisane, ale potom som to zabudol odoslat Very Happy Very Happy

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



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 4. leden 2010, 15:08:39    Předmět: Odpovědět s citátem

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
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: 4. leden 2010, 18:18:13    Předmět: Odpovědět s citátem

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



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 5. leden 2010, 11:43:16    Předmět: Odpovědět s citátem

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



Založen: 18. 09. 2007
Příspěvky: 1536
Bydliště: u Prahy

PříspěvekZaslal: 5. leden 2010, 12:18:48    Předmět: Odpovědět s citátem

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 Smile

LOL. SRY za oneliner Embarassed.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 5. leden 2010, 12:24:11    Předmět: Odpovědět s citátem

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



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 5. leden 2010, 12:28:43    Předmět: Odpovědět s citátem

Jasný, omlouvám se. Zmátl mne pojem točivost prostoru. Už je mi to jasné Embarassed Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 5. leden 2010, 12:29:56    Předmět: Odpovědět s citátem

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



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 5. leden 2010, 12:37:54    Předmět: Odpovědět s citátem

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 Smile
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: 5. leden 2010, 15:02:33    Předmět: Odpovědět s citátem

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. Wink Nevím o tom, že by to někdo používal.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 5. leden 2010, 15:18:28    Předmět: Odpovědět s citátem

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 Smile Tak si říkám - proč riskovat. Rolling Eyes
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: 5. leden 2010, 15:40:18    Předmět: Odpovědět s citátem

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



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 5. leden 2010, 15:49:57    Předmět: Odpovědět s citátem

FPS nedělám Smile

Děkuji za vysvětlení. Tohle spojení mi nikdy nedošlo Confused
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 -> Obecné Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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