.[ ČeskéHry.cz ].
Loading MS3D a kostrová animácia
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Magazín
Zobrazit předchozí téma :: Zobrazit následující téma  

Tento tutorial je?
Super
35%
 35%  [ 5 ]
Obstojný
42%
 42%  [ 6 ]
Nič moc
21%
 21%  [ 3 ]
Hrôza
0%
 0%  [ 0 ]
Celkem hlasů : 14

Autor Zpráva
nou



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

PříspěvekZaslal: 12. září 2007, 14:05:53    Předmět: Loading MS3D a kostrová animácia Odpovědět s citátem

Loading MS3D a kostrová animácia

Takže začnem štruktúrami do ktorých si model načítame. Nebudem to tu rozpisovať príliš podrobne keďže je na statický model dobrý návod aj na NeHe. Milkshape model je založený na jednotlivých vrcholoch modelu, potom sú jednotlivé trojuholníky.
kód:
typedef struct
{
    Bod     position;//poloha vrcholu
    char    boneId;//index kosti ku ktorej vrchol patri
}
ms3d_vertex;

typedef struct
{
    word    vertexIndices[3];//indexy vrcholov ktore patria trojuholníku
    Vector  normal[3];//normály na osvetlenie
    float   s[3];//textúrovacie koordináty
    float   t[3];
}
ms3d_triangle;

Bod a Vector sú mojimi vlastnými triedami na prácu s maticami vektormi a bodmi. http://nopaste.ceske-hry.cz/479

Skupina ma v sebe indexy na jednotlivé trojuholníky a taktiež číslo materiálu ktorý použijeme.
kód:
typedef struct
{
    word            numtriangles;
    word            *triangleIndices;
    char            materialIndex;
}
ms3d_group;


Materiál má v sebe jednotlivé zložky farieb materiálu ktoré sú rovnaké ako ako pri Phongovom osvetľovacom modeli ktorý poznáme z OpenGL alebo DirectX. Taktiež obsahuje súborovú cestu k textúre.

Zaujímavá časť prichádza teraz a to dáta jednotlivých kostí. Každá kosť ma svoje meno a meno rodiča. Teda meno kosti na ktorú je napojená. Rodič je v Milkshape vždy uložený skôr ako jeho potomok.
kód:

typedef struct
{
    char            name[32];//meno samotnej kosti
    char            parentName[32];//meno rodiča

Tu sú uvedené relatívna rotácia a posunutie voči rodičovi. Toto je základná poloha kosti. Poloha vrcholov modelu je uvedená v takzvanom world space teda svetovom priestore. My si pre účely animácie musíme tieto svetové súradnice previesť na relatívne voči kosti. Na to nám poslúžia tieto údaje.
kód:

    float           rotation[3];
    float           position[3];

    word            numKeyFramesRot;//počet snímkov rotácie
    word            numKeyFramesTrans;//pocet snímkov posunu

Tu sú uložené štruktúry ktorých počet je uvedený vyššie. V každej kosti by mal počet rotačných snímkou rovnaký ako posuvných. Medzi kosťami sa to ale líši. Každý snímok obsahuje čas ku ktorému sa vzťahuje a uhol rotácie kĺbu a jeho posun.
kód:

    ms3d_keyframe_rot *keyFramesRot;
    ms3d_keyframe_pos *keyFramesTrans;

Ďalej tu máme index kosti ktorý si budeme musieť zistiť ručne pretože v súbory to nie je uložene. A nakoniec tri matice. V relatívnej budeme mať relatívnu transformáciu voči rodičovi. Absolútna najprv poslúži na prevod súradníc vrcholov zo svetových na relatívne. Potom ju použijeme na rotáciu normál. A finálna matica bude už z animovaná.
kód:

    int parent;
    Matrix relative;
    Matrix absolute;
    Matrix final;
}
ms3d_joint;


Načítavanie
Celý zdrojový kód http://nopaste.ceske-hry.cz/480

