Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 1. září 2013, 22:31:01 Předmět: Implementace skeletální animace |
|
|
Ahoj, implementuji teď skeletální animaci a nějak mi to nejde. Meshe jsou povětšinou nesmyslně zkřivené. Abych to mohl pořádně zdebugovat, tak bych potřeboval vědět na jisto, jak přesně se má spočíst pozice vertexu - tedy jaké transformační matice mám použít a v jakém pořadí je znásobit.
Pro zjednodušení je zatím každý vertex transformovaný jen jednou kostí. Data modelu načítám pomocí assimpu.
Zatím to mám tak, že pozice vertexu se spočte takhle:
gl_Position = projection * view * model * boneOffset * boneCombined * vec4( position, 1.0f );
boneOffset - "Matrix that transforms from mesh space to bone space in bind pose. ", viz aiBone. Chápu to tak, že to je inverzní matice k transformaci z prostoru modelu do prostoru dané kosti.
boneCombined - je vytvořen rekurzivní funkcí, která prochází strom kostí od kořene. spočte se takto:
boneCombined = this->transform * this->scaling * this->rotation * this->translation * parent->boneCombined
this->transform je defaultní transformace kosti oproti rodiči. scaling, rotation a translation jsou transformace kosti podle fáze animace.
Jak by to mělo být správně? Tohle jsem tak nějak splácal podle různých návodů, ale moc se mi to nezdá. Sám bych to udělal trochu jinak, ale tak se mi výsledek zdál ještě horší, tak to zatím mám takhle. Klidně se nebojte podat mi to trochu teoretičtěji, chtěl bych v tom mít jasno, abych to mohl udělat tak, že si tím budu jistý.
Díky, |
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 2. září 2013, 18:40:11 Předmět: |
|
|
Teď mě napadlo: nemůže se lišit hodnota quaternionu při použití stupňů a radiánů?
Já načtu quaternion rotace keyframu pomocí knihovny assimp a vytvořím glm quaternion za použití hodnot 'w', 'x', 'y' a 'z'. Poté použiji glm funkci, která zkonvertuje quaternion na mat4 a tou znásobím transformační matici.
Takže mě napadlo, že kdyby se rotace quaterniou interpretovala různě ve stupních a různě v radiánech a glm používal jinou jednotku pro úhly než assimp, tak by to byl problém.
Quaterniony nemám teoreticky vůbec zmáknuté, takže bych se chtěl zeptat, jak to tedy je.
Díky. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 2. září 2013, 19:46:38 Předmět: |
|
|
Díky moc, aspoň tohle nemusím řešit.
Ale pořád mi to nefunguje, já se z toho asi už poseru. To je prostě normální sviňárna, jinak to není možný. Já prostě nechápu, když udělám v Blenderu jednoduchou skeletální animaci s jedním keyframem, který má jednu rotaci a pak to vyexportuji do formátu .x, tak proč je v něm najednou 21 keyframů a assimp mi tvrdí, že jich je 250. A ještě k tomu jich většina zahrnuje nějaké podivné translace, které jsem tam vůbec nenastavoval.
Assimp předpočítává offset matici pro jednotlivé kosti. Tak proč proboha když jí spočtu znovu sám, tak mi vyjde úplně jiná matice? To prostě nedává smysl. A proč nejsou transformace animace dány relativně k defaultní transformaci kosti už vůbec nechápu.
Buď mi tohle někdo vysvětlí nebo už na to seru. |
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 3. září 2013, 10:31:17 Předmět: |
|
|
Hmm, tak jsem to tak nějak vyřešil. Hlavní problém byl při kopírování matic z assimpu do glm. Assimp používá row-major řazení, kdežto opengl a glm používá column-major řazení. No pořád to ještě musím trochu vyladit, ale už by to mělo jít.
To řazení matic má tedy být:
gl_Position = projection * view * model * boneCombined * boneOffset * vec4( position, 1.0f );
kde boneCombined se počítá rekurzivně pro kost takhle:
boneCombined = parent->boneCombined * this->translation * this->rotation * this->scaling; |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 3. září 2013, 10:56:01 Předmět: |
|
|
Já používám v OpenGL taky row-major Vzhledem k tomu, že si píšu shader sám (žádná fixní pipeline), tak je to celkem jedno pak. _________________ Perry.cz |
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 3. září 2013, 11:18:10 Předmět: |
|
|
perry napsal: |
Já používám v OpenGL taky row-major Vzhledem k tomu, že si píšu shader sám (žádná fixní pipeline), tak je to celkem jedno pak. |
No ale když to pak posíláš do shaderu pomocí glUniformMatrix4fv nebo něčeho podobného, tak by tě to mělo zajímat, ne? Teda v této oblasti nestojím příliš na pevné půdě, tak to spíš tak odhaduji. To leda že by jsi nepoužíval k obsluze shaderů glew. |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 3. září 2013, 11:21:34 Předmět: |
|
|
TeaTime napsal: |
perry napsal: |
Já používám v OpenGL taky row-major Vzhledem k tomu, že si píšu shader sám (žádná fixní pipeline), tak je to celkem jedno pak. |
No ale když to pak posíláš do shaderu pomocí glUniformMatrix4fv nebo něčeho podobného, tak by tě to mělo zajímat, ne? Teda v této oblasti nestojím příliš na pevné půdě, tak to spíš tak odhaduji. To leda že by jsi nepoužíval k obsluze shaderů glew. |
Tak od toho je v glUniformMatrix4fv ten parametr transpose, ne?  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 3. září 2013, 11:24:19 Předmět: |
|
|
VODA napsal: |
TeaTime napsal: |
perry napsal: |
Já používám v OpenGL taky row-major Vzhledem k tomu, že si píšu shader sám (žádná fixní pipeline), tak je to celkem jedno pak. |
No ale když to pak posíláš do shaderu pomocí glUniformMatrix4fv nebo něčeho podobného, tak by tě to mělo zajímat, ne? Teda v této oblasti nestojím příliš na pevné půdě, tak to spíš tak odhaduji. To leda že by jsi nepoužíval k obsluze shaderů glew. |
Tak od toho je v glUniformMatrix4fv ten parametr transpose, ne?  |
No jo, já si říkal, k čemu je tak hrozně užitečné transponovat matici při přesunu do gpu. Přišlo mně to jako hrozná blbost . Jak to do sebe všechno najednou hezky zapadá . |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 3. září 2013, 11:48:28 Předmět: |
|
|
Ten parametr transpose tam sice je, ale myslim, že v OpenGL ES nefunguje
Nicméně, ten parametr je stejně k ničemu. Pokud víš, jak je matice orientovaná, tak pak akorát změníš pořadí operací v shaderu a není problém. _________________ Perry.cz |
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 3. září 2013, 12:38:52 Předmět: |
|
|
perry napsal: |
Ten parametr transpose tam sice je, ale myslim, že v OpenGL ES nefunguje
Nicméně, ten parametr je stejně k ničemu. Pokud víš, jak je matice orientovaná, tak pak akorát změníš pořadí operací v shaderu a není problém. |
Pak dáš tutoriál na internet a bezelstný nováček jako já si to přečte a jde mu hlava kolem z toho, že některé návody násobí matice v přesně opačném pořadí než jiné návody . |
|
Návrat nahoru |
|
 |
|