Problem z rotacją textury OPENGL C++

0

Witam,
piszę grę tank 1990 i mam problem z obóceniem bitmapy(czołgu) o 90 stopni na płaszczyznie wiem ze powinno to wyglądać tak:

glRotatef(90 ,0.0f ,0.0f , 1.0f);
jednak że zmieniam wartości w funkcji :
glVertex3f(abc.rx() + WIDTH_TEXTURE, abc.ry(), abc.rz()); no i przez to wszystko jest nie tak potrzebuje tak napisanej tej funkcji gdyż określam sobie w tablicy klas pozycje tekstur itd.

proszę o podanie jakiegoś możliwego rozwiązania tak abym mógł zrobić tą rotacje na podstawie danych o ile przesunołem texture.

oto kod funkcji w której wyświetlam textury, celowo podaję całą funkcję gdyż widoczne są wszystkie wywołania funkcji glTranslatef ()
z góry dziękuje za pomoc!

int DrawGLScene(GLvoid)									// Here's Where We Do All The Drawing
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear The Screen And The Depth Buffer
	glLoadIdentity();									// Reset The View
	glTranslatef(0.0f,0.0f,-5.0f);
	if (masking)         // Czy maskowanie jest włączone?
		{
			glRotatef(zrot,0.0f,0.0f,1.0f);
			glBindTexture(GL_TEXTURE_2D, player_mask[abc.r_kto()]);
			glBegin(GL_QUADS);   
                glTexCoord2f(0.0f, 0.0f); glVertex3f(abc.rx(), abc.ry(), abc.rz());
				glTexCoord2f(1.0f, 0.0f); glVertex3f(abc.rx() + WIDTH_TEXTURE, abc.ry(), abc.rz());
				glTexCoord2f(1.0f, 1.0f); glVertex3f(abc.rx() + WIDTH_TEXTURE, abc.ry() + HEIGHT_TEXTURE, abc.rz());
				glTexCoord2f(0.0f, 1.0f); glVertex3f(abc.rx(), abc.ry() + HEIGHT_TEXTURE, abc.rz());    
            glEnd();                        
        }
	
		glRotatef(zrot++,abc.rx(),abc.ry(),1.0f) ;
		glBlendFunc(GL_ONE, GL_ONE);					// Copy Image 2 Color To The Screen
		glBindTexture(GL_TEXTURE_2D, player_texture[abc.r_kto()]);
		glBegin(GL_QUADS);              
            glTexCoord2f(0.0f, 0.0f); glVertex3f(abc.rx(), abc.ry(), abc.rz());
			glTexCoord2f(1.0f, 0.0f); glVertex3f(abc.rx() + WIDTH_TEXTURE, abc.ry(), abc.rz());
			glTexCoord2f(1.0f, 1.0f); glVertex3f(abc.rx() + WIDTH_TEXTURE, abc.ry() + HEIGHT_TEXTURE, abc.rz());
			glTexCoord2f(0.0f, 1.0f); glVertex3f(abc.rx(), abc.ry() + HEIGHT_TEXTURE, abc.rz());    
        glEnd(); 										// Done Drawing The Quad
			
	



		glEnable(GL_DEPTH_TEST);         // Włącz test głębokości
		glDisable(GL_BLEND);         // Wyłącz mieszanie kolorów


	return TRUE;	

}
0

:]]]]]]]

 


struct  TPolygon {
int	Count;
t3dpoint	normal;
t3dpoint	V[128];
};



float __fastcall getplaneD(t3dpoint vn,t3dpoint point)
{
return -((vn.x*point.x)+(vn.y*point.y)+(vn.z*point.z));
}






TPolygon CreatePoly(t3dpoint p,t3dpoint punkt_na_plaszczyznie, float SIZE)
{
// SIZE = 16384.0;
    TPolygon Result;
t3dpoint  n, tmp;
float  a, b, c,d;

           d = getplaneD(p,punkt_na_plaszczyznie);
  // Create a huge polygon on the given plane.

  //Result.Count := 4;

  a = abs(p.x);
  b = abs(p.y);
  c = abs(p.z);

  if ((a >= b) && (a >= c) ) {
	// Plane is mostly YZ-aligned.
	Result.V[0] = triplesingletoT3DPOINT(-(p.y*-SIZE + p.z*-SIZE + d)/p.x, -SIZE, -SIZE);
	Result.V[1] = triplesingletoT3DPOINT(-(p.y*SIZE + p.z*-SIZE + d)/p.x, SIZE, -SIZE);
	Result.V[2] = triplesingletoT3DPOINT(-(p.y*SIZE + p.z*SIZE + d)/p.x, SIZE, SIZE);
	Result.V[3] = triplesingletoT3DPOINT(-(p.y*-SIZE + p.z*SIZE + d)/p.x, -SIZE, SIZE);
}
 if ( (b >= a) && (b >= c) ) {
	// Plane is mostly XZ-aligned.
	Result.V[0] = triplesingletoT3DPOINT(-SIZE, -(p.x*-SIZE + p.z*-SIZE +d)/p.y, -SIZE);
	Result.V[1] = triplesingletoT3DPOINT(SIZE, -(p.x*SIZE + p.z*-SIZE + d)/p.y, -SIZE);
	Result.V[2] = triplesingletoT3DPOINT(SIZE, -(p.x*SIZE + p.z*SIZE + d)/p.y, SIZE);
	Result.V[3] = triplesingletoT3DPOINT(-SIZE, -(p.x*-SIZE + p.z*SIZE + d)/p.y, SIZE);
}
 if ( (c >= a) && (c >= b) ) {
	// Plane is mostly XY-aligned.
	Result.V[0] = triplesingletoT3DPOINT(-SIZE, -SIZE, -(p.x*-SIZE + p.y*-SIZE + d)/p.z);
	Result.V[1] = triplesingletoT3DPOINT(SIZE, -SIZE, -(p.x*SIZE + p.y*-SIZE + d)/p.z);
	Result.V[2] = triplesingletoT3DPOINT(SIZE, SIZE, -(p.x*SIZE + p.y*SIZE + d)/p.z);
	Result.V[3] = triplesingletoT3DPOINT(-SIZE, SIZE, -(p.x*-SIZE + p.y*SIZE + d)/p.z);

	}
  n = vectorcross(vectors_substract_v1minusv2(Result.V[0], Result.V[1]),
                    vectors_substract_v1minusv2(Result.V[2], Result.V[1]));
Result.normal 	= p;
Result.Count 	= 4;
  if (Dot(p, n) <= 0 ) {
	tmp = Result.V[1];
	Result.V[1] = Result.V[3];
	Result.V[3] = tmp;
}
  return Result;
}

