Autor Wątek: Rotacja  (Przeczytany 2558 razy)

Offline sentes

  • Użytkownik

# Grudzień 17, 2006, 19:41:08
Chciałbym zrobić takie coś żeby postać była skierowana w strone myszki i tak sobie myślałem, że można to zrobić tak:
taki pseudo kodzik:
a = y/x // bo b jest równe 0
while(a == tg(alfa))
{
     //tutaj kod który by robił potrzebne operacje i wyznaczał kąt
}
No i teraz pytanie czy nie da się tego zrobić łatwiej, bo to by marnowało dużo czasu procka, a jak nie to jaki powinien być ten kod
w pętli żeby nie zabierał jego tak dużo  ;)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xion

  • Redaktor
    • xion.log

# Grudzień 17, 2006, 19:56:44
Poczytaj o funkcji atan2() [1] - robi mniej więcej to, co jest ci potrzebne.

[1] http://www.cplusplus.com/ref/cmath/atan2.html

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Grudzień 18, 2006, 13:55:18
Po pierwsze, popełniasz bardzo częsty błąd początkujących - chcesz wyznaczyć kąt. Tymczasem w praktyce bardzo rzadko używa się kąta, najczęściej kierunek reprezentuje się za pomocą wektora (X,Y) wskazującego w odpowiednią stronę i znormalizowanego do długości 1, żeby znaczenie miał sam jego kierunek a nie długość.

Wtedy taki wektor możesz policzyć tak:

Kierunek.x = Myszka.x - Ludzik.x;
Kierunek.y = Myszka.y - Ludzik.y;
Kierunek.Normalizuj();

Jeśli jednak upierasz się przy liczeniu kąta, to rozwiązaniem jest funkcja arcus tangens, czyli atan. Kąt (w radianach! mam nadzieję że nie używasz stopni - to też częsty błąd początkujących) wychodzi z policzenia atan(y/x), gdzie X i Y to odpowiednio różnice pozycji myszki i ludzika, tak jak w przykładzie wyżej. Ponieważ to jest częsta operacja, to wiele języków programowania ma ją wbudowaną w postaci funkcji o nazwie atan2, która przyjmuje osobno X i Y (w różnej kolejności - sprawdź w dokumentacji swojego języka) i przy okazji sama zabezpiecza się przed dzieleniem przez 0 (chyba...).

Offline cienio

  • Użytkownik

# Grudzień 18, 2006, 16:12:13
No i atan zwróci ci wartośc kąta z przedziału [-Pi/2,Pi/2]  więc będziesz musiał jeszcze sprawdzac znaki x i y.Zrób tak jak Regedit rzekł.
Pozdrawiam.

Offline Xion

  • Redaktor
    • xion.log

# Grudzień 18, 2006, 20:40:33
atan2() zwraca wartość z [-pi;pi].

Offline cienio

  • Użytkownik

# Grudzień 18, 2006, 22:39:12
Zobacz! Nie wiedziałem o atan2.

zerlo

  • Gość
# Grudzień 19, 2006, 17:30:30
Witam. Mialem nie dawno taki sam problem, ale skorzystalem z innego rozwiazania, a bardzo intryguja mnie te wektory. Jako, ze temat podobny postanowilem spytac sie tutaj zamiast zakladac nowego. Mysle, ze Autor sie nie obrazi ( wyglada na to, ze juz sobie poradzil ). Jak sprawdzic w jaka strone on jest zwrocony? Przyklad
mysz.x = 100;
mysz.y = 100;
hero.x = 48;
hero.y = 15;

dir.x = mysz.x - hero.x; //100 - 48 = 52
dir.y = mysz.y - hero.y;  //100 - 15 = 85

Czyli pwostal nam wektor (52, 85). Teraz go normalizujemy:
dir.dlugosc = sqrt( x*x + y*y ) ; // pierwiastek z sumy kwadratow x i y; dir.dlugosc = ~100;
dir.normalizuj(); // dir.x = 52 / 100 = 0.52; dir.y = 85 / 100 = 0.85
No i mam znormalizowany wektorek. Wszystko ladnie i pieknie. Tylko, ze... nie wiem co robic dalej. Wiem, wiem wstyd, ale dla tego wlasnie pytam. Zawsze porszalem obiekty w grze po prostu dodajac do x i y jakies wartosci. Nigdy nie uzywalem wektorow do poruszania sie ( o ile tak mozna ;) ). Zreszta gdzie mialbym to robic? W pongu (moj jedyny dokonczony projekt ^-^... i tak ma bledy)?  Dziekuje za przeczytanie posta. ;)

Offline counterClockWise

  • Użytkownik

# Grudzień 19, 2006, 18:10:56
Jak sprawdzic w jaka strone on jest zwrocony?

Wait, wait, wait. Podstawowa informacja jaka niesie ze sobą wektor to właśnie w jaka strone jest zwrócony. Masz implicite jego zwrot. Np. wektor (0,0,1) w prostokatnym układzie współrzędnych (x,y,z) jest zwrócony wzdłuż osi Z; wektor (0,0,-1) jest zwrócony w przeciwną stronę niż oś Z; wektor nieznormalizowany (124,24,53) jest zwrócony wdłuż wektora (124,24,53) :D. Zwrot, to cecha wektora którą przynajmniej w E^2, E^3 widać gołym okiem.
Inne cechy jak np. długość musisz już sobie policzyć biorąc jakąś normę - przeważnie drugą (euklidesową) czyli pierwiastek sumy kwadratów współrzędnych. 

