Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: OpenGL normaalit

Lahha [08.03.2010 16:47:11]

#

Oliskohan jossain selkee ja kattava selostus openGL:n normaalien käyttöön valaistuksessa?

Kun en saa tätä toimimaan oikeen mitenkää.

Tuossa koodia jos joku viittii ihmetellä mikä menee vikaan.

static const float vertex_map[8][3] =
{
//	  x,   y,   z
	0.0, 0.0, 0.0,
	0.0, 0.0, 1.0,
	1.0, 0.0, 1.0,
	1.0, 0.0, 0.0,
	0.0, 1.0, 0.0,
	0.0, 1.0, 1.0,
	1.0, 1.0, 1.0,
	1.0, 1.0, 0.0
};

static const unsigned __int8 slope_map[13][4] =
{
	0, 1, 3, 2, //flat

	0, 5, 3, 6, //z+ uphill
	1, 6, 0, 7, //x+ uphill
	2, 7, 1, 4, //z- uphill
	3, 4, 2, 5, //x- uphill

	6, 3, 1, 0, //x+ z+ outer corner
	5, 2, 0, 3, //x- z+ outer corner
	4, 1, 3, 2, //x- z- outer corner
	7, 0, 2, 1, //x+ z- outer corner

	6, 7, 5, 0, //x+ z+ inner corner
	5, 6, 4, 3, //x- z+ inner corner
	4, 5, 7, 2, //x- z- inner corner
	7, 4, 6, 1  //x+ z- inner corner

};

static const float normal_map[13*2][3] =
{
//	x, y, z

	//flat
	0.0, 1.0, 0.0,
	0.0, 1.0, 0.0,

	//z+ uphill
	0, 0.7, -0.7,
	0, 0.7, -0.7,
	//x+ uphill
	-0.7, 0.7, 0,
	-0.7, 0.7, 0,
	//z- uphill
	0, 0.7, 0.7,
	0, 0.7, 0.7,
	//x- uphill
	0.7, 0.7, 0,
	0.7, 0.7, 0,

	//x+ z+ outer corner
	//-0.58, 0.58, -0.58,
	-0.58, 0.58, -0.58,
	0.0, 1.0, 0.0,
	//x- z+ outer corner
	0.58, 0.58, -0.58,
	0.0, 1.0, 0.0,
	//x- z- outer corner
	0.58, 0.58, 0.58,
	0.0, 1.0, 0.0,
	//x+ z- outer corner
	-0.58, 0.58, 0.58,
	0.0, 1.0, 0.0,

	//x+ z+ inner corner
	0.0, 1.0, 0.0,
	-0.58, 0.58, -0.58,
	//x- z+ inner corner
	0.0, 1.0, 0.0,
	0.58, 0.58, -0.58,
	//x- z- inner corner
	0.0, 1.0, 0.0,
	0.58, 0.58, 0.58,
	//x+ z- inner corner
	0.0, 1.0, 0.0,
	-0.58, 0.58, 0.58
};

bool application::drawTile(int n)
{
	if(n >= map_x*map_z)
		return false;

	float
		z = ((float)(n/map_x))*map_scale_z,
		x = ((float)(n-(map_x*(n/map_x))))*map_scale_x,
		y = ((float)map[n].depth)*map_scale_y;

	if(map[n].slope >= 0 && map[n].slope < 13)
	{

		if(n == selected_tile)
			glColor3f(0.8f,0.8f,0.0f);
		else
			glColor3f(0.5f, 1.0f,0.5f);

		glBegin(GL_TRIANGLES);

		glNormal3f(normal_map[map[n].slope*2][0],normal_map[map[n].slope*2][2],normal_map[map[n].slope*2][3]);

		glVertex3f(calc_x(0), calc_y(0), calc_z(0));
		glVertex3f(calc_x(1), calc_y(1), calc_z(1));
		glVertex3f(calc_x(2), calc_y(2), calc_z(2));

		glEnd();
		glBegin(GL_TRIANGLES);

		glNormal3f(normal_map[map[n].slope*2+1][0],normal_map[map[n].slope*2+1][2],normal_map[map[n].slope*2+1][3]);

		glVertex3f(calc_x(2), calc_y(2), calc_z(2));
		glVertex3f(calc_x(1), calc_y(1), calc_z(1));
		glVertex3f(calc_x(3), calc_y(3), calc_z(3));

		glEnd();

		//draw normals for debug
		if(n == selected_tile)
		{
			glColor3f(1.0f,1.0f,1.0f);

			int nm[6] = { 0, 1, 2, 2, 1, 3 };

			for(int i = 0; i < 2; i++)
			{
				for(int ii = 0; ii < 3; ii++)
				{
					int in = i*3 + ii;

					glBegin(GL_LINES);
					glVertex3f(calc_x(nm[in]), calc_y(nm[in]), calc_z(nm[in]));
					glVertex3f(calc_x(nm[in])+normal_map[map[n].slope*2+i][0], calc_y(nm[in])+normal_map[map[n].slope*2+i][1], calc_z(nm[in])+normal_map[map[n].slope*2+i][2]);
					glEnd();
				}
			}
		}
		//debug code ends
	}

	return true;
}

Jokotai [08.03.2010 16:50:36]

#

Virhelistan voisit postata.

Metabolix [08.03.2010 16:54:13]

#

Ja mistä päin sen valon pitäisi tulla? Et ole lainkaan käyttänyt OpenGL:n valotoimintoja. Eivät ne valot itsestään ilmesty oikeisiin paikkoihin.

OpenGL:n valaistus on hyvin rajoittunut mm. valojen määrän ja varjojen suhteen, joten tarkkaa lopputulosta varten täytyy tehdä laskut itse (tai käyttää valmista grafiikkamoottoria). Jonkin verran on mahdollista kikkailla asettamalla GL:n valoiksi esinettä lähimmät valot, mutta tälläkään ei pärjää loputtomiin.

Lahha [08.03.2010 16:57:25]

#

Tuollaista tuottaa http://i45.tinypic.com/el5urr.png

Valot on määritelty toisaalla

//lights
	glEnable(GL_LIGHTING);

	GLfloat LightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
	GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat LightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat LightEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
	GLfloat LightPosition[] = { 50.0f, 50.0f, 50.0f, 1.0f };

	glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
	glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
	glEnable(GL_LIGHT1);

	glEnable(GL_COLOR_MATERIAL);

	glShadeModel(GL_SMOOTH);

	glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ) ;

	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, LightSpecular);
	glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, LightEmission);

Metabolix [08.03.2010 17:06:40]

#

Jaa, selvä. Vilkaisin koodia tarkemmin, liittyisivätkö glNormal3f-riveillä olevat indeksit ([0], [2], [3]) asiaan jotenkin?

Voisit laittaa floatin tilalle GLfloat ja käyttää glNormal3fv:tä, niin välttäisit virheen. Lisäksi suosittelen käännösasetuksia -std=c++98 -Wall -pedantic -O2. Koodia selkeyttäisi, jos käyttäisit rakenteita pelkkien taulukoiden sijaan.

Lahha [08.03.2010 17:09:13]

#

Jes, olipas taas typerä virhe.
Kiitos taas kerran.

Vastaus

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

Tietoa sivustosta