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

Podobne dokumenty