Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
kECUB
Založen: 14. 09. 2007 Příspěvky: 16
|
Zaslal: 5. únor 2008, 19:32:22 Předmět: Načtení .3ds v OpenGL |
|
|
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á? |
|
Návrat nahoru |
|
|
(CZ)genius
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: Neratovice
|
Zaslal: 5. únor 2008, 20:15:58 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 6. únor 2008, 04:42:04 Předmět: |
|
|
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 |
|
|
kECUB
Založen: 14. 09. 2007 Příspěvky: 16
|
Zaslal: 6. únor 2008, 18:35:09 Předmět: |
|
|
To si právě vůbec nejsem jistej jestli to ten loader počítá správně 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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 6. únor 2008, 18:52:50 Předmět: |
|
|
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 |
|
|
kECUB
Založen: 14. 09. 2007 Příspěvky: 16
|
Zaslal: 6. únor 2008, 19:50:32 Předmět: |
|
|
A o nějakym 100% funkčním loaderu nevíš? 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 |
|
Návrat nahoru |
|
|
johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 6. únor 2008, 21:36:49 Předmět: |
|
|
Pokud jsou normaly nad ramec tvych tvych znalosti tak je asi zbytecne zatim se 3D zatim zabyvat... |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 6. únor 2008, 23:45:05 Předmět: |
|
|
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 |
|
|
kECUB
Založen: 14. 09. 2007 Příspěvky: 16
|
Zaslal: 3. březen 2008, 20:20:03 Předmět: |
|
|
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? |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 3. březen 2008, 21:37:33 Předmět: |
|
|
A to je takovej problém udělat ty normály záporné? _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
kECUB
Založen: 14. 09. 2007 Příspěvky: 16
|
Zaslal: 7. březen 2008, 20:51:46 Předmět: |
|
|
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 Dost tam mluví o tom že by to mohlo být ovladači k grafice ale to si nemyslím.. |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 7. březen 2008, 22:02:04 Předmět: |
|
|
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 |
|
|
kECUB
Založen: 14. 09. 2007 Příspěvky: 16
|
Zaslal: 10. březen 2008, 12:43:35 Předmět: |
|
|
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? |
|
Návrat nahoru |
|
|
kECUB
Založen: 14. 09. 2007 Příspěvky: 16
|
Zaslal: 10. březen 2008, 20:58:45 Předmět: |
|
|
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ý
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 |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 10. březen 2008, 21:06:19 Předmět: |
|
|
Nemáš zapnutý depth test. |
|
Návrat nahoru |
|
|
|