.[ ČeskéHry.cz ].
Skinning pomocí knihovny assimp

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
tomkis



Založen: 06. 06. 2011
Příspěvky: 33

PříspěvekZaslal: 27. červenec 2012, 09:37:39    Předmět: Skinning pomocí knihovny assimp Odpovědět s citátem

Zdravím,

snažím se implementovat skinning pomocí knihovny assimp (konkrétně .NET wrapper) v XNA. A po dlouhych hodinách jsem se dostal do stavu kdy to "skoro funguje" bohužel je mesh strašně podivně deformovaný.

Napadá někoho kde může být problém? Jesli spíše na straně updatovani transfomarcnich matic nebo spise samotne skinningu ?

Přikládám náhled.

http://imageshack.us/photo/my-images/688/nahledu.png/

Zajímavé je že ta postava má správné některé obrysy např chodidla... ale zbytek je divně zdeformovaný.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 27. červenec 2012, 12:17:21    Předmět: Odpovědět s citátem

Před pár měsíci jsem řešil. Hoď sem obrázek, kde máš nodes, abych věděl, jestli postupuješ špatně už v nodech nebo až ve skinningu.

Jinak osobně řeším skinning tak, že k bone si najdu odpovídající node a ten násobím offsetovou maticí. Tohle dám do vertex shaderu a tam už jenom násobím vertex touto maticí (samozřejmě vybranou dle ID kosti) před jeho vynásobením modelview a projection.
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
tomkis



Založen: 06. 06. 2011
Příspěvky: 33

PříspěvekZaslal: 27. červenec 2012, 12:34:12    Předmět: Odpovědět s citátem

Můj postup:

1) vytáhnu si do vertexu informace o skinningu (řekl bych že tady chyba nebude... vypadá to že model má jednotnou kůži pouze se uplně nesmyslně hýbou kosti)


poté se každý snímek snažím updatovat pole matic které posílám do shaderu (pro jednoduchost neinterpoluju)

kód:

computeBoneMatrices(Node node, Matrix parentMatrix) {
            NodeAnimationChannel channel = findChannelForBone(node.Name); //Najdu si kanal
            Bone bone = findBoneByName(node.Name);


            //ziskam matice pro posun rotaci a scaling
            VectorKey position = channel.PositionKeys[animationPtr];
            QuaternionKey rotation = channel.RotationKeys[animationPtr];
            VectorKey scaling  = channel.ScalingKeys[animationPtr];

            Matrix4x4 translationMat = Matrix4x4.FromTranslation(position.Value);
            Matrix4x4 rotationMat = new Matrix4x4(rotation.Value.GetMatrix());
            Matrix4x4 scalingMat = Matrix4x4.FromScaling(scaling.Value);


            //zkombinuji tyto matice
            Matrix4x4 nodeTransform = translationMat * rotationMat * scalingMat;
           
            //prenasobim parent matici
            Matrix4x4 globalTrafo = parentMatrix * nodeTransform;


            // fRootNodeTransformInverse je transformacni matice root nody ale inverzni
            //
            fBoneMatrices[] = fRootNodeTransformInverse  * globalTrafo * bone.OffsetMatrix;


           //Zavolam rekurzivne pro vsechny deti a predam si global trafo
           foreach(Node child in node.Children) {
               computeBoneMatrices(child, globalTrafo);
           }
}


pote co updatnu tak si fBoneMatrices poslu do shaderu a prenasobim.[/code]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
tomkis



Založen: 06. 06. 2011
Příspěvky: 33

PříspěvekZaslal: 27. červenec 2012, 12:44:45    Předmět: Odpovědět s citátem

ono by mi možna i dost pomohlo kdybych věděl přesny postup jak dostat Transformační matice které nacpat do shaderu... protože tyto údaje se úplně u všech zdrojů z assimpu maximálně rozcházejí.

Podle toho co jsem pochopil přímo z ofic stránek by mělou pouze stačit Rekurzivně přenásobit všechny matice v konkrétním stromu což je ale blbost protože všude jinde se počítá ještě s těmi maticemi z kostí a nějak se do toho kombinují i matice z nodes a popravdě... mám v tom totální guláš.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 27. červenec 2012, 12:51:40    Předmět: Odpovědět s citátem

Hmm... zkus nejdřív do nodeTransform dát jenom implicitní transformaci node (aiNode::mTransformation), pak by měl model být v pohodě (i když bez animace). Jinak se mi to zdá v pohodě.

S keys jsem se rval dost dlouho a pak jsem to pořešil inverzní maticí k jejich hodnotě (vůbec nechápu, proč to funguje, ale funguje to). (Na druhou stranu to může být i různými převodními čachry, které tam teď mám, takže tuhle informaci neber jako ověřenou.)

EDIT: Bez animací to funguje asi takhle: rekurzivně spočteš finální matice nodů, bone má ještě offsetovou matici, takže vynásobíš i tou a máš to.
V případě animací se to liší jenom tak, že v rekurzivním počítání finálních matic nodů nenásobíš matici rodiče s implicitní maticí potomka, ale s maticí animace (viz i druhý odstavec příspěvku). Tolik z mého pozorování.
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.


Naposledy upravil if.then dne 27. červenec 2012, 12:58:45, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
tomkis



Založen: 06. 06. 2011
Příspěvky: 33

PříspěvekZaslal: 27. červenec 2012, 12:58:36    Předmět: Odpovědět s citátem

if.then napsal:
Hmm... zkus nejdřív do nodeTransform dát jenom implicitní transformaci node (aiNode::mTransformation), pak by měl model být v pohodě (i když bez animace). Jinak se mi to zdá v pohodě.

S keys jsem se rval dost dlouho a pak jsem to pořešil inverzní maticí k jejich hodnotě (vůbec nechápu, proč to funguje, ale funguje to).
Zválštní kdyz do matice nastavim pouye node::mTransformation kterou samozrejme prenasobim parentem tak je to taky rozbite
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 27. červenec 2012, 13:01:34    Předmět: Odpovědět s citátem

Zajímavé... Zkus opravdu vizualizovat polohy nodes a bones, jestli jsou správně nebo rozbité, opravdu to pomůže.
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
tomkis



Založen: 06. 06. 2011
Příspěvky: 33

PříspěvekZaslal: 27. červenec 2012, 13:04:46    Předmět: Odpovědět s citátem

if.then napsal:
Zajímavé... Zkus opravdu vizualizovat polohy nodes a bones, jestli jsou správně nebo rozbité, opravdu to pomůže.
Už to fungujeee Laughing moc jsi mi pomohl tím jak jsi řekl ať tam hodím pouze node trafo... začal jsem různě měnit pořadí multiplikace matic a dostal jsem se do fáze kdy se mi povedlo zobrazit správný model... poté stačilo přijít ještě na správné řešení u animace....


Takže finální postup:

NodeTrafo = rotationMatrix * translationMatrix * scalingMatrix;
GlobalTrafo = NodeTrafo * ParentTrafo;

FinalTrafo = BoneOffsetMatrix * GlobalTrafo


Rekurzivne volat s GlobalTrafo.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 27. červenec 2012, 13:52:46    Předmět: Odpovědět s citátem

Super, jsem rád, že jsem pomohl. Smile
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
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 -> 3D API / 3D Enginy Č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