Przesuwanie kamery w pionie i poziomie w OpenGL - jak to zrobić poprawnie?

0

Mam stworzone obiekty 3d w opengl. Chciałbym przesuwać kamerę żeby lepiej je oglądać. Zoom już mi działa ale nie mogę sobie poradzić z przesuwaniem kamery w pionie i poziomie.
Mój kod od kamery:

glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            gluPerspective(110-zoom,1,1,50);
            gluLookAt(0-kamerax,1-kameray,0.00001-kameraz ,0-kamerax,0-kameray,0, 0,1,0);

i obsluga klawiszy:

case WM_KEYDOWN:
        {
            switch (wParam)
            {
                case VK_ESCAPE:
                    PostQuitMessage(0);
                break;
                case 0x41:
                    zoom+=1;
                break;
                case 0x5A:
                    zoom-=1;
                break;
                case VK_DOWN:
                    kameray-=1;
                break;
                case VK_UP:
                    kameray+=1;
                break;
                case VK_RIGHT:
                    kamerax+=1;
                break;
                case VK_LEFT:
                    kamerax-=1;
                break;
            }
        }
0

gluLookAt powinno być w GL_MODELVIEW:

glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(110-zoom,1,1,50);
glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0-kamerax,1-kameray,0.00001-kameraz ,0-kamerax,0-kameray,0, 0,1,0);

inaczej kosmosy wychodzą.

0

Nie pomogło. Przy próbie przesuwania w pionie lub poziomie dalej zniekształca obraz np jak mam sferę to robi się z niej jajo.
Szczególnie widać to kiedy obiekt przesunie się bliżej końca okna wtedy zniekształcenie jest największe.

0

Pokaż więcej kodu. Masz jakieś dzikie przekształcenie.
Podejrzanie wygląda też:
110-zoom — ile wynosi zoom?
0.00001-kameraz — ile wynosi kameraz, i dlaczego taka dziwna wartość?

0
glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                gluPerspective(110-zoom,1,1,50);
            glMatrixMode(GL_MODELVIEW);
                glLoadIdentity();
                gluLookAt(0-kamerax,1,0.000001-kameray ,0-kamerax,0,0-kameray, 0,1,0);
               glOrtho(-5000.0,5000,-5000,5000,-5000,5000);
               glBindTexture(GL_TEXTURE_2D, texture[0]);
               glRotatef(90,1,0,0);
               gluSphere(quadric, 1392.0f, 500, 100);

i jeszcze klawisze:

 switch (wParam)
            {
                case VK_ESCAPE:
                    PostQuitMessage(0);
                break;
                case 0x41:
                    zoom+=1;
                break;
                case 0x5A:
                    zoom-=1;
                break;
                case VK_DOWN:
                    kameray+=0.01;
                break;
                case VK_UP:
                    kameray-=0.01;
                break;
                case VK_RIGHT:
                    kamerax+=0.01;
                break;
                case VK_LEFT:
                    kamerax-=0.01;
                break;
            }

Zoom i kamery x,y i z są ustawione na 0. Ich wartości są zmieniane przy wciskaniu klawiszy. Chciałem żeby sferę było widać z góry ale przy wpisaniu gluLookAt(0-kamerax,1,0.000001-kameray ,0-kamerax,0,0-kameray, 0,1,0); w ogóle nic nie widać dlatego ustawiłem taką "dziką" wartość. Z tym kodem mniej więcej działa przybliżanie i przesuwanie tylko przesuwanie troche zniekształca. Możliwe że zoom też jest źle niby działa ale powiększa do pewnego momentu a potem jak się powiększy jeszcze raz obraz znów jest mały i tak jakby przekręcony. Może powiększanie trzeba rozwiązać w jakiś inny sposób.

0

gluPerspective(110-zoom,1,1,50);
...
glOrtho(-5000.0,5000,-5000,5000,-5000,5000);

glOrtho powinno być w GL_PROJECTION.
poza tym gluPerspective i glOrtho się wzajemnie wykluczają.

krótki kurs:

GL_PROJECTION: gluPerspective albo glFrustum albo glOrtho albo gluOrtho2D

GL_MODELVIEW: gluLookAt

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