W mojej grze mam obiekty, które poruszają się szybciej o 45 stopni niż o 90 stopni.
Każdy obiekt ma
- Pozycja punktu (x, y)
- Kierunek Vector2D (x, y)
- Int prędkość
A podczas aktualizacji robię to, że nowa pozycja jest obliczana jako:
position.x += direction.x * speed
position.y += direction.y * speed
Jak to naprawić? Chcę, aby poruszał się z tą samą prędkością pod dowolnym kątem.
Odpowiedzi:
Można to wyjaśnić twierdzeniem Pitagorasa , który jest następującą formułą:
W twoim przypadku, kiedy poruszasz się w prawo, używasz (x: 1, y: 0), co daje nam
Poruszając się w górę i w prawo używasz (x: 1, y: 1), co daje nam
Jak widać, długość po przekątnej jest dłuższa niż długość na osiach kardynalnych.
Jak wspomnieli inni, należy po prostu znormalizować wektor kierunku. Jeśli używasz XNA, robi się to tak:
źródło
Przed użyciem należy znormalizować wektor kierunku.
Jak wyjaśniono w MindWorX, można to po prostu zrozumieć, jeśli martwiąc się o swoje wektory kierunkowe, które mogą wywoływać u Ciebie żal, upewnij się, że są to wektory jednostkowe (wielkość / długość 1).
Jeśli znormalizowany:
źródło
Jak obliczasz swój kierunek? Jeśli 45 stopni to
(1,1)
, to na pewno będzie szybciej niż 90 stopni(1,0)
.Sugeruję użycie czegoś takiego:
Aby uzyskać kąt w radianach, musisz pomnożyć swoje stopnie,
PI / 180
a nawet lepiej, użyćMathHelper
. Na przykład.źródło
Jason,
Zamiast mieć trzy atrybuty obiektu,
często o wiele łatwiej jest połączyć kierunek i prędkość w wektor prędkości. Masz tylko dwa atrybuty,
Aktualizacja pozycji
Gdy musisz zaktualizować pozycję obiektu, jest to tak proste, jak:
gdzie
Δt
jest twoja delta czasu - lub różnica czasu - lub krok czasu.Aktualizacja pozycji i prędkości
W ten sposób jest również bardzo łatwo poradzić sobie z przyspieszeniem (np. Grawitacyjnym). Jeśli masz wektor przyspieszenia, możesz zaktualizować prędkość i położenie razem w następujący sposób:
(Jest to w zasadzie wzór s = vt + ½at² z fizyki 101.)
Stosowanie prędkości
Jeśli chcesz zastosować określoną prędkość w jakimś znormalizowanym kierunku, możesz ustawić prędkość w następujący sposób:
Wyprowadzanie prędkości
A jeśli potrzebujesz zrobić odwrotność - wyprowadzając prędkość i kierunek z danego wektora prędkości - możesz po prostu użyć twierdzenia Pitagorasa lub
.Length()
metody:A gdy prędkość jest znana, znormalizowany kierunek można obliczyć, dzieląc prędkość przez prędkość (uważając, aby nie podzielić przez zero):
źródło