Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: 3D-mallin lataus ei suju

seeplusplussaaja [04.01.2009 10:14:41]

#

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.

Metabolix [04.01.2009 10:34:35]

#

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.

seeplusplussaaja [04.01.2009 10:47:53]

#

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).

Metabolix [06.01.2009 00:26:00]

#

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!
  }
}

seeplusplussaaja [17.01.2009 09:49:09]

#

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

Metabolix [18.01.2009 23:22:49]

#

Koodissasi on varmaankin sitten jokin virhe. Kannattaa ehkä etsiä ja korjata se, niin toimii paremmin.

seeplusplussaaja [26.01.2009 17:15:52]

#

Neljännellä kerralla sain toimimaan,
mutta nyt on ongelmia varjojen kanssa(yritän ite keksiä ratkaisua)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta