Laboratorium 3 OpenGl (3) „Perspektywa. Obsługa poleceń myszy”
Transkrypt
Laboratorium 3 OpenGl (3) „Perspektywa. Obsługa poleceń myszy”
Laboratorium 3 OpenGl (3) „Perspektywa. Obsługa poleceń myszy” 1. Skompiluj i uruchom załączony program (konieczne jest dodanie –lglu32 do poleceń konsolidatora) - na podstawie poprzedniego programu oraz analizy kodu spróbuj opisać własnymi słowami działanie perspektywy w OpenGL. Zmień pozycję obserwatora z (0,0,10) na (4, -4, 10). Poeksperymentuj ze zmianą wektora patrzenia. Jak zmiany te wpłyną na rzutowanie? Interakcja z obiektem w scenie poprzez użycie myszy Kolejnym zadaniem jest wzbogacenie naszego programu o funkcjonalność, która będzie polegała na tym, że przy wciśniętym lewym klawiszu myszy i jednoczesnym jej ruchu w lewo bądź w prawo, czajnik wykona stosowny obrót w danym kierunku względem osi y. 2. W sekcji przeznaczonej na definicję zmiennych globalnych dodaj następujące definicje: /* Kąt obrotu czajnika */ GLfloat theta = 0.0f; /* Przelicznik pixeli na kąt */ GLfloat pixels2angle = 0.0; /* Status lewego przycisku myszy: zwolniony wciśnięty */ GLint lbutton_status = 0; /* Ostatnia pozycja kursora myszy */ GLint x_last_pos = 0; /* Przemieszczenie kursora */ GLint x_delta = 0; 3. W funkcji main() dodaj rejestracje funkcji: // Rejestracja funkcji odpowiedzialnej stan myszy glutMouseFunc(MouseFunc); // Rejestracja funkcji odpowiedzialnej za ruch myszy glutMotionFunc(MouseMotion); 4. Zaimplementuj zarejestrowane funkcje: /* Funkcja obsługująca mysz - bada stan klawiszy i ustawia odpowiednie zmienne */ void MouseFunc(int button, int state, int x, int y) { if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { // Zapamętujemy obecne położenie myszy x_last_pos = x; // Przycisk lewy wcisnięty lbutton_status = 1; } else { // Przycisk jest zwolniony lbutton_status = 0; } } /* Funkcja monitoruje położenie myszy i ustala odpowiednie zmienne */ void MouseMotion(GLsizei x, GLsizei y) { // Wyliczamy aktualne przemieszczenie x_delta = x - x_last_pos; // Zapamiętujemy aktualne położenie x_last_pos = x; // Odświeżamy okno glutPostRedisplay(); } 5. Tuż przed rysowaniem dzbanka dodaj: // Jeśli wciśnięto lewy klawisz myszy if(lbutton_status == 1) { // Zwiększ kąt theta += x_delta*pixels2angle; } // Obrót w okół osi y glRotatef(theta,0.0f, 1.0f, 0.0f); 6. Na początku funkcji ReshapeWindow() dodaj przeliczenie pikseli na stopnie: // Przeliczamy piksele na stopnie pixels2angle = 360.0f/(float)width; 7. Skompiluj i uruchom program. 8. Zmodyfikuj program dodając obrót w około osi x. 9. Dodaj funkcjonalność prawego klawisza myszy, którego wciśnięcie i ruch w kierunku pionowym powoduje zbliżanie/oddalanie się od obiektu. 10. Odwróćmy problem. Teraz niech dzbanek będzie nieruchomy i będzie się rysował w początku układu współrzędnych. Zmodyfikuj program tak, aby można było sterować położeniem obserwatora względem obiektu (względem początku układu współrzędnych). Położenie można zapisywać we współrzędnych biegunowych: xobs R cos cos , yobs R sin , zobs R cos sin , , gdzie: θ,φ- to odpowiednie kąty przy wektorze wodzącym o długości R