[ Gruktar @ 11.01.2005. 09:00 ] @
Pravim OGL program za ucitavanje objekata iz Anim8ora, i skoro sam zavrsio ali ne znam kako da iskorisitm 'smoothangle' parametar. Zakljucio sam da treba nesto da uradi sa normalama da bi se dobio efekat zakrivljenosti poligona, samo ne znam sta. Mozeli neko da mi objasni ako zna ili da me uputi na neki link koji bi mi pomogao.
[ yooyo @ 12.01.2005. 18:35 ] @
Ako zelis 100% smoothovan model napisi rutinicu racuna sve normale svih trouglova, a zatim za svaki vertex trazi kojim trouglovima pripada, pokupi njihove normale i izracunaj prosecnu normalu. Dobijenu normalu normalizuj i to je sve.

Smoothangle bi mogao biti parametar pomocu kojeg se odredjuje da li ce ivica biti smoothovana ili ne u zavisnosti pod kojim uglom su dve ravni (2 trougla) koji sadrze doticnu ivicu. U tom slucaju izracunaj sve normale svih trouglova, a zatim normale svih ivica u zavisnosti od smoothangle-a. Ugao u ivici racunas kao dot product normala 2 trougla. Ako je rezultat dot producta veci od cos(smoothangle) onda je ivica smoothovana. Ako ivica nije smoothovana onda napravi njenu kopiju ali da se razlikuje samo normala. Takodje dupliraj i pripadajuce vertexe. Zatim prodju kroz sve vertexe i pokupi normale iz ivica kojima pripadaju i nadji prosecnu normalu koji ces zatim normalizovati.

Uff... nije tesko...

yooyo
[ Gruktar @ 13.01.2005. 11:47 ] @
Uspelo je, radi, jeste da ponegde izgleda malo dzombasto ali radi. Mada mi je cudno sto mu je potrebno oko 38 sekundi za ucitavanje objekta koji ima 5640 vertexa i 31192 poligona, a Anim8or ga ucita za 5 sekundi. Postoji li brzi nacin od ovog sto sam ja napisao, ili sam mozda nesto propustio ili pogresno uradio pa mi ide sporo.

Code:

void LoadNormals(mesh *Mesh)
{
    point normal, normalsum, tempnormal;    //point je struktura sa 3 floata x, y i z
    int pointscount, facescount, points, shared;
    
    for(facescount = 0; facescount < Mesh->numoffaces; facescount++) //ovo izracunava normale poligonima.
    {
        tempnormal = CalculateNormal(*Mesh, facescount);
        Mesh->faces[facescount].normal = Normalize(tempnormal);
    }
    
    for(pointscount = 0; pointscount < Mesh->numofpoints; pointscount++)  //ovoprolazi kroz sve vertexe
    {
        shared = 0;
        normalsum.x = 0;
        normalsum.y = 0;
        normalsum.z = 0;
        for(facescount = 0; facescount < Mesh->numoffaces; facescount++) //ovo prolazi kroz sve poligone
        {
            for(points = 0; points < Mesh->faces[facescount].numofpoints; points++) //i ovo prolazi kroz sve vertexe poligona
            {
                if(Mesh->faces[facescount].PointData[points].pointindex == pointscount)//a ovo testira da li poligon
                {                                                                      //sadrzi vertex
                    normalsum.x = Mesh->faces[facescount].normal.x;
                    normalsum.y = Mesh->faces[facescount].normal.y;
                    normalsum.z = Mesh->faces[facescount].normal.z;
                    shared++;
                }
            }
        }
        normalsum.x /= -shared;
        normalsum.y /= -shared;
        normalsum.z /= -shared;
        normal = Normalize(normalsum);
        Mesh->normals[pointscount] = normal;
    }
}
[ Reljam @ 13.01.2005. 21:52 ] @
Spoljasni for ti ne treba, on cini stvar suvise sporom jer ti konstantno pretrcavas preko istih tacaka i istih poligona. Probaj ovako nesto (pseudo kod), trebalo bi da bude dosta brze:

Code:

Alociraj niz vektora za svaki vertex (vNormalSum)
Alociraj niz intova za svaki vertex (vNormalCount)

Za svaki face u meshu
   Za svaki vertex u faceu
   {
       vNormalSum[vertex] += face.normal;
       vNormalCount[vertex]++;
   }

// I sada samo treba dodeliti vrednosti

Za svaki vertex u meshu
    vertex.normal = normalize( vNormalSum[vertex] / vNormalCount[vertex] );