.[ ČeskéHry.cz ].
Načtení .3ds v OpenGL
Jdi na stránku 1, 2  Další
 
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
kECUB



Založen: 14. 09. 2007
Příspěvky: 16

PříspěvekZaslal: 5. únor 2008, 19:32:22    Předmět: Načtení .3ds v OpenGL Odpovědět s citátem

Potřebuju načíst .3ds model, tak jsem si na to stáhl kód z http://nehe.ceske-hry.cz/cl_gl_3ds.php. Bohužel se naskytla menší komplikace. Nevím jestli to je načítáním modelu, nebo je problém jinde, ale jakmile zapnu osvětlení začne se zobrazovat vcelku podivně.

Takhle to vypadá s vypnutým depth-bufferem se zaplým je to skoro stejný jen někdy o trochu horší.

Nemáte dyštak někdo nějaký fungující script na načítání modelů? Nebo radu proč to dělá? Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
(CZ)genius



Založen: 28. 07. 2007
Příspěvky: 85
Bydliště: Neratovice

PříspěvekZaslal: 5. únor 2008, 20:15:58    Předmět: Odpovědět s citátem

no jestli to dela jenom u modelu nactenych z 3ds, tak bych se zameril na normaly.. nic jinyho by s tim takovyhle veci delat nemelo..
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: 6. únor 2008, 04:42:04    Předmět: Odpovědět s citátem

Seš si jistej, že se v tom loaderu počítají normály správně? Jestli jo, jsou trojuhelníky správně otočený? (není jedno, zda se trojúhelník renderuje ze předu nebo zezadu) Máš správně nastavený zbuffer?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kECUB



Založen: 14. 09. 2007
Příspěvky: 16

PříspěvekZaslal: 6. únor 2008, 18:35:09    Předmět: Odpovědět s citátem

To si právě vůbec nejsem jistej jestli to ten loader počítá správněSad Proto se ptám jestli dyštak nemáte někdo nějakej ověřenej? Se zapnutým zbufferem vypadá výsledek spíš ještě o něco hůř ale jinak v podstatě stejně, nevim jak bych ho mohl jinak líp nastavit?
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: 6. únor 2008, 18:52:50    Předmět: Odpovědět s citátem

No třeba tak, že ho nastavíš správně, tzn:
glDepthMask(1);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
a v pixel formátu nastavit 24bit zbuffer a každej snímek ho mazat.

Nicméně pokud nerozumíš tomu loaderu a jenom jsi ho zkopíroval, tak to asi těžko radit, kde jinde můžeš mít chybu, páč ten loader se mi zkoumat moc nechce. Počítání normál ani není věc loadování, to je spíš taková funkce navíc. Když jsem ten loader dřív používal (v c++ pochopitelně), nebyl ten výpočet normál na 100% funkční, spíš tak na 99%.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kECUB



Založen: 14. 09. 2007
Příspěvky: 16

PříspěvekZaslal: 6. únor 2008, 19:50:32    Předmět: Odpovědět s citátem

A o nějakym 100% funkčním loaderu nevíš? Smile Taky se mě v něm nechce šťourat navíc normály jsou lehce nad rámec mých matematických znalostí. Proto bych raději něco už hotovýho. A na netu jsem bohužel nic jiného než tohle nenašel Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
johnnash



Založen: 30. 07. 2007
Příspěvky: 80

PříspěvekZaslal: 6. únor 2008, 21:36:49    Předmět: Odpovědět s citátem

Pokud jsou normaly nad ramec tvych tvych znalosti tak je asi zbytecne zatim se 3D zatim zabyvat...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 6. únor 2008, 23:45:05    Předmět: Odpovědět s citátem

ako vyratat normalu. su tri body A B C. odcitas A-B a C-B dostanes dva vektory u a v. s tymi spravis vektorovy sucin a dostanes normalovy vektor. ak je toto nad ramec tak odporucam nastudovat analiticku geometriu a linearnu algebru.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kECUB



Založen: 14. 09. 2007
Příspěvky: 16

PříspěvekZaslal: 3. březen 2008, 20:20:03    Předmět: Odpovědět s citátem