Celá funkcia LoadData je okomentovaná a nelíši sa príliš od NeHe tutoriálu. Na jej konci sa ale volajú dve funkcie ktoré treba vysvetliť. A to Setup() a LoadTexture();

Začnem LoadTexture pretože je jednoduchšia. Tu si budete musieť spraviť úpravu a použiť vlastnú funkciu ktorá vráti GLuint s číslom textúry.
kód:
int MS3D::LoadTexture()
{
    TextureRes tex;
    for(int i=0;i<poc_material;i++)
    {//nahrame textury
        if((material+i)->texture[0]!='\0')//podmienka proti nacitavaniu nicoho
            (material+i)->textura=tex.LoadTex((material+i)->texture);
        if((material+i)->textura==NULL)return 0;
    }
    return 1;
}


Funkcia Setup() vystavá kostru a prevedie svetové súradnice vrcholov na relatívne voči kostiam. Ak máme napríklad rodičovskú kosť s základnou pozíciou 0.0 1.0 0.0 a rotáciou -0.523598 1.570796 0.0 (uhly su v MS3D uložene v radiánoch takže je to -30 a 90°) a potomka s pozíciou 0.0 0.0 5.0 a rotáciou 0.523598 0.0 0.0 vznikne nam niečo takéto.

Takže rodič sa najpr presunie o 1 hore po ose Y a potom sa otočí najprv o 90 stupňov doľava a nakoniec 30 stupňov hore. Rotujeme pomocou klasických glRotatef() ale v opačnom poradí Z Y X aj keď je uložené X Y Z.
Takže postup je taký že najprv získame relatívnu maticu voči rodičovi a ak kosť má rodiča tak matice vynásobíme aby získali absolútnu maticu ktorá určuje polohu kĺbu v priestore.
kód:

void MS3D::Setup()
{
    int i,o;
    Matrix mat;
    for(i=0;i<poc_joint;i++)
    {
        //vykoname tranformaciu podla zakladnych transformcii      mat.Translate((joint+i)->position[0],(joint+i)->position[1],(joint+i)->position[2]);
        mat.Rotate((joint+i)->rotation[0],(joint+i)->rotation[1],(joint+i)->rotation[2]);
        (joint+i)->relative=mat;//nakopirujem si relativnu maticu
        if((joint+i)->parent!=-1)//ak ma kost rodica tak vynasobime tranformaciu rodica potomkovou
            mat=mat*(joint+((joint+i)->parent))->absolute;
        (joint+i)->absolute=mat;//a vysledok ulozime
        mat.Identity();//vyjednotkujeme maticu
    }

Aby sme získali relatívnu polohu vrcholu voči kosti musíme maticu invertovať a s touto inverznou maticou vynásobiť bod. Inverzná matica má takí istý účinok ako keby sme vykonali všetky rotácie a posuny opačným poradím a opačnými hodnotami. OpenGL tiež násobí body keď vykresľujeme. Násobí bod MODELVIEW maticou. Inverznú maticu označujeme ako A^-1. Pre inverznú maticu platí A*A^-1=E alebo N teda jednotková matica.
kód:

    for(i=0;i<poc_joint;i++)
    {
        mat=(joint+i)->absolute;
        mat.Inverse();//invertujeme absolutnu maticku kosti
        for(o=0;o<poc_vertex;o++)
        {
            /*a nasledne tranformujeme vsetky body prisluchajuce danej kosti
            pomocou danej matice*/
            if((vertex+o)->boneId==i)
            {
                (vertex+o)->position=mat*(vertex+o)->position;
            }
        }
    }
}


Vykresľovanie
Pred samotným vykreslením musíme prepočítať animáciu a vyrátať finálne matice ktorými budeme transformovať vrcholy. To sa deje v Animate().
kód:

