oon nyt yrittäny alottaa openGL:n mut en saa millään toimimaan modelin latausta.
yritin muokata tosta koodivinkistä mulle sopivaa https://www.ohjelmointiputka.net/koodivinkit/25093-c-3d-mallin-luku-ja-renderöinti-opengl
... int nVertex=0, nPolygon=0, nPolygonV=0, nNormal=0; while(1){ row = getc(modelFile); if(row == '#'){ while(getc(modelFile)!='\n'){} } else if(row == 'v'){ row = getc(modelFile); if(row == 'n'){ fscanf(modelFile," %f %f %f",&ret->NormalArray[nNormal].x, &ret->NormalArray[nNormal].y, &ret->NormalArray[nNormal].z); nNormal++; } else { fscanf(modelFile," %f %f %f",&ret->VertexArray[nVertex].x, &ret->VertexArray[nVertex].y, &ret->VertexArray[nVertex].z); nVertex++; } } else if(row == 'f'){ fscanf(modelFile," %d",&nPolygonV); ret->PolygonArray[nPolygon].VertexArray = (ModelVertex*) malloc(sizeof(ModelVertex) * nPolygonV); ret->PolygonArray[nPolygon].nVertex=nPolygonV; ErrorsWrite("face"); for(a=0; i == 0; a++){ fscanf(modelFile," %d",&b); if(b != 'n'){ ret->PolygonArray[nPolygon].VertexArray[a] = ret->VertexArray[b]; } else { fscanf(modelFile," %d",&b); ret->PolygonArray[b].NormalX = ret->NormalArray[b].x; ret->PolygonArray[b].NormalY = ret->NormalArray[b].y; ret->PolygonArray[b].NormalZ = ret->NormalArray[b].z; i = 1; } } nPolygon++; } else if(row == EOF)break; } } else {//virhe alue loppuu ErrorsWrite("Virhe Modelin latauksessa"); } fclose(modelFile); return ret; } ...
header tiedosto
#ifndef MODEL_H #define MODEL_H struct ModelVertex{ float x, y, z; }; struct ModelNormal{ float x, y, z; }; struct ModelPolygon{ int nVertex; float NormalX, NormalY, NormalZ; ModelVertex *VertexArray; }; struct Model{ int nVertex, nPolygon, nNormal; ModelVertex* VertexArray; ModelNormal* NormalArray; ModelPolygon* PolygonArray; }; Model* LoadModel(const char*); void FreeModel(Model*); void DrawModel(Model*); #endif
Onks muuten mitään helpompaa tapaa kuin määritellä jokanen normaali erikseen?
käytän Dev-C++:ssä.
Muokasin vähän vielä viestiäni jätin vain oleellisen koodin
Mod. lisäsi kooditagit ja paransi otsikkoa.
Aivan ensiksi lue keskustelun ohjeet. Otsikkosi ei kerro mitään etkä käyttänyt koodissasi kooditageja.
Sitten voisitkin kertoa, millä tavalla koodi ei toimi ja miten olet yrittänyt asiaa korjata.
Jos normaalisi osoittavat polygonin todellisen normaalin suuntaan, voit laskea ne ristitulon avulla. Jos mallissa on vain kolmioita, riittää, että lasket lausekkeen (b-a)×(c-b), missä a, b ja c ovat kolmion kulmien paikkavektorit. Jos taas sivut ovat mutkikkaampia ja niissä on koveria kulmia, joudut ensin arvaamaan, mikä kulma olisi kupera.
Sori että en lukenu ohjeita olis varmaa pitäny. En oikein itekkään tiiä mikä on pielessä. Tossa tulee vain windowsin virhe ilmoitus "project.exe lakkasi toimimasta" mutta sen tiädän, että kun se tokan kerran käy kirjaimet läpi se löytää yhen face:n ja tekee siihen kolme verteksiä aina vaikka sen pitäis kaheksan verteksiä, kuus normaalia ja kuus facee. face:issakin pitäis olla neljä eikä kolme vereksiä(Modeli on vasta yksinkertainen kuutio).
Ongelmana voisi olla tämä kohta:
fscanf(modelFile," %d",&b); if(b != 'n'){ ret->PolygonArray[nPolygon].VertexArray[a] = ret->VertexArray[b]; } else { fscanf(modelFile," %d",&b); //... }
Yrität lukea 10-kantaisen kokonaisluvun (%d), joten jos tiedostossa on muuta kuin numeroita, funktio ei lue mitään. Ohjelma jää siis tässä aina ikuiseen silmukkaan. Ehto b == 'n'
toteutuu vain silloin, kun tiedostossa sattuu olemaan n-kirjaimen ASCII-arvoa vastaava luku, 110. (Jos siis mallissasi olisi näin monta verteksiä, tuon verteksin tulkitseminenkin epäonnistuisi.)
Voit tarkistaa fscanf-funktion paluuarvosta, onnistuiko lukeminen:
if (fscanf(modelFile, "%d", &b) == 1) { // luettiin yksi luku (verteksin numero) } else { // ei luettu yhtä lukua, joten seuraavaksi pitäisi tulla n ja luku if (fscanf(modelFile, "n %d", &b) == 1) { // luettiin n ja luku (normaalin numero) } else { // virhe: ei tullutkaan n-kirjainta ja lukua! } }
Saan Tälläisen virhe ilmoituksen
Ongelmatapahtuman nimi:-----APPCRASH
Sovelluksen nimi:-----------Project.exe
Sovelluksen versio:---------0.0.0.0
Sovelluksen aikaleima:------49718c59
Vikamoduulin nimi:----------Project.exe
Vikamoduulin versio:--------0.0.0.0
Vikamoduulin aikaleima:-----49718c59
Poikkeuskoodi:--------------c0000005
Poikkeuksen poikkeama:------0000198f
Käyttöjärjestelmän versio:--6.0.6001.2.1.0.768.3
Lokaalin tunnus:------------1035
Lisätietoja 1:--------------1c95
Lisätietoja 2:--------------1246f10bfb6e3574c30daf5202b25f2f
Lisätietoja 3:--------------bc07
Lisätietoja 4:--------------d56b59ca8b7ee9cfd6f564689410749a
Koodissasi on varmaankin sitten jokin virhe. Kannattaa ehkä etsiä ja korjata se, niin toimii paremmin.
Neljännellä kerralla sain toimimaan,
mutta nyt on ongelmia varjojen kanssa(yritän ite keksiä ratkaisua)
Aihe on jo aika vanha, joten et voi enää vastata siihen.