mozna to jeszcze na dwa roznie sposoby zrobic np. liczyc koordynaty tekstury sinus i cos kata [;

albo ze mnozysz przez przekatna prostokata dzielona na pol ten ynik z cos i sin

bo kazdy wierzcholek ma swoj glTexCooord2f();? latwe wszyzstko owyliczenia
dla kwadratu jest 45% kat
v[0] = [ v[0].x = przekatna * sin(45.0f * 0.017453292519943295769236907684886);
v[0] = [ v[0].y = przekatna * cos(45.0f * 0.017453292519943295769236907684886);

cos takiego dla pierwszego wierzcholka zalezy jak rysujesz czy w rzucie z gory? czy z jakiegos widoku? itp. tid. etc. i jeszcze wiele wiecej....

 
void __fastcall RotateModel(int  float )
{

int i;

t3dpoint p,addme;

for (i = 0; i < VBO_V.Length; i++) {
		  p = vectors_add(VBO_V[i], reverse_point(CENTER_POINT));    //punkt przeniesiony na srodek bryly
		
				   addme = CENTER_POINT;
		   if (dimension == 0) { //XZ
		   addme.y = 0.0f;
VBO_V[i].x = cos(angle*imopi)*p.x - sin(angle*imopi)*p.z;
VBO_V[i].z = sin(angle*imopi)*p.x + cos(angle*imopi)*p.z;
		   }

		   if (dimension == 1) { //XY
		   addme.z = 0.0f;
VBO_V[i].x = cos(angle*imopi)*p.x - sin(angle*imopi)*p.y;
VBO_V[i].y = sin(angle*imopi)*p.x + cos(angle*imopi)*p.y;
		   }

		   if (dimension == 2) { //ZY
		   addme.x = 0.0f;
VBO_V[i].z = cos(angle*imopi)*p.z - sin(angle*imopi)*p.y;
VBO_V[i].y = sin(angle*imopi)*p.z + cos(angle*imopi)*p.y;
		   }

VBO_V[i] = vectors_add(VBO_V[i],addme);                         //dodaj aby to byla poprawna pozycja

}

}

i jeszcze wiele wiecej sie da na chama

0

Dzięki bardzo za pomoc co prawda troche nie rozumiem kodu bo dopiero zaczynam coś robić w opengl a nie sdl i allegro no ale mam teraz co analizować.
Super że jest takie forum i istnieją jeszcze ludzie którzy są w stanie pomóc a nie tylko wrzeszczeć jeszcze raz wielkie dzięki pozdro.

0

jak chcesz obracac poprzed glRotatef

to to sie robie tak

glPushMatrix(); //teraz mozna gltranslate glrotate ze bedzie obracac to co bedzie po tym kodzie walsnie a nie bedzie ingerowac w scene

glRotatef();
glTranslatef(-x,-y,-z); jak pamoietam to bedzie minus zeby ustawic polygon w srodku ukladu wspolrzednych

glenable(gl_texture)'
glbindtexture();

i tutaj glbegin();
glvertex3f
gltexcoord
glend();
glDIsable(gl_texure
glPopMatrix();

0

Cześć,
dokładnie to robi się to tak:

// zapamiętujesz konfigurację systemu transformacji
glPushAttrib(GL_TRANSFORM_BIT);

// przechodzisz w tryb transformacji współrzędnych tekstur (w odróżnieniu od transformacji wspł. wierzchołków)
glMatrixMode(GL_TEXTURE);

// zerujesz macierz transformacji do początku ukł. wspł.
glLoadIdentity();

// przesuwasz środek tekstury do początka ukł. wspł (żeby obracać wokół środka tekstury)
glTranslatef(0.5, 0.5, 0);

// obracasz
glRotatef(angle, 0, 0, 1);

// wracasz z teksturą na dawne miejsce
glTranslatef(-0.5, -0.5, 0);

// przywracasz konfigurację systemu transformacji
glPopAttrib();

pozdrawiam ;)

0

Dzięki za pomoc , zwłaszcza Mateuszowi Midorowi wszystko smiga że aż miło jeszcze raz dzięki.
pozdro

1 użytkowników online, w tym zalogowanych: 0, gości: 1