void MS3D::Animate(float time)
{
    //glPushMatrix();hups v nopaste som to zabudol odtranit je to tu zbytocne
    int nasobky = time/cas;
    time=time-cas*nasobky;
    Matrix transform;
    float tran[3],rot[3];

    for(int i=0;i<poc_joint;i++)//prechádzame jednotlive kosti
    {

Tu prebieha interpolácia medzi dvoma kľúčovými snímkami. Najprv odpočítame od snímky ktorá je za aktuálnym časom ktorý chceme vykresliť predchádzajúcu snímku. Potom vyrátame interpolačnú hodnotu od 0 do 1 podľa pomeru medzi snímkami. Ak je aktuálny čas akurát v polovici medzi časmi snímok tak aj interpolačná hodnota bude 0.5. Takže najpr nájdeme snímok ktorý má čas za aktuálnim časom animácie. Ten si označíme ako curr. Ak to nie je prvý snímok tak si označíme aj predošlý snímok ako prev. Potom hodnoty posunu a rotácie odčítame od seba a vynásobíme interpolačnou hodnotou aby sa model pekne plynulo pohyboval.
kód:

        int prev=0,curr=0;//najdeme aktualny snimok
        while(((joint+i)->keyFramesTrans+curr)->time < time && curr<(joint+i)->numKeyFramesTrans)curr++;
        prev=curr;
        if(curr>0)prev--;//odrátame 1 aby sme mali predoslú snimku
        float inter=(time-((joint+i)->keyFramesTrans+prev)->time);//zinterpolujeme medzi dvoma snimkami      if(curr!=prev)inter/=((joint+i)->keyFramesTrans+curr)->time-((joint+i)->keyFramesTrans+prev)->time;//aby sme nedelili 0
        tran[0]=((joint+i)->keyFramesTrans+curr)->position[0]-((joint+i)->keyFramesTrans+prev)->position[0];
        tran[1]=((joint+i)->keyFramesTrans+curr)->position[1]-((joint+i)->keyFramesTrans+prev)->position[1];
        tran[2]=((joint+i)->keyFramesTrans+curr)->position[2]-((joint+i)->keyFramesTrans+prev)->position[2];
Ak je curr rovné poslednej snímke tak je aktualny cas za casom podlednej snímky a teda sme na poslednej snímke a nemôžeme interpolovať. Teda interpolovanú hodnotu zahodíme a použijeme iba hodnotu posledného snímku animácie. Keďže sú snímky číslované od 0 tak je to prev-itý snímok.
kód:
         
if(curr==(joint+i)->numKeyFramesTrans)inter=0;//ak sem za poslednou snimkou
        tran[0]*=inter;  tran[1]*=inter;  tran[2]*=inter;//tak nulou vynulujeme

Príklad: prev snímok ma posun rovný 3 a curr 5. Aktuálny čas je 6 a časy snímkov sú 5 a 8. Takže interpolačná hodnota bude 1/3 pretože aktuálny čas je v jednej tretine medzi časmi prev a curr. Takže k posunu prev pripočítame tretinu rozdielu medzi tímito dvoma snímkami.
kód:

        tran[0]+=((joint+i)->keyFramesTrans+prev)->position[0];//a ostane len posledna snimka
        tran[1]+=((joint+i)->keyFramesTrans+prev)->position[1];
        tran[2]+=((joint+i)->keyFramesTrans+prev)->position[2];
        transform.Translate(tran[0],tran[1],tran[2]);//spravime translaciu podla aktualneho snimka
To isté spravíme aj s rotáciou.
kód:

        prev=curr=0;//najdeme teraz rotaciu
        while(((joint+i)->keyFramesRot+curr)->time < time && curr<(joint+i)->numKeyFramesRot)curr++;
        prev=curr;
        if(curr>0)prev--;
        inter=(time-((joint+i)->keyFramesRot+prev)->time);
        if(curr!=prev)inter/=((joint+i)->keyFramesRot+curr)->time-((joint+i)->keyFramesRot+prev)->time;
        rot[0]=((joint+i)->keyFramesRot+curr)->rotation[0]-((joint+i)->keyFramesRot+prev)->rotation[0];
        rot[1]=((joint+i)->keyFramesRot+curr)->rotation[1]-((joint+i)->keyFramesRot+prev)->rotation[1];
        rot[2]=((joint+i)->keyFramesRot+curr)->rotation[2]-((joint+i)->keyFramesRot+prev)->rotation[2];
        if(curr==(joint+i)->numKeyFramesRot)inter=0;//ak sem za poslednou snimkou
        rot[0]*=inter;   rot[1]*=inter;   rot[2]*=inter;//tak nulou vynulujeme
        rot[0]+=((joint+i)->keyFramesRot+prev)->rotation[0];//a ostane len posledna snimka
        rot[1]+=((joint+i)->keyFramesRot+prev)->rotation[1];
        rot[2]+=((joint+i)->keyFramesRot+prev)->rotation[2];
        transform.Rotate(rot[0],rot[1],rot[2]);//orotujeme
Normály musíme otáčať iba zmenou oproti základnej kostre. Potom vynásobíme relatívnu maticu zmenou ktorú sme vyrátali. A nakoniec ak má kosť rodiča násobíme to aj rodičovskou maticou aby sme dostali konečnú animovanú maticu. A POZOR oproti nopaste som tu opravil jednu chybu. Normály treba taktiež násobiť rodičovskou maticou.
kód:

        (joint+i)->absolute=transform;//ulozime si posunutie oproti zakladu kvoli normalam
        transform=transform*(joint+i)->relative;//posuniem relativnu maticu o animaciu
        if((joint+i)->parent!=-1)//ak ma rodica tak nasobime finalnou maticou rodica
        {
            transform=transform*(joint+((joint+i)->parent))->final;
            (joint+i)->absolute=(joint+i)->absolute*(joint+((joint+i)->parent))->absolute;
        }
        (joint+i)->final=transform;//ulozime si zanimovanu maticu
        transform.Identity();//zjednickujeme si maticu pre dalsie pouzitie
    }
}


