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 :)
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?
@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.
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ęciaT
o dystansd
liczymy tak:T.x = cos(β) * d; T.y = sin(β) * d;
Przyjmując opis autora, to raczej:
T.x = sin(β) * d;
T.y = cos(β) * d;
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.