poruszanie obiektem po płaszczyźnie OpenGL

0

Witam.
Mam do zrobienia projekt w którym będę miał możliwość poruszania się samolotem po płaszczyźnie. Projekt ma być wykonany w OpenGL'u.
Model samolotu wykonałem z kilku sześcianów. Przygodę z OpenGL'em dopiero zaczynam i proszę o jakiekolwiek pomocne rady co do sterowania takim obiektem. Poruszanie kamerą działa, możemy się obracać wokół samolotu, jednak teraz chciałbym mieć możliwość poruszania się obiektem (samolotem).

 
                                        case 'W':
					przesuniecie_y +=0.2f;
					InvalidateRect(hWnd, NULL, FALSE);
					break;
				case 'S':
					przesuniecie_y -=0.2f;
					InvalidateRect(hWnd, NULL, FALSE);
					break;
				case 'D':
					przesuniecie_x +=0.2f;
					InvalidateRect(hWnd, NULL, FALSE);
					break;
				case 'A':
					przesuniecie_x -=0.2f;
					InvalidateRect(hWnd, NULL, FALSE);
					break;
				case 'F':
					przesuniecie_z-=0.2f;
					InvalidateRect(hWnd, NULL, FALSE);
					break;
				case 'R':
					przesuniecie_z+=0.2f;
					InvalidateRect(hWnd, NULL, FALSE);
					break; 

tak miałaby wyglądać obsługa klawiszy, jednak nie mam pojęcia jak 'wymusić' na programie to sterowanie.. funkcja rysująca samolot jest to RenderScene(void).. z góry dziękuję za pomoc i proszę o wyrozumiałość.
Pozdrawiam.

1

Jeżeli animacja ma być płynna, to może lepiej rysować non-stop w pętli. Poszukaj jak wygląda typowa pętla komunikatów czasu rzeczywistego w aplikacjach OpenGL.

A jeżeli nie chcesz obciążać grafiki ani procka tylko rysować okazjonalnie, po naciśnięciu klawisza, to no masz już InvalidateRect, w WM_PAINT odpalasz RenderScene, nie zapomnij tylko o ValidateRect pod koniec WM_PAINT w takiej sytuacji.

0

Chyba najlepsze wyjście dla przekształceń obiektów to stworzyć klasę np. o polach współrzędnych kartezjańskich i kierunkach dwóch wektorów (trzeci wektor to iloczyn wektorowy dwóch poprzednich), reprezentującą obiekt i zaimplementować w niej metodę tworzącą macierz przekształceń 4x4. Później w funkcji renderującej przekazywać macierz jako parametr i dalej do Shadera gdzie mnożysz wierzchołki przez tą macierz.

0

niestety nadal nie uporałem się z tym problemem.. próbowałem przez WM_PAINT, ale kompletnie nic się nie dzieje podczas naciskania klawiszy. przesuniecie_z,x,y są zadeklarowane jako float. Czy zamiast tych zmiennych mogę użyć funkcji translatef ?

0

pokaż kod.

0

Po jakiej płaszczyźnie ma się poruszać samolot? Nie chodzi ci po prostu o zwykły lot samolotem w 3d?

0

jest powierzchnia zbudowana z siatki kwadratów, nad nią znajduje się samolot i tak, chodzi mi o zwykły lot w 3d, może być tylko do przodu i obrót wokół własnej osi. nie mogę sobie z tym poradzic, samolot jest rysowany poprawnie, powierzchnia także.

0
  1. Zapoznaj się z tym jak robi sie pętle programową z animacje w czasie rzeczywistym np tutaj masz przykład z dodatkowym sterowaniem

http://nehe.gamedev.net/tutorial/loading_and_moving_through_a_3d_world/22003/

  1. Zapoznaj się z macierzami, będzie łatwiej i w cale samej matematyki nie trzeba rozumieć

  2. Przemieszczaj samolot w każdej jednostce czasu(dt) o wektor kierunku pomnożony przez (dt)

  3. żeby zmienić kierunek lotu modyfikuj wektor kierunku, a nie pozycję samolotu(pozycja sama się płynnie zmieni ze względu na pkt 3).

0

Witam ponownie.
Udało mi się zrobic sterowanie i teraz obiekt reaguje na klawisze.
Chciałbym teraz jednak dopracować sterowanie poprzez obrót samolotu wokół własnej osi, póki co jest to sztywne poruszanie obiektem po planszy. user image zalezy mi na takim obrocie samolotu, wiem, że chodzi o funkcje glRotatef.

case 'W':
				przesuniecie_y += 1.2f;
				InvalidateRect(hWnd, NULL, FALSE);
				break;
			case 'S':
				przesuniecie_y -= 1.2f;
				InvalidateRect(hWnd, NULL, FALSE);
				break;
			case 'A':
				przesuniecie_x += 1.2f;
				InvalidateRect(hWnd, NULL, FALSE);
				break;
			case 'D':
				przesuniecie_x -= 1.2f;
				InvalidateRect(hWnd, NULL, FALSE);
				break;

			case 'R':
				przesuniecie_z += 1.2f;
				InvalidateRect(hWnd, NULL, FALSE);
				break;



	glPushMatrix();
		glTranslatef(0,0 , przesuniecie_z + 5);
		glRotatef(0, 1, 0, 0);
		RenderScene();
	glPopMatrix();

tak wygląda kod odpowiedzialny za sterowanie. Po nacisnięciu klawisza 'R' samolot porusza się do przodu. I moje pytanie jest takie, jak wykorzystać glRotatef do sprawnego obrotu samolotu. Z góry dziękuje za odpowiedzi, pozdrawiam.

EDIT:

    glPushMatrix();
        glTranslatef(0, 0, przesuniecie_z + 5);
        glRotated(przesuniecie_x, 0, 0, 1);
        glRotated(przesuniecie_y, 1, 0, 0);
        RenderScene();
    glPopMatrix();

poradziłem sobie z obrotem obiektu w taki sposób, teraz mam problem taki, aby samolot poruszał się w kierunku w którym jest obrócony zamiast ruchu cały czas do przodu.. czy mógłby mi ktoś pomóc ?

0
	glPushMatrix();
		glTranslatef(0, 0, przesuniecie_z + 5);
		glRotated(przesuniecie_x, 0, 0, 1);
		glRotated(przesuniecie_y, 1, 0, 0);
		RenderScene();
	glPopMatrix();

poradziłem sobie z obrotem obiektu w taki sposób, teraz mam problem taki, aby samolot poruszał się w kierunku w którym jest obrócony zamiast ruchu cały czas do przodu.. czy mógłby mi ktoś pomóc ?

0

z obrotem i ruchem w kierunku obrotu sobie poradziłem, teraz chciałbym, żeby kamera była ustawiona cały czas za obiektem, nawet podczas obrotu i skrętu. Czy jest do możliwe ?

0

Przesunięcie kamery do tyłu to przesunięcie całego świata do przodu.
Ułatwieniem jest funkcja gluLookAt, ale można użyć zwykłego glTranslate/glRotate.

Jak zrobisz to przed pierwszym glPushMatrix, to każde glPopMatrix przywróci nie macierz jednostkową, tylko ustawioną przez ciebie kamerę.

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