Tak konečne sa dostávame k samotnému vykresleniu. Na začiatku sa zavolá Animate() ktoré pripraví matice. Potom začneme podľa skupín vykreslovať. Najprv nastavíme materiál a textúru.
kód:

void MS3D::Draw(float time)
{
    Animate(time);
    int i,o;
    Matrix rela;
    for(i=0;i<poc_group;i++)//zacneme kreslit
   {
       glEnable(GL_LIGHTING);
      int material_cis = (group+i)->materialIndex;
      if((group+i)->materialIndex!=-1)//ak je nastaveny materialovy index tak nastavime material
      {
         glMaterialfv( GL_FRONT, GL_AMBIENT, (material+material_cis)->ambient);          // Nastav ambient material
         glMaterialfv( GL_FRONT, GL_DIFFUSE, (material+material_cis)->diffuse);          // Nastav diffuse material
         glMaterialfv( GL_FRONT, GL_SPECULAR, (material+material_cis)->specular);        // Nastav specular material
         glMaterialfv( GL_FRONT, GL_EMISSION, (material+material_cis)->emissive);        // Nastav emission material
         glMaterialf( GL_FRONT, GL_SHININESS, (material+material_cis)->shininess);      // Nastav shininess material
      }
      else//inak nastavim standartne farby
      {
         float a[4]={0.1f,0.1f,0.1f,1};
         float d[4]={1,1,1,1};
         float g[4]={0,0,0,0};
         glMaterialfv( GL_FRONT, GL_AMBIENT, a);          // Nastav ambient material
         glMaterialfv( GL_FRONT, GL_DIFFUSE, d);          // Nastav diffuse material
         glMaterialfv( GL_FRONT, GL_SPECULAR, g);        // Nastav specular material
         glMaterialfv( GL_FRONT, GL_EMISSION, g);        // Nastav emission material
         glMaterialf( GL_FRONT, GL_SHININESS, 64);
      }
      if((material+material_cis)->textura!=0)//ak existuje textura zvol ju
      {
         glEnable(GL_TEXTURE_2D);//povolime texturovanie
         glBindTexture(GL_TEXTURE_2D,(material+material_cis)->textura);// Zvolí texturu
      }
      else   glDisable(GL_TEXTURE_2D);//ak nie je textura nebude texturovanie

              glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

      int w,p[3],bone[3];
      for(o=0;o<(group+i)->numtriangles;o++)
      {
         w = (group+i)->triangleIndices[o];  //priradime index trojholnika do w a ten nasledne vykreslime

         p[0] = (triangle+w)->vertexIndices[0];//nastavime si indexy vrcholov
         p[1] = (triangle+w)->vertexIndices[1];
         p[2] = (triangle+w)->vertexIndices[2];
         bone[0] = (vertex+p[0])->boneId;//a indexy kosti
         bone[1] = (vertex+p[1])->boneId;
         bone[2] = (vertex+p[2])->boneId;

Tu transformujeme podľa animačných matíc jednotlivé vrcholy. Takže dostaneme z relatívnej polohy ktorú sme získali v Setup() znova pozíciu v world space. Taktiež normály pretransformujeme. No a nakoniec už len obligátne glBegin() glEnd();
kód:

            Bod v1,v2,v3;//transformujeme body podla animacnej kosti
            v1=(joint+bone[0])->final*(vertex+p[0])->position;
            v2=(joint+bone[1])->final*(vertex+p[1])->position;
            v3=(joint+bone[2])->final*(vertex+p[2])->position;
            Vector n1,n2,n3;//pretranformujeme normaly na osvetlenie
            n1=(joint+bone[0])->absolute**((triangle+w)->normal+0);
            n2=(joint+bone[1])->absolute**((triangle+w)->normal+1);
            n3=(joint+bone[2])->absolute**((triangle+w)->normal+2);

         glBegin(GL_TRIANGLES);
         glNormal3f(n1[0],n1[1],n1[2]);// Normála
         glTexCoord2f((triangle+w)->s[0], (triangle+w)->t[0]);
         glVertex3f(v1[0],v1[1],v1[2]);
         glNormal3f(n2[0],n2[1],n2[2]);// Normála
         glTexCoord2f((triangle+w)->s[1], (triangle+w)->t[1]);
         glVertex3f(v2[0],v2[1],v2[2]);
         glNormal3f(n3[0],n3[1],n3[2]);// Normála
         glTexCoord2f((triangle+w)->s[2], (triangle+w)->t[2]);
         glVertex3f(v3[0],v3[1],v3[2]);
         glEnd();
      }
   }
}

