OpenGL Kamera

0

Witam. Mam planszę 3D po której chodzę, przed sobą mam pistolet który smigać powinien razem z ruchem strzałek.
Jednak działa mi to tylko przód tył. Nie wiem jak podpiąć aby na boki tez się ruszał z kamerą. Wykorzystuje glTranslatef(x,y,z); przy przesuwaniu pistoleta. Jednak nie mam pojęcia jak podczepić aby klawisze lewo prawo też sprawialy aby pistolet byl ciagle przede mna i łazil z kamera wszedzie. Teraz jak nacisne tylko klawisz w lewo albo prawo to pistolet ucieka z kamery jak daje przód tyl to tylko sie jej trzyma.

0

Pokaż kod. Zapewne zapomniałeś czegoś tam aktualizować.

0

Z kodem cięzko bedzie. ale zamieszczam kluczowe fragmenty ktore sa używane.

 glTranslatef(x,y,z);//transformacja przed rysowaniem pistoletu
 
void zorientujMnie(float ang, float ang2){
	lx = sin(ang);
	ly = tan(ang2);
	lz = - cos(ang);
	glLoadIdentity();
	
	gluLookAt(x,y,z,x+lx,y+ly,z+lz,0.0f,1.0f,0.0f);
}
void PlaskiRuch(int i){
	x = x+i*(lx)*0.01;
	z = z+i*(lz)*0.01;
	glLoadIdentity();
	
//	rysowanie(x,y,z-2.0);
	
	gluLookAt(x,y,z,x+lx,y+ly,z+lz,0.0f,1.0f,0.0f);
}

void pressKey(int key, int x, int y)
{
	switch(key){
		case GLUT_KEY_LEFT : deltakat = -0.1f; break;
		case GLUT_KEY_RIGHT : deltakat = 0.1f; break;
		case GLUT_KEY_UP : deltaRuch = 9; break;
		case GLUT_KEY_DOWN : deltaRuch = -2; break;
	}

}
void releaseKey(int key, int x, int y){
	switch(key){
		case GLUT_KEY_LEFT :
		case GLUT_KEY_RIGHT : deltakat=0.0f; break;
		case GLUT_KEY_UP : 
		case GLUT_KEY_DOWN : deltaRuch = 0; break;
	}
}

//pasywne działanie myszy (nie trzeba klikać)
void Mysz(int myszX, int myszY)
{
    if(oldX > myszX) kat -= 0.05;
    if(oldX < myszX) kat += 0.05;
    
    if(oldY > myszY) katy += 0.05;
    if(oldY < myszY) katy -= 0.05;
    
    oldX=myszX;
    oldY=myszY;
	
    zorientujMnie(kat,katy);

}
//funkcje odpowiedzialne za ruch itp. zmienne sa globalne

a tutaj wywolanie funkcji rysuj z parametrami x,y,z
rysowanie(x,y-0.6,z-2.2); // ustawiam sobie przed soba pistlet.
Gdy smigal tyl przód pistolet ladnie sie trzyma. ale nie przekreca sie z kamera. Nie wiem jak to zrobić:/

0

A co z tymi zmiennymi delta* robisz?

0
	if(deltaRuch)
			PlaskiRuch(deltaRuch);
	if (deltakat){
		kat +=deltakat;
		zorientujMnie(kat, katy);
	} 
0

A przy rysowaniu pistoletu też go obracasz? Bo funkcja zorientujMnie tylko ustawia kamerę (w ogóle ustawiłeś dobry glMatrixMode?). Musisz obrócić i kamerę i pistolet, żeby pistolet był cały czas na środku ekranu.

0

Nie obracam go bo nie wiem jak. Robię tylko glTranslatef(x,y,z) i dalej rysowanie itp. Tak jak pisalem przy chodzeniu do przodu ładnie pistolet z kamera smiga. Ale jak skrecam to kamera w inna a pistolet nie. To właśnie problem że nie wiem jak to zrobic.

0

Rozwiązanie radykalne, ale w dłuższej perspektywie najlepsze: nauczyć się całej matematyki i OpenGLa ze strony songho.ca, a potem całkowicie przestać korzystać z fixed-pipeline (tzn glRotate, glTranslate, gluLookAt, glMatrixMode, glPushMatrix, itd) i wszystko liczyć samemu, czy to na CPU czy w vertex shaderze to już nieważne. No chyba, że robisz tylko projekt na zaliczenie i zależy ci na jak najszybszym odwaleniu roboty, to zainteresuj się funkcją glRotate i w ogóle spójrz czasem do dokumentacji na Khronos.org.

0

Projekt na zaliczenie tak jak piszesz. Wszystko jest oprócz tego ze pistolet nie trzyma się kamery tak jak powinien.

0

Już coś wcześniej walczylem z glRotate ale bez rezultatu. Tzn nie wiedziałem jak się dokładnie odnieść do tego. I co w nią jak wsadzić.

0

glRotate obraca wokół podanej osi o podany kąt. Zwykle używa się osi OX, OY lub OZ, tzn wywołania glRotate(kąt, 1, 0, 0) czy np glRotate(kąt, 0, 1, 0). Obraca się osia po osi. Porpóbuj coś takiego.

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