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.
Pokaż kod. Zapewne zapomniałeś czegoś tam aktualizować.
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ć:/
A co z tymi zmiennymi delta* robisz?
if(deltaRuch)
PlaskiRuch(deltaRuch);
if (deltakat){
kat +=deltakat;
zorientujMnie(kat, katy);
}
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.
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.
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.
Projekt na zaliczenie tak jak piszesz. Wszystko jest oprócz tego ze pistolet nie trzyma się kamery tak jak powinien.
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ć.
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.