Takže to je všetko ak by niečo nebolo jasné opýtajte sa na fóre.
Napísal Nou
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.


Naposledy upravil nou dne 12. září 2007, 22:36:03, celkově upraveno 6 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Yossarian



Založen: 28. 07. 2007
Příspěvky: 274
Bydliště: Šalingrad

PříspěvekZaslal: 12. září 2007, 14:40:00    Předmět: Odpovědět s citátem

-> wiki?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 12. září 2007, 15:32:25    Předmět: Odpovědět s citátem

Ze sa nejedna o prepis RSN Skeletal anim. tutorialu z gamedev.net? Twisted Evil
_________________
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
nou



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

PříspěvekZaslal: 12. září 2007, 15:56:04    Předmět: Odpovědět s citátem

ak to porovnas tak je to nieco uplne ine. a odznovu napisane. jedine som sa nechal inspirovat rozlozenim funkcii SetupJoint > Joint a Animate

EDIT: SAKRA PRECO NEJDE TEN OBRAZOK
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
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: 12. září 2007, 21:44:08    Předmět: Odpovědět s citátem

nou napsal:
EDIT: SAKRA PRECO NEJDE TEN OBRAZOK

Asi kvuli lomitku na konci cesty. Jinak celkem zajimavej clanek (ne pro me, ale urcite se tu najdou lidi, kterym se to bude hodit), akorat by to chtelo vic okecavani a mene kodu. Wink
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 12. září 2007, 22:04:00    Předmět: Odpovědět s citátem

