Thread View: pl.comp.grafika.grafika3d
5 messages
5 total messages
Started by bogdan.berg
Sun, 02 Mar 2008 19:10
OpenGl, GLUT (gluLookAt)
Author: bogdan.berg
Date: Sun, 02 Mar 2008 19:10
Date: Sun, 02 Mar 2008 19:10
35 lines
2494 bytes
2494 bytes
Witam. Chcialbym napisac prosta aplikacje, w ktorej mozna byloby poruszac sie samolotem wzgledem osi x i z (czyli bez zmiany wysokosci). Do ustawienia kamery uzywam funkcji gluLookAt(cam_pos_x, cam_pos_y, cam_pos_z, cam_target_x, cam_target_y, cam_target_z, 0.0, 1.0, 0.0). Napotkalem problem w momencie zmiany kierunku poruszania, w ogolnosci przemieszczanie realizuje przez inkrementacje wspolrzednych zarowno polozenia kamery jak i "celu" na ktory patrzy dodajac do nich roznice wspolrzednych celu i kamery, tj: dx = cam_target_x - cam_pos_x; dz = cam_target_z - cam_pos_z; cam_pos_x += dx; cam_pos_z += dz; cam_target_x += dx; cam_target_z += dz; Problem pojawia sie w momencie zmiany kierunku (obrotu "celu" kamery wzgledem punktu w ktorym znajduje sie kamera). Jak moge obliczyc nowe wspolrzedne punktu na ktory skierowana jest kamera? Probowalem nastepujacej konstrukcji: cam_target_x = sin(kat_odchylenia); cam_target_z = cos(kat_odchylenia); Jednak nie spelnia to swojej funkcji. Nie wiem jak rozwiazac ten obrot... Chcialbym aby odbywal sie po okregu (tj. odleglosc celu kamery od pozycji kamery byla stala). Rozwazalem przeksztalcenia calej sceny (tj. pozostalych modeli) aby samolot pozostawal w centrum sprawiajac wrazenie przemieszczania sie, ale wolalbym pozostac przy rozwiazaniu z ustawianiem kamery, gdyz dzieki temu latwiej mi sie orientowac w przestrzeni :) Bede wdzieczny za pomoc.
Re: OpenGl, GLUT (gluLookAt)
Author: Tuthemess
Date: Mon, 03 Mar 2008 10:31
Date: Mon, 03 Mar 2008 10:31
30 lines
2254 bytes
2254 bytes
Witam! Nie znam tej funkcji i mogę się mylić, ale wg tego co zrozumiałem z Twojego opisu, kamera ma poruszać się po okręgu o stałym promieniu w którego środku jest cel, który zmienia położenie w płaszczyźnie na której jest okrąg. Przy takich założeniach, współrzędne celu równają się współrzędnym samolotu (czy innego obiektu na który "patrzy" kamera), a współrzędne kamery obliczamy względem położenia obiektu na podstawie wzoru: dx=sin(kąt patrzenia)*(ustalona przez Ciebie odległość);//lub dowolna wartość dz=cos(kąt patrzenia)*(ustalona przez Ciebie odległość);//lub dowolna wartość cam_pos_x = dx+obiekt_pos_x; cam_pos_z = dz+obiekt_pos_z; cam_target_x=obiekt_pos_x; cam_target_z=obiekt_pos_z; Na zdrowy rozum. Jeżeli mam cały czas patrzeć na dany przedmiot, to położenie celu spojrzenia musi równać się położeniu przedmiotu obserwowanego. Brak ruchu obserwatora skutkować będzie ewentualną zmianą kąta patrzenia i/lub odległości od obserowanego przedmiotu, ale obiekt jest cały czas widoczny. Obliczenie pozycji obserwatora poprzez dodanie stałej wartości do położenia obiektu spowoduje śledzenie obiektu. Tyle teorii :) Mam nadzieję, że pomogłem Pozdrawiam Andrzej S.
Re: OpenGl, GLUT (gluLookAt)
Author: GAD Zombie
Date: Mon, 03 Mar 2008 11:47
Date: Mon, 03 Mar 2008 11:47
43 lines
2551 bytes
2551 bytes
bogdan.berg@gmail.com pisze: > Witam. > Chcialbym napisac prosta aplikacje, w ktorej mozna byloby poruszac sie > samolotem wzgledem osi x i z (czyli bez zmiany wysokosci). Do > [...] To chyba nie do konca wlasciwa grupa dyskusyjna, jednak sprobuje pomoc, bo akurat zajmuje sie takimi rzeczami. Mam wrazenie, ze zabrales sie za to nie do konca od dobrej strony. Pomysl z ustawieniem samolotu w centrum ukladu jest dobry i czesto tak sie robi. Po pierwsze latwosc zmiany kierunku, po drugie dokladniejsze wartosci zmiennoprzecinkowe blizej srodka ukladu wspolrzednych niz dalej, z uwagi na sposob przechowywania floatow w pamieci. Jednak, jesli wolisz po swojemu, to ja zrobilbym tak: Zadefiniuj sobie pozycje X i Z kamery oraz kat patrzenia, np: glfloat x,z,kat; oraz stala odleglosc patrzenia od kamery (moze byc zmienna, jak wolisz): glfloat odleglosc = 10; //ta wartosc wbrew pozorom nie ma wielkiego znaczenia, moze wynosic np. 1 Pozniej w programie ustawiaj kamere w pozycji X i Z, a cel patrzenia obliczaj zawsze na nowo, czyli: glLookAt(x, 0, z, x+sin(kat*(pi/180))*odleglosc, 0 , z+cos(kat*(pi/180))*odleglosc, 0,1,0); I teraz: - kat mnozysz przez pi/180 (w zaleznosci od jezyka programowania zapisz to wlasciwie), bo sinusy praktycznie zawsze liczone sa w radianach, a nie w stopniach; no chyba, ze kat wolisz zapisywac w radianach, to mozesz pominac mnozenie - odleglosc w tym przypadku nie ma znaczenia, jak pisalem wyzej - cel patrzenia jest zawsze ustawiony na okregu o promieniu "odleglosc", a centrum okregu jest w pozycji kamery, wiec: kamera sie rusza i patrzy zawsze w ustalonym kierunku Mam nadzieje, ze to wystarczy Grzesiek
Re: OpenGl, GLUT (gluLookAt)
Author: bogdan.berg
Date: Mon, 03 Mar 2008 18:34
Date: Mon, 03 Mar 2008 18:34
73 lines
4491 bytes
4491 bytes
"Tuthemess" napisał: > Witam! > Nie znam tej funkcji i mogę się mylić, ale wg tego co zrozumiałem z Twojego > opisu, kamera ma poruszać się po okręgu o stałym promieniu w którego środku > jest cel, który zmienia położenie w płaszczyźnie na której jest okrąg. Dokladniej rzecz biorac chodzilo mi o to, iz polozenie kamery wyznaczalo srodek jej obrotu (tj. punkt na ktory patrzy poruszal sie po okreglu w ktorego srodku byla kamera) :) > Na zdrowy rozum. > Jeżeli mam cały czas patrzeć na dany przedmiot, to położenie celu spojrzenia > musi równać się położeniu przedmiotu obserwowanego. > Brak ruchu obserwatora skutkować będzie ewentualną zmianą kąta patrzenia > i/lub odległości od obserowanego przedmiotu, ale obiekt jest cały czas > widoczny. > Obliczenie pozycji obserwatora poprzez dodanie stałej wartości do położenia > obiektu spowoduje śledzenie obiektu. > Tyle teorii :) > Mam nadzieję, że pomogłem Dziekuje, rozjasnilo mi to pewne kwestie :) Dopiero zaczynam przygode z OpenGL i czasem gubie sie na podstawach... GAD Zombie napisał: > To chyba nie do konca wlasciwa grupa dyskusyjna, jednak sprobuje pomoc, > bo akurat zajmuje sie takimi rzeczami. Przepraszam jesli cos pomylilem ;) Teraz przyznaje, ze wiadomosc pasuje chyba bardziej do grupy dot. programowania, ale tym bardziej dziekuje za pomoc ktora tu otrzymalem. > Mam wrazenie, ze zabrales sie za to nie do konca od dobrej strony. > Pomysl z ustawieniem samolotu w centrum ukladu jest dobry i czesto tak > sie robi. Po pierwsze latwosc zmiany kierunku, po drugie dokladniejsze > wartosci zmiennoprzecinkowe blizej srodka ukladu wspolrzednych niz > dalej, z uwagi na sposob przechowywania floatow w pamieci. Rozumiem, jednak operowanie kamera, podczas gdy reszta wspolrzednych obiektow na scenie pozostaje stala ulatwia mi zapanowanie nad wszystkim, przykladowo gdybym teraz chcial aby samolot mogl odpalac rakiety, latwiej jest kontrolowac ich tor lotu gdy w ruchu jest kamera, a nie caly swiat :) Przynajmniej tak mi sie wydaje, a w kwestii OpenGL'a jestem poczatkujacy... > Jednak, jesli wolisz po swojemu, to ja zrobilbym tak: > Zadefiniuj sobie pozycje X i Z kamery oraz kat patrzenia, np: > glfloat x,z,kat; > oraz stala odleglosc patrzenia od kamery (moze byc zmienna, jak wolisz): > glfloat odleglosc = 10; //ta wartosc wbrew pozorom nie ma wielkiego > znaczenia, moze wynosic np. 1 > > Pozniej w programie ustawiaj kamere w pozycji X i Z, a cel patrzenia > obliczaj zawsze na nowo, czyli: > glLookAt(x, 0, z, > x+sin(kat*(pi/180))*odleglosc, 0 , z+cos(kat*(pi/180))*odleglosc, > 0,1,0); Bardzo dziekuje za pomoc! Pomoglo :) Jednak teraz zaczela mnie zastanawiac jeszcze jedna rzecz. Funkcje sin() i cos() bardzo dobrze sprawuja sie przy obliczaniu wspolrzednych w 2d. Jesli jednak chcialbym dodatkowo uzyskac obroty w osi Z (gora/dol), zachowujac staly odstep celu od kamery, to czy mozna to takze w jakis prosty i efektywny sposob rozwiazac? Sama modyfikacja wspolrzednej y celu kamery powoduje, iz wraz z pochyleniem gora/dol obiekt (rysowany w miejscu gdzie znajduje sie cel kamery) oddala sie badz przybliza - chcialbym uniknac takiego efektu. Jeszcze raz dziekuje obu Panom za pomoc :)
Re: OpenGl, GLUT (gluLookAt)
Author: GAD Zombie
Date: Tue, 04 Mar 2008 08:20
Date: Tue, 04 Mar 2008 08:20
48 lines
3392 bytes
3392 bytes
bogdan.berg@gmail.com pisze: > Przepraszam jesli cos pomylilem ;) Teraz przyznaje, ze wiadomosc > pasuje chyba bardziej do grupy dot. programowania, ale tym bardziej > dziekuje za pomoc ktora tu otrzymalem. Albo comp.graphics.api.opengl (po angielsku). > Rozumiem, jednak operowanie kamera, podczas gdy reszta wspolrzednych > obiektow na scenie pozostaje stala ulatwia mi zapanowanie nad > wszystkim, przykladowo gdybym teraz chcial aby samolot mogl odpalac > rakiety, latwiej jest kontrolowac ich tor lotu gdy w ruchu jest > kamera, a nie caly swiat :) Przynajmniej tak mi sie wydaje, a w > kwestii OpenGL'a jestem poczatkujacy... Rozumiem Cie, bo sam tez tak wole robic, ale sprobuj wyobrazic sobie calosc sceny w druga strone: Wszystkie obiekty nadal maja swoja pozycje, jak dotychczas, lecz na koniec zamiast przesunac kamere w jakies miejsce, przesuwasz CALA scene w inne miejsce, po wektorze przeciwnym do wektora pozycji kamery. Np. jesli kamera ma pozycje [10, 5, -1] to zostawiasz ja w pozycji [0,0,0], ale scene przesuwasz o [-10, -5, 1]. Tym sposobem na ekranie widzisz to samo, co po przesunieciu kamery. Jednak zauwaz roznice w obracaniu kamera. Wystarcza proste funkcje typu glRotatef(), by obrocic scene, wiec na ekranie jakbys obracal kamere. Oczywiscie to kwestia wygody i przyzwyczajen. > Bardzo dziekuje za pomoc! Pomoglo :) Jednak teraz zaczela mnie > zastanawiac jeszcze jedna rzecz. Funkcje sin() i cos() bardzo dobrze > sprawuja sie przy obliczaniu wspolrzednych w 2d. Jesli jednak > chcialbym dodatkowo uzyskac obroty w osi Z (gora/dol), zachowujac > staly odstep celu od kamery, to czy mozna to takze w jakis prosty i > efektywny sposob rozwiazac? Sama modyfikacja wspolrzednej y celu > kamery powoduje, iz wraz z pochyleniem gora/dol obiekt (rysowany w > miejscu gdzie znajduje sie cel kamery) oddala sie badz przybliza - > chcialbym uniknac takiego efektu. To zwyczajnie kwestia matematyki. Musisz uzaleznic pozycje X i Z celu od pozycji Y poprzez prosty cosinus. Niestety programowanie w 3D to w duuuzej czesci czysta matematyka i bedziesz musial sie z nia oswoic :). Ze sie pozwole nieco zareklamowac. Na mojej stronie gad.art.pl jest troche mojej roboty. Ostatnio zaczalem dorzucac programy i tutoriale. Mysle, ze na temat tych obrotow moglbym cos sklecic w wolnej chwili. pozdrawiam G.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads