Obliczanie wektora przesunięcia

0

Witam. Pytanie dość nietypowe, choć wydaje mi się że porusza dość popularny problem w większości grach. Również jest ono czysto matematyczne, ale uznałem że napiszę tutaj, bo najlepiej chyba zrozumieją mnie programiści. Do rzeczy - robię grę, w której głównym światem jest płaszczyzna 2d. Traktowana jest ona zatem jak zwykły układ współrzędnych z osiami x i y, z tym, że y rośnie w dół, a nie w górę, jak jest to w matmie. Na tej płaszczyźnie umieszczony jest statek. Ma on kształt zbliżony do trójkąta równoboczny, potraktujmy go zatem jak trójkąt równoboczny. Podczas gry może on się dowolnie obracać. Jeden z jego wierzchołków stanowi jego przód. Ma on się poruszać przed siebie. I teraz dochodzimy do clue sprawy - mając dany kąt obrotu (przez przód statku i środek jego boku niesąsiadującego z wierzchołkiem, stanowiący przód przebiega linia pomocnicza, która przecina oś OY, tworząc z nią kąt, który mam dany (nie bierzcie pod uwagę, gdy statek jest ustawiony pionowo, a linia jest równoległa do OY, z tym nie mam problemu)), muszę wyznaczyć wektor przesunięcia statku na tej płaszczyźnie T [x,y], zakładając, że statek ma się przesunąć, np. 5m przed siebie. Wiem, że aby móc programować należy dobrze umieć matmę, staram się cały czas uczyć w przód, ale jestem jeszcze stosunkowo młody (wielu rzeczy jeszcze się nie robiło w szkółce a na własną rekę, przy ograniczonym czasie i braku pomocy też trudno ogarnąć wszystko) i paru rzeczy jeszcze nie znam. Chcę sam rozwiązać ten problem, więc nie proszę o dokładne rozwiązanie lub wzór, a jedynie nakierowanie w jakim dziale matematyki szukać odpowiedzi. Z góry bardzo dziękuję za każdą pomoc :)

3

Dlaczego y rośnie w dół? Zarówno w "matmie", jak i w normalnych silnikach y rośnie w górę.

Jeśli y rośnie normalnie w górę, to mając dany kąt określający kierunek β, wektor przesunięcia T o dystans d liczymy tak:

T.x = cos(β) * d;
T.y = sin(β) * d;

Przód statku musi być po prawej stronie. Jak w układzie współrzędnych kąt 0 stopni.

Jeśli y rośnie w dół, to chyba taki zapis zadziała:

T.x = cos(β) * d;
T.y = -sin(β) * d;

Chociaż trzeba by się nad tym głębiej zastanowić, bo skoro y rośnie w złą stronę, to może obrót obiektu, również działa odwrotnie?

Zmniejszanie kąta obrotu obraca Twój obiekt zgodnie ze wskazówkami zegara (prawidłowo), czy odwrotnie?

0

@Spine: Dzięki bardzo za odpowiedź. Co do tego y to być może w większości silników rzeczywiście tak jest, ale teraz w szkole babramy się z SFML, a tam OY rośnie w dół. Też dla mnie dziwne ale tak jest :I. Odpowiadając na twoje pytanie odnośnie obrotu to tak, zmniejszanie kąta obrotu powoduje obrót zgodnie ze wskazówkami zegara.

1
Spine napisał(a):

Dlaczego y rośnie w dół? Zarówno w "matmie", jak i w normalnych silnikach y rośnie w górę.

y rośnie w dół wszędzie w podejściu programistycznym tam gdzie mamy reprezentację 2D a nie 3D. Wynika to z faktu, że piksele w pamięci komputera ułożone są liniowo, więc należało przyjąć jakąś konwencję, gdzie jest pierwszy piksel i jak je liczyć, więc przyjęto, że są ułożone rzędami od góry, jak tekst w książkach, a lewy górny jest pierwszy.

Jeśli y rośnie normalnie w górę, to mając dany kąt określający kierunek β, wektor przesunięcia T o dystans d liczymy tak:

T.x = cos(β) * d;
T.y = sin(β) * d;

Przyjmując opis autora, to raczej:

T.x = sin(β) * d;
T.y = cos(β) * d;

screenshot-20211007091148.png

0

Strasznie ciężko zrozumieć o co pytasz i gdzie leży problem, więc parafrazuję:

  • masz statek kosmiczny który ma swoją pozycję, kurs prędkość
  • chcesz znać pozycję na której się znajdzie o upływie jakiegoś czasu

Przechowujesz sobie prędkość jako skalar, podczas gdy w fizyce jest to wartość wektorowa i to chyba jest źródło twoich problemów. Co gdyby zamiast przechowywać prędkość statku jako wektor v=[X, Y] zamiast jako kąt + norma (długość) wektora?

Czyli masz pozycję P->=[x, y] (wektor od punktu 00, do pozycji, masz prędkość V->=[dx, dy] wszystko co trzeba zrobić to pomnożyć skalarnie t*V-> i dodać do P->, czyli Pk-> = V->*t+Pp-> gdzie małe p i k to odpowiednio początek i koniec.

Pozostanie ci problem jak z wektora prędkości policzyć kurs w celu wyświetlenia odpowiednio zrotowanego statku, ale z tym sobie raczej poradzisz.

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