Nechci hlasovat nahoře, páč jsem to nečetl, páč to v nejbližší době nepoužiju, ale rozhodně jsem rád, že jsi něco takového napsal. A mohl bys to hodit do wiki.
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 12. září 2007, 22:16:22    Předmět: Odpovědět s citátem

Ja mu na irc navrhoval, at to da radeji do magazinu, kdyz mu da rezna prava.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
tom.drin



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

PříspěvekZaslal: 13. září 2007, 10:05:16    Předmět: Odpovědět s citátem

Díky za tutoriál, určitě se jednou bude hodit.

btw: Nejnovější Milkshape podporuje váhový systém až pro čtyři kosti (alespoň co jsem tak koukal - možná i víc).
Moc tomu nerozumím, myslíš že by bylo o hodně složitější ho implementovat?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



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

PříspěvekZaslal: 13. září 2007, 11:56:12    Předmět: Odpovědět s citátem

No vahovy system. Najprv by bolo potrebne pretransformovat vertex pre kazdu kost samostatne ako doteraz. Tym by sme ziskali 4 polohy vertexu. no a medzi timito polohami by bolo potrebne interpolovat podla jednotlivich vah. Vaha vyjadruje to ako velmi dana kost ovplivni dany vertex. ak su definovane dve vaky po 0.5 tak by vysledny vertex lezal v strede medzi vertexom plne v kontrole prvej kosti a druhym. myslim ze najpr medzi prvimi dvoma potom ich vahy spocitat a interpolovat zase medzi tymto vypocitanim a tretim a nakoniec stvrtim. ak by boli vaky po 0.25 kedze ich sucet je 1 tak by vysledny vertex lezal na priescniku uhlopriecok kosotvorca tvoreneho timi 4 polohami vertexu. samozrejme museli by vsetky 4 lezat v rovine. az take tazke by to nebolo. ale bolo by okolo toho dost pociatnia co by mohlo spomalit aj o polovicu.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kerekes



Založen: 29. 07. 2007
Příspěvky: 57

PříspěvekZaslal: 13. září 2007, 12:36:08    Předmět: Odpovědět s citátem

Zdravim, vahovanie by slo nejak takto:
kód:
 
Bod v1,v2,v3;//transformujeme body podla animacnej kosti
Vaha w1, w2,w3; //4- zlozkove float vektory - vahy vertexov
BoneIndex b1,b2,b3; //4 - zlozkove byte vektory - indexy kosti vertexov


for(int i=0; i<4; i++)
{
    if(w1[i]>0.0001f)
    {
       v1+=((joint+b1[i])->final*(vertex+p[0])->position)*w1[i];
    }
     if(w2[i]>0.0001f)
    {
       v2+=((joint+b2[i])->final*(vertex+p[1])->position)*w2[i];
    }
    if(w3[i]]>0.0001f)
   {
       v3+=((joint+b3[i])->final*(vertex+p[2])->position)*w3[i];
   }
}


Samozrejme je potrebne tie vahy nejak dostat z toho formatu a niekam si ich ulozit. Tym porovnanim if(wi[i]>0.0001f) sa zabezpeci ze sa zbytocne nenasobi co sa nemusi.

No a k optimalizacii, okrem toho ze by bolo vhodne inak to zapisat (neadresovat pole tym istym indexom viackrat ale iba raz do nejakeho temp smernika - tu dost pomaha pokus-omyl s testovanim rychlosti Smile ) by bolo vhodne vyuzit indexaciu trojuholnikov mesha, a kazdy vertex transformovat iba raz... tj vytvorit si pomocny buffer, vsetko stransformovat a face indexy pouzivat len pri vykresleni. Tym by bolo mozne zakomponovat tam aj vertexbuffre.
Tj dynamicky vertexbuffer na transformovane vertexy, a v systemovej pameti si drzat zakladne pozicie vertexov/normal/tangentov.

