Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
tomkis
Založen: 06. 06. 2011 Příspěvky: 33
|
Zaslal: 27. červenec 2012, 09:37:39 Předmět: Skinning pomocí knihovny assimp |
|
|
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 |
|
|
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 27. červenec 2012, 12:17:21 Předmět: |
|
|
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 |
|
|
tomkis
Založen: 06. 06. 2011 Příspěvky: 33
|
Zaslal: 27. červenec 2012, 12:34:12 Předmět: |
|
|
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 |
|
|
tomkis
Založen: 06. 06. 2011 Příspěvky: 33
|
Zaslal: 27. červenec 2012, 12:44:45 Předmět: |
|
|
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 |
|
|
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 27. červenec 2012, 12:51:40 Předmět: |
|
|
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 |
|
|
tomkis
Založen: 06. 06. 2011 Příspěvky: 33
|
Zaslal: 27. červenec 2012, 12:58:36 Předmět: |
|
|
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 |
|
|
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 27. červenec 2012, 13:01:34 Předmět: |
|
|
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 |
|
|
tomkis
Založen: 06. 06. 2011 Příspěvky: 33
|
Zaslal: 27. červenec 2012, 13:04:46 Předmět: |
|
|
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 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 |
|
|
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 27. červenec 2012, 13:52:46 Předmět: |
|
|
Super, jsem rád, že jsem pomohl. _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
|
|