OpenGL + obliczenia obrotów

0

mam mały problem z C++ pisze sobie grę w OpenGL , mam już funkcję określającą daną postać potrzebję zrobić coś takiego ze jak podchodzę do postacji na okteśloną odległość to on zaczyna cały atakować gracza cały czas zwrócona do niego.
Problem mam z tym zeby ta postać była cały czas zwrócona przodem go gracza

mam dane pozycja potworka

glTranslatef(MZombie.x, MZombie.y, MZombie.z);

Pozycja gracza

glTranslatef(g_Camera.m_vPosition.x, g_Camera.m_vPosition.y, g_Camera.m_vPosition.z);

Korzystam z takiego wzorku :

radius  = atanf((MZombie.x - MZombie.y) / (g_Camera.m_vPosition.x - g_Camera.m_vPosition.y)); 

a postać obracam tak

glRotatef(radius1,  0.0f, 0.0f,  -1.0f);

i wszystko jest ok tylko że dopóki gracz jest na wprost potworka. Wszystko się wali do momentu kiedy podchodzę do potworka od tyłu wtedy nic nie działa. Nie wiem gdzie mam błąd może on być banalny ale ja go niewidzę

//zmieniłem temat na jako taki lepszy - nie chciało mi się dumać nad ciekawszym - M

0

To wydaje sie bardziej skomplikowane niz wyglada - moim zdaniem musisz opracowac algorytm ktory bedzie sprawdzal na jakiej pozycji jest dana postac i twoje zombi... czy jak im tam. Pewne jest, ze nie da sie tego zalatwic w jednej linijce kodu...

a poza tym, cos nie bardzo mi pasuje ta linia:

glRotatef(radius1, 0.0f, 0.0f, -1.0f);

dlaczego obracasz postac w osi Z???

0
Ray napisał(a)

To wydaje sie bardziej skomplikowane niz wyglada - moim zdaniem musisz opracowac algorytm ktory bedzie sprawdzal na jakiej pozycji jest dana postac i twoje zombi... czy jak im tam. Pewne jest, ze nie da sie tego zalatwic w jednej linijce kodu...

a poza tym, cos nie bardzo mi pasuje ta linia:

glRotatef(radius1, 0.0f, 0.0f, -1.0f);

dlaczego obracasz postac w osi Z???

dlatego że postać porusza się cały czas w jednym kierunku przebywa odbległość około 100 jednostek i zawraca czyli porusza się po lini prostej ale zwrócona bokim do gracza cały mik polega na tym że jak znajdę się w pewnej odległości ma ona się obrócić przodem do gracza i poruszać się cały czas w jego kierunku ( co zrobiłem ) ale nie mogę zrobic tak żeby ona była cały czas obrócona do niego przodem. działa to tylko wtedy jak podczodzę do postaci przodem wtedy działa idealnie ale jak spróbuję ją "zajść od tyłu " to dupa nie działa

zwróciłeś uwagę na tę linijkę

glRotatef(radius,  0.0f, 0.0f,  -1.0f);

ona powoduje obrót postaci ale mam obiekcje co do ostatniego patametru dokładnie -1.0f

 jak dam 1.0f ( czyli wykonaj obrót  bo musi tak być żeby postać wykonała jakiś obrót) działa to dokładnie odwrotnie postać do której "podchodzę od tyłu" jest zwrócona do mnie przodem ale jak jestem do niej przodem to niedziała

ps
Dziekuję za edycję posta i zmianę tematu
0

moze ci pomoze cos takiego:
zdefiniuj sobie na twoim Zombim wektor normalny, tzn. prostopadly do jego powirzchnii
(czy Zombi to Billboard czy Objekt ???), obracaj wektor normalny n razem z Zombim,
(mnozenie przez odwrotna macierz transponowana, macierz zwroci Ci funkcja: glGet z argumentem GL_MODELVIEW_MATRIX),
w tym momencie kiedy Zombii zaczyna atakowac gracza,
mozesz wyliczac sobie wektor, do ktorego chesz obrocic Zombiego, nazwijmy go m,
czyli:

m = pozycja_gracza - pozycja_zombiego,

wylicz kat miedzy m i aktualnym wektorem normalnym n Zombiego,
i obroc odpowiednio Zombiego.

mam nadzieje, ze cos ci to da

0

Wolf, jesli Cie dobrze rozumiem, to zombie obrocony bokiem do gracza i TAK oznacza ze powinien byc obrocony na osi Y. Za to z kolei zastanawia mnie, ta linia:

radius = atanf((MZombie.x - MZombie.y) / (g_Camera.m_vPosition.x - g_Camera.m_vPosition.y));

patrzac na uklad wspolrzednych, to MZombie.y w tym wzorze jest jakos nie na miejscu, bo traktuje o polozeniu gora/dol - czy zamiast tego nie powinienes w tym miejscu skorzystac z osi Z czyli przod/tyl?

0
Ray napisał(a)

Wolf, jesli Cie dobrze rozumiem, to zombie obrocony bokiem do gracza i TAK oznacza ze powinien byc obrocony na osi Y. Za to z kolei zastanawia mnie, ta linia:

radius = atanf((MZombie.x - MZombie.y) / (g_Camera.m_vPosition.x - g_Camera.m_vPosition.y));

patrzac na uklad współrzednych, to MZombie.y w tym wzorze jest jakos nie na miejscu, bo traktuje o polozeniu gora/dol - czy zamiast tego nie powinienes w tym miejscu skorzystac z osi Z czyli przod/tyl?

Dzieki za odzew zombie jest objektem dokładnie modelem MD2 odnośnie wzoru tak jest tam pewien błąd już go poprawiłem powinno być tam z bo y to jest wysokość modelu tym wzorem ja obliczam właśnie kąt miedzi wektrorem gracza a wektorem potworka tylko coś mnie nie gra ponieważ jak podglądam sobie wartość zmiennej radius to jeżeli postać jest na przeciwko gracza to powinna być pod kątem 90stopni a jest pod kątem np 70 - 80 i niewiem dlaczego jak zmienie na zamiasy Z ->Y to kąt jest obliczany poprawnie nie wim co jest grane nie mogę po prostu znaleŹć błędu
kąt powinien wynosić 90 stopni chyba ?

loknijcie na screena http://img33.echo.cx/my.php?image=game8kc.jpg

0

hmm... jeszcze nie dotarlem do tego momentu w ktorym Ty jestes :) (na razie jestem na etapie pisania funkcji rysujacych bryly) :/

byc moze masz gdzies glupi blad w przypisaniu - moze gdzie przypisujesz parametr Z do Y - to sie przeciez zdarza

a kat faktycznie miedzy graczem a zombim w tym wypadku powinien byc 90stopni

zagladnij tez na opengl.org - na forum, tam jest wielu fachowcow ktorzy pewnie szybko rozwiaza ten problem

0
Ray napisał(a)

hmm... jeszcze nie dotarlem do tego momentu w ktorym Ty jestes :) (na razie jestem na etapie pisania funkcji rysujacych bryly) :/

byc moze masz gdzies glupi blad w przypisaniu - moze gdzie przypisujesz parametr Z do Y - to sie przeciez zdarza

a kat faktycznie miedzy graczem a zombim w tym wypadku powinien byc 90stopni

zagladnij tez na opengl.org - na forum, tam jest wielu fachowcow ktorzy pewnie szybko rozwiaza ten problem

prawdopodobnie masz racje ale ja tego niewidzę nie wiem gdzie jest błąd

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