🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.grafika.grafika3d
5 messages
5 total messages Started by bogdan.berg Sun, 02 Mar 2008 19:10
OpenGl, GLUT (gluLookAt)
#90016
Author: bogdan.berg
Date: Sun, 02 Mar 2008 19:10
35 lines
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)
#90017
Author: Tuthemess
Date: Mon, 03 Mar 2008 10:31
30 lines
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)
#90018
Author: GAD Zombie
Date: Mon, 03 Mar 2008 11:47
43 lines
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)
#90019
Author: bogdan.berg
Date: Mon, 03 Mar 2008 18:34
73 lines
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)
#90020
Author: GAD Zombie
Date: Tue, 04 Mar 2008 08:20
48 lines
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