Byl jsem chvíli mimo ale z5 k problému:) Zkusil jsem na to jít jinak a to přes knihovnu Lib3ds. Načetl jsem model pomocí tutoru: http://www.donkerdump.nl/NewsMessage.php?id=113. Kód je prakticky stejný až na to že já nepoužívám QT4 ale SDL. Ovšem tížený výsledek se opět nedostavil:( Řekl bych že problém je opět s normálami a to takový že jsou přesně na opačnou stranu. Světlo odráží vnitřní strany plygonů. Zkusil jsem vykreslovat pouze opačné face ale to nepomohlo. Normály se ovšem počítají pomocí f-ce lib3ds_mesh_calculate_normals() která je součástí knihovny a předpokládám že by tedy měla být v pořádku. Nevíte čím by to mohlo být? Nemůže to mít na svědomí SDL? Smile
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: 3. březen 2008, 21:37:33    Předmět: Odpovědět s citátem

A to je takovej problém udělat ty normály záporné?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kECUB



Založen: 14. 09. 2007
Příspěvky: 16

PříspěvekZaslal: 7. březen 2008, 20:51:46    Předmět: Odpovědět s citátem

Mno jak už jsem řikal o normálách toho moc nevím tak jsem si nebyl jistej jestli dát jim zápornou hodnotu bude opravdu fungovat. Ono to totiž nepomohlo ale zjistil jsem že v normálách problém není ono se sice trochu změní stínování polygonů ale pořád nevidím vnější facy modelu. Zkusil jsem i výpočet normál zrušit uplně a výsledek byl pořád obdobný. Našel jsem podobný problém (Alespoň myslím. Bohužel už je to docela starší diskuse takže obrázky tam už nejsou.) http://www.gamedev.net/community/forums/topic.asp?topic_id=305328&whichpage=1&. Nevím jestli tomu tak opravdu je ale příspěvek třetí odspoda se sdá že by mohl přijít na řešení problému bohužel jsem ho ale moc nepochopil Sad Dost tam mluví o tom že by to mohlo být ovladači k grafice ale to si nemyslím..
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1536
Bydliště: u Prahy

PříspěvekZaslal: 7. březen 2008, 22:02:04    Předmět: Odpovědět s citátem

Jestli se ti misto prednich polygonu vykresluji jen zadni, tak prohod nastaveni, ktere polygony jsou ty predni (v OpenGL je to funkce glFrontFace).
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kECUB



Založen: 14. 09. 2007
Příspěvky: 16

PříspěvekZaslal: 10. březen 2008, 12:43:35    Předmět: Odpovědět s citátem

Nepomohlo je to furt stejně blbý.. Asi to budu muset celý přepsat. Nemáte někdo fungující kód na načtení s lib3ds že bych to třeba porovnal kde je chyba? Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
kECUB



Založen: 14. 09. 2007
Příspěvky: 16

PříspěvekZaslal: 10. březen 2008, 20:58:45    Předmět: Odpovědět s citátem

Tak jsem se to pokusil udělat co nejjednodužší ale jakmile k tomu hodím normáli začne problém do tý doby to vypadá v poho a s wireframe se taky zdá vše ok:


Tak se zdá že problém je v podtatě totožný Sad
f-ce draw:
kód:

void Draw()
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glLoadIdentity();

   Lib3dsMesh* mesh = model->meshes; //current mesh in model file

   glTranslatef(0,0,zoom);
   glRotatef(rx,1.0f,0.0f,0.0f);
   glRotatef(ry,0.0f,1.0f,0.0f);
   
   glBegin(GL_TRIANGLES);
   while(mesh) {
      Lib3dsVector* normals = new Lib3dsVector[3 * mesh->faces];
      lib3ds_mesh_calculate_normals(mesh, normals);
      for(unsigned long i = 0; i < mesh->faces; i++) {

      
         glNormal3fv(normals[3 * i]);
         glVertex3fv(mesh->pointL[mesh->faceL[i].points[0]].pos);
         glNormal3fv(normals[3 * i + 1]);
         glVertex3fv(mesh->pointL[mesh->faceL[i].points[1]].pos);
         glNormal3fv(normals[3 * i + 2]);
         glVertex3fv(mesh->pointL[mesh->faceL[i].points[2]].pos);
         
      }
      
      if(mesh->next) mesh = mesh->next;
      else mesh = NULL;
   }
   glEnd();

   glFlush();
   SDL_GL_SwapBuffers();
}


A nastavení OpenGL:

kód:

bool InitGL()
{
   glClearColor(0.5, 0.0, 0.0, 0.0);
   glEnable(GL_LIGHT0);// Zapne světlo
   glEnable(GL_LIGHTING);

            model = lib3ds_file_load("monkey.3ds");

   return true;
}


Naposledy upravil kECUB dne 10. březen 2008, 21:06:48, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



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

PříspěvekZaslal: 10. březen 2008, 21:06:19    Předmět: Odpovědět s citátem

Nemáš zapnutý depth test.
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 -> 3D API / 3D Enginy Č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