Ĺadny brzuch
Chciałbym umieścić w moim progsie sterowanie myszą i
klawiaturą, które umożliwiałoby ruchy takie jak w FPS'ach,
np. Medal of Honor. Posuwanie się za pomocą klawiatury to
jeszcze nic, ale jak ustawić kamerę za pomocą funcji gluLookAt
lub za pomocą przekształceń, aby osiągnąć taki efekt?(obroty wokół osi y i x oczywiście)
PS
czy za pomocą DirectInput można dowiedzieć się, czy mysz dotarła do końca ekranu?
gluLookAt( A.x, A.y, A.z, B.x, B.y, B.z, 0, 1, 0 );
A - Pozycja obserwatora
B - cel patrzenia
Trzy ostatnie parametry są od oriętacji "gdzie jest góra" i radzę je ustawić na stałą wartość.
Mój kod sterowania widokiem za pomocą myszy:
UWAGA: Wymagany nagłówek windows.h!
void Mouse() { POINT mousePos; float modByX = 0; float modByY = 0; int mid_X = 800 >> 1; // Pozycja środka ekranu na szerokości. int mid_Y = 600 >> 1; // Pozycja środka ekranu na wysokości. GetCursorPos(&mousePos); //Obecna pozycja kursora. SetCursorPos(mid_X, mid_Y); //Nowa pozycja kursora (na środku) // Wyliczanie o ile było posunięcie od środka ekranu (0.06 to o ile // ZMNIEJSZYĆ wynik (bo jest za duży jak na kąt)) modByX = ((float)mousePos.x - (float)mid_X) * 0.06f; modByY = ((float)mousePos.y - (float)mid_Y) * 0.06f; // dodanie wartości do zmiennych globalnych theta += modByX; beta += modByY; // wyliczenie celu patrzenia na podstawie kąta (look jest strukturą) look.x = 2 * sin(Pi / 180 * -theta); look.z = 2 * cos(Pi / 180 * theta); look.y = 2 * cos(Pi / 180 * -beta); }
Funkcje najlepiej wywołać w każdej klatce przed procesem renderingu.
I am the REAL Noname
Moja strona: www.coderulers.prv.pl | Moje Forum
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg." - Bjarne Stroustrup, twórca języka C++
THX, to działa, ale:
dodałem x i y, które oznaczają położenie obserwatora(zmieniane
klawiaturą), aby zapobiec "okrążania" początku współrzędnych
look.x = x+(2 * sin(Pi / 180 * -theta));
look.z = z+(2 * cos(Pi / 180 * theta));
look.y = 2 * cos(Pi / 180 * -beta);
Teraz(zresztą przedtem też) występuje największy błąd:
jeśli np. obrócę się w prawo i chcę iść do przodu, to
"kamera" porusza się do ujemnej wartości z(zamiast w skazanym
kierunku). Podobnie problem jest z osią x. Co zrobić, aby temu zapobiec?
Zamiast męczyć się z kodem,lepiej użyć pakietu GLScene ( http://glscene.org ).:cheesy:
Jest on o wiele prostszy ;)
Zasady są po to,aby je łamać... :crowd:
Tel.: 506 625 248
E-mail: patryknusbaum@interia.pl
GG: 1132996
Nie, ja chcę zrrobić wszystko sam, żeby później mieć pełną świadomość że to moe dzieło:cheesy:
cytat:gokudbz napisał:
Nie, ja chcę zrrobić wszystko sam, żeby później mieć pełną świadomość że to moe dzieło:cheesy:
APLAUZ :aplause: za chęci dla gokudbz :! :cheesy:
Skoro tak,to ja nie potrafię Ci pomóc :roll:
Zasady są po to,aby je łamać... :crowd:
Tel.: 506 625 248
E-mail: patryknusbaum@interia.pl
GG: 1132996
Masz tu coś, co prawda w delphi, ale myślę, że sobie poradzisz :Dhttp://www.cyrkiel.webpark.pl/ce.zipjest tu poruszanie się, obsługa myszy i celowanie ;)
--------------------
-=[ Delphi rUlzZz ]=-
No cóż, kodu na poruszanie nie podam, bo jest wbudowany w moją klasę "żyjątek", ale powiem, że można to wyliczyć IDENTYCZNIE jak w przypadku widoku. Ja to zrobiłem tak, że look jest wstawiany do klasy gracza jako wektor, a przy ruchu składowe wektora są dodawane do pozycji gracza (bez Y, bo jeszcze podłogi nie zrobiłem). Dlatego w moich obliczeniach zabrakło pozycji gracza - jest ona dodawana przy wywołaniu funkcji gluLookAt. Pewnie zauważyłeś, że wynik pozycji look przemnażam przez 2 - to jest o ile ma się poruszać bochater w każdą stronę. Mam nadzieje, że ci to pomoże
I am the REAL Noname
Moja strona: www.coderulers.prv.pl | Moje Forum
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg." - Bjarne Stroustrup, twórca języka C++
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
klawiaturą, które umożliwiałoby ruchy takie jak w FPS'ach,
np. Medal of Honor. Posuwanie się za pomocą klawiatury to
jeszcze nic, ale jak ustawić kamerę za pomocą funcji gluLookAt
lub za pomocą przekształceń, aby osiągnąć taki efekt?(obroty wokół osi y i x oczywiście)
PS
czy za pomocą DirectInput można dowiedzieć się, czy mysz dotarła do końca ekranu?
gluLookAt( A.x, A.y, A.z, B.x, B.y, B.z, 0, 1, 0 );
A - Pozycja obserwatora
B - cel patrzenia
Trzy ostatnie parametry są od oriętacji "gdzie jest góra" i radzę je ustawić na stałą wartość.
Mój kod sterowania widokiem za pomocą myszy:
UWAGA: Wymagany nagłówek windows.h!
void Mouse() { POINT mousePos; float modByX = 0; float modByY = 0; int mid_X = 800 >> 1; // Pozycja środka ekranu na szerokości. int mid_Y = 600 >> 1; // Pozycja środka ekranu na wysokości. GetCursorPos(&mousePos); //Obecna pozycja kursora. SetCursorPos(mid_X, mid_Y); //Nowa pozycja kursora (na środku) // Wyliczanie o ile było posunięcie od środka ekranu (0.06 to o ile // ZMNIEJSZYĆ wynik (bo jest za duży jak na kąt)) modByX = ((float)mousePos.x - (float)mid_X) * 0.06f; modByY = ((float)mousePos.y - (float)mid_Y) * 0.06f; // dodanie wartości do zmiennych globalnych theta += modByX; beta += modByY; // wyliczenie celu patrzenia na podstawie kąta (look jest strukturą) look.x = 2 * sin(Pi / 180 * -theta); look.z = 2 * cos(Pi / 180 * theta); look.y = 2 * cos(Pi / 180 * -beta); }
Funkcje najlepiej wywołać w każdej klatce przed procesem renderingu.
I am the REAL Noname
Moja strona: www.coderulers.prv.pl | Moje Forum
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg." - Bjarne Stroustrup, twórca języka C++
THX, to działa, ale:
dodałem x i y, które oznaczają położenie obserwatora(zmieniane
klawiaturą), aby zapobiec "okrążania" początku współrzędnych
look.x = x+(2 * sin(Pi / 180 * -theta));
look.z = z+(2 * cos(Pi / 180 * theta));
look.y = 2 * cos(Pi / 180 * -beta);
Teraz(zresztą przedtem też) występuje największy błąd:
jeśli np. obrócę się w prawo i chcę iść do przodu, to
"kamera" porusza się do ujemnej wartości z(zamiast w skazanym
kierunku). Podobnie problem jest z osią x. Co zrobić, aby temu zapobiec?
Zamiast męczyć się z kodem,lepiej użyć pakietu GLScene ( http://glscene.org ).:cheesy:
Jest on o wiele prostszy ;)
Zasady są po to,aby je łamać... :crowd:
Tel.: 506 625 248
E-mail: patryknusbaum@interia.pl
GG: 1132996
Nie, ja chcę zrrobić wszystko sam, żeby później mieć pełną świadomość że to moe dzieło:cheesy:
cytat:gokudbz napisał:
Nie, ja chcę zrrobić wszystko sam, żeby później mieć pełną świadomość że to moe dzieło:cheesy:
APLAUZ :aplause: za chęci dla gokudbz :! :cheesy:
Skoro tak,to ja nie potrafię Ci pomóc :roll:
Zasady są po to,aby je łamać... :crowd:
Tel.: 506 625 248
E-mail: patryknusbaum@interia.pl
GG: 1132996
Masz tu coś, co prawda w delphi, ale myślę, że sobie poradzisz :Dhttp://www.cyrkiel.webpark.pl/ce.zipjest tu poruszanie się, obsługa myszy i celowanie ;)
--------------------
-=[ Delphi rUlzZz ]=-
No cóż, kodu na poruszanie nie podam, bo jest wbudowany w moją klasę "żyjątek", ale powiem, że można to wyliczyć IDENTYCZNIE jak w przypadku widoku. Ja to zrobiłem tak, że look jest wstawiany do klasy gracza jako wektor, a przy ruchu składowe wektora są dodawane do pozycji gracza (bez Y, bo jeszcze podłogi nie zrobiłem). Dlatego w moich obliczeniach zabrakło pozycji gracza - jest ona dodawana przy wywołaniu funkcji gluLookAt. Pewnie zauważyłeś, że wynik pozycji look przemnażam przez 2 - to jest o ile ma się poruszać bochater w każdą stronę. Mam nadzieje, że ci to pomoże
I am the REAL Noname
Moja strona: www.coderulers.prv.pl | Moje Forum
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg." - Bjarne Stroustrup, twórca języka C++