Warsztat.GD

Programowanie => Matematyka i fizyka => Wątek zaczęty przez: Jam_Pawian w Maj 24, 2009, 14:51:09

Tytuł: Problem z kierunkiem poruszania postaci
Wiadomość wysłana przez: Jam_Pawian w Maj 24, 2009, 14:51:09
Witam.

Wiem, że te problemy pojawiały się już często i przepatrzyłem forum, ale nie znalazłem rozwiązania mojego problemu.
Mam zrobić poruszanie się postaci po krzywej Beziera, co się sprowadza do wędrówki do kolejnych punktów. Problemy są 2.

1. Postaci zdarza się iść tyłem.
2. Postać znika na początku i na końcu trasy.


A robię to tak. Najpierw wyznaczam cele, które zapisuje w tablicy wektorów Cel[10].
Potem każę mu iść do następnego celu i czekam aż tam dojdzie.

Później obracam go w stronę celu (to szwankuje) i wysyłam go w drogę:

bool CMD2Model::Przemieszczenie_automat(CVector Cel) //Jeśli dotrze do zadanego celu (CVector Cel), to zwraca true
{

CVector Kierunek= Cel - position; //Tworzenie wektora, który jest różnicą położenia wózka i jego celu
Kierunek.Normalize();             //Normalizacja

//Obrócenie w stronę celu
direction= RAD2DEG(asin((Cel.z - position.z) / (Cel.x - position.x)));


if((position.x >= Cel.x - 5 && position.x <= Cel.x + 5) && (position.z >= Cel.z - 5 && position.z <= Cel.z + 5)) //Gdy dotarł do celu, to wyznacz kolejny cel
{
return true;
}

else
{
position.x += Kierunek.x;
position.z += Kierunek.z;
}



}



A tak wygląda rysowanie postaci:

glPushMatrix();
   
   glTranslatef(dresu->Zwroc_X(), dresu->Zwroc_Y(), dresu->Zwroc_Z());  //Przemieszcza się do pumktu o współrzędnych rysowanego obiektu
   glRotatef(-dresu->direction + 90.0, 0.0, 1.0, 0.0);
   glRotatef(270.0f, 0.0f, 0.0f, 1.0f);
   dresu->Animate(39, 80, 0.5);

glPopMatrix();


Wydaje mi się, że coś jest nie tak ze zmienną direction, ale nie wiem co. Próbowałem długo, ale nie dałem rady i proszę o pomoc :)

Z góry dzięki.
Tytuł: Odp: Problem z kierunkiem poruszania postaci
Wiadomość wysłana przez: Haxy.M w Maj 24, 2009, 15:22:42
Po pierwsze uzycie funkcji asin nie jest tu może najlepszym pomysłem, poczytaj o funkcji atan2. Po drugoie taka uwaga, że Twoja metoda nie zawsze zwraca warość, zakaładam, że jak nie dotrze do celu to powinna zwracać false, co sugerowaloby, że na samym końcu powinno byc jeszcze return false. I trzecia taka uwaga czyso kosmetyczna: Używanie takich "magicznych wartosci" na dłuższą metę bardzo utrudnia. Spróbuj dodać jakąs zmienną powiedzmy eps, którą w razie potrzeby będzieszmógł zmienić nie przerabiając całego kodu.
if((position.x >= Cel.x - eps && position.x <= Cel.x + eps) && (position.z >= Cel.z - eps && position.z <= Cel.z + eps))
Ale to tylko kosmetyka ;)
Tytuł: Odp: Problem z kierunkiem poruszania postaci
Wiadomość wysłana przez: Jam_Pawian w Maj 24, 2009, 16:45:54
Wielkie dzięki stary

Użycie funkcji atan2 rozwiązało wszystkie problemy. I masz w sumie rację z tą kosmetyką. Ładniej to nawet wygląda :).