Dalsia optimalizacia by mohla byt v casovani skinovania jednotlivych vertex atributov. Imho nieje potrebne transformovat normaly (tagenty....) kazdy frame, staci tak 10x do sekundy a nik si to nevsimne.

No a pri pouziti vertexbuffrov je to uz len nakrok od HW skinovania Smile, ale osobne preferujem SW z dovodu casovacich optimalizacii a toho ze naskinovany model je pristupny z aplikacie, napriklad pre zistenie priesecniku s lucom, spocitania boundingboxu/sphery a pod.

Je to pekne ze sa tu objavil takyto tutorial.... myslim ze sa mnohym zide.

EDIT: uprava zmetku v kode Embarassed
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ascen



Založen: 01. 04. 2010
Příspěvky: 6

PříspěvekZaslal: 19. květen 2010, 14:25:35    Předmět: Odpovědět s citátem

Dobrý den,
promiňte že oživuji staré téma, ale nemohli byste sem přihodit matrix.h?
mám zřejmě špatnou verzi ms-2010 a na internetu je těch matrix.h hodně-nevím který je ten správný.


Předem děkuji ...Ascen Shocked
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



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

PříspěvekZaslal: 19. květen 2010, 15:21:32    Předmět: Odpovědět s citátem

treba pouzit tu co je na zaciatku pod prvy code.
http://nopaste.ceske-hry.cz/479
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ascen



Založen: 01. 04. 2010
Příspěvky: 6

PříspěvekZaslal: 20. květen 2010, 15:57:10    Předmět: Odpovědět s citátem

Promiňte že vás pořád otravuju, ale píše mi to pár chyb...... Ascen
kód:
1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>  MS3D.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\matrix.h(33): warning C4244: 'return' : conversion from 'double' to 'float', possible loss of data
1>c:\users\ascen\documents\visual studio 2010\projects\test\test\ms3d.cpp(11): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(234) : see declaration of 'fopen'
1>c:\users\ascen\documents\visual studio 2010\projects\test\test\ms3d.cpp(17): warning C4996: 'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(253) : see declaration of 'fscanf'
1>c:\users\ascen\documents\visual studio 2010\projects\test\test\ms3d.cpp(151): error C2065: 'TextureRes' : undeclared identifier
1>c:\users\ascen\documents\visual studio 2010\projects\test\test\ms3d.cpp(151): error C2146: syntax error : missing ';' before identifier 'tex'
1>c:\users\ascen\documents\visual studio 2010\projects\test\test\ms3d.cpp(151): error C2065: 'tex' : undeclared identifier
1>c:\users\ascen\documents\visual studio 2010\projects\test\test\ms3d.cpp(155): error C2065: 'tex' : undeclared identifier
1>c:\users\ascen\documents\visual studio 2010\projects\test\test\ms3d.cpp(155): error C2228: left of '.LoadTex' must have class/struct/union
1>          type is ''unknown-type''
1>c:\users\ascen\documents\visual studio 2010\projects\test\test\ms3d.cpp(195): warning C4244: 'initializing' : conversion from 'float' to 'int', possible loss of data
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 23. květen 2010, 07:33:27    Předmět: Odpovědět s citátem

Zdar, zakomentuj linku kde se vola tato funkce
kód:
int MS3D::LoadTexture()
nebo zakomentuj obsah te funkce. Prijdes ale o texturovani.
Jatro
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ascen



Založen: 01. 04. 2010
Příspěvky: 6

PříspěvekZaslal: 23. květen 2010, 08:23:03    Předmět: Odpovědět s citátem

Ahoj, nevím přesně jak to myslíš, ale už jsem se hnul trochu od těch chyb k linkeru
kód:
1>------ Build started: Project: test1, Configuration: Debug Win32 ------
1>  MS3DFile.cpp
1>c:\users\ascen\desktop\ms3dfile.cpp(42): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(234) : see declaration of 'fopen'
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
1>C:\Users\Ascen\documents\visual studio 2010\Projects\test1\Debug\test1.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ascen
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Magazín Č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