A jak użyć wektorów do poruszania się? Jak tylko chcesz. Możesz przechowywać trzy wektory jak w DirectX - (Up, LookAt, Eye) i napisać interfejs sterowany nimi.
Do prostego poruszania się możesz trzymać wektor kierunku V i wykorzystać wektorowe równanie prostej. P(x) = Xo + V*alfa. (P(x) - punkt na prostej; Xo - punkt startowy; V - wektor kierunku; alfa - krok). W końcu w każdym momencie ruchu V można potraktować jako wektor styczny do toru i tym samym całą drogę jako kawałkami (chwilami) liniową - ciąg zmieniających się wektorów stycznych.
« Ostatnia zmiana: Grudzień 19, 2006, 18:15:34 wysłana przez counterClockWise »

Offline cienio

  • Użytkownik

# Grudzień 19, 2006, 19:55:37
Pierwsze co powinieneś zrobić to napisać lub zciągnąć z sieci bibliotekę do wektorów.Tam będziesz miał przeciażone operatory do dodawania wektorów, mnożenia skalarnego, wektorowego itd.
Zamiast pisać:
dir.x = mysz.x - hero.x;
dir.y = mysz.y - hero.y;
napiszesz:
dir=mysz-hero
Jak się definiuje predkość?  V=delta x/ delta t  gdy   delta t->0. :   V, delta x - wektory( V-prędkość, delta x - przyrost położenia )

Wiadomo że na kompie delta t nie dąży do zera ale jest wystarczająco małe żeby z dobrym przybliżeniem stosowac ten wzór.

Czyli masz delta x=V* delta t.  Jak znasz V i delta t to wiesz ile się zmieniło połozenie bo: x=x+delta x

Zostało wyznaczyc V:
Jak znalazłeś wektor znormalizowany (dir) i masz wartośc prędkości (|V|)  to V=|V| *dir.

Ps. Poczytaj o wektorach jak się dodaje ,mnoży  no i co to wogóle jest ten wektor.



zerlo

  • Gość
# Grudzień 19, 2006, 21:13:05
Dzieki. :)

Juz rozumiem, musialem sie troche ( duzo ) doksztalcic. Nie za bardzo rozumialem o co chodzi z tymi wektorami. Wydawalo mi sie, ze potrzeba co najmniej 4 punktow. Ale doczytalem i okazalo sie, ze wektory zaczynaja sie na (0;0) wiec wszystko jasne. Kurcze, a ja sie meczylem z ruchem. Teraz tylko musze sie dowiedziec dokladnie co to "arcus tangens"(wiki, wiki, wiki...) bo jak na razie wiem, ze dziala, ale nie wiem czemu. Naprawde jeszcze raz wielkie dzieki!

Offline sentes

  • Użytkownik

# Grudzień 19, 2006, 22:33:57
Z tą rotacją to już zrobiłem po poście Xiona ale teraz przeczytałem odpowiedz Regedita.
Piszesz żeby wyznaczyc wektor i znormalizowac no ale co mi da ten wektor jak w XNA parametr w funkcji rysującej rotation to kąt??
chyba, że ci chodzi o to by ten znormalizowany wektor do atan2 podstawić ale ogólnie wyjdzie to samo

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Grudzień 20, 2006, 16:19:31
Jeśli już faktycznie potrzebujesz kąta to owszem, musisz sobie go policzyć za pomocą atan2 z wektora od pozycji ludzika do pozycji kursora - niekoniecznie znormalizowanego, bo jego długość nie ma znaczenia (i tak liczy się atan z y/x).

Natomiast przesuwać z użyciem wektor to właśnie najfajniejsze co można z nim robić, bo jeśli wektor wyobrażamy sobie jako strzałeczkę, to taka strzałeczka przystawiona do wybranego punktu pokaże do którego miejsca go przesunąć w takim kierunku i o taką odległość, jaki kierunek i jaką długość ma ten wektor. Jeśli wektor jest znormalizowany, to liczy się w nim tylko kierunek i mnożąc go przed dodaniem do punktu przez liczbę sam ustalasz, o jaką odległość przesunąć ten punkt.

Dodawanie punktu do wektora polega na dodaniu do siebie odpowiednich składowych X i Y. Pomnożenie wektora przez liczbę to po prostu pomnożenie każdej jego składowej X,Y przez tą liczbę.

Jest tu jeszcze taka sprawa, ważna a często pomijana, że punkt a wektor to dwa różne obiekty matematyczne. Punkt reprezentuje pozycję na płaszczyźnie i wyobrażany jest jako kropeczka/kółeczko, a wektor reprezentuje kierunek i długość, czyli jakby przekształcenie do punktów (funkcję przekształcającą punkty) i wyobrażany jest jako strzałeczka, którą można zaczepić do czego się chce. Natomiast jako że obydwa te obiekty mają po dwie składowe liczby - X i Y - to w programowaniu są reprezentowane praktycznie zawsze z użyciem jednej i tej samej struktury - jakieś D3DXVECTOR2, jakieś własne VEC2 czy coś takiego...

A jak działa funkcja arcus tangens, jaki ma kształt jej wykres i skąd się wzięła wcale nie musisz wiedzieć i w pełni rozumieć, żeby z niej korzystać. Wystarczy że wiesz, do czego służy i jak jej używać.
« Ostatnia zmiana: Grudzień 20, 2006, 16:21:03 wysłana przez Regedit »