2012-11-05 20 views
19

Tworzę grę z LibGDX (Java).Jak wykonać płynny algorytm śledzenia kamery?

Potrzebuję aparatu, aby śledził szybko poruszającą się postać. Najprostszym sposobem na to jest po prostu napisać to:

this.getCamera().position.set(obj.x, obj.y, 0); 

Ale jest jakiś algorytm, aby to bardziej gładka? Podobnie jak wtedy, gdy kamera nie jest tak surowa i zawsze jest trochę za późno: postać idzie szybko w prawo, kamera podąża z niewielkim opóźnieniem, lub jeśli nagle pojawi się gdzieś daleko, kamera nie teleportuje się natychmiast, ale podróżuje z maksymalną prędkością, kiedy podchodzi bliżej, zwalnia i odnajduje cię ponownie.

Czy są jakieś biblioteki libgdx, które robią to lub ktoś ma takie doświadczenie?

+0

"* Ale czy istnieje algorytm, który uczyniłby to bardziej płynnym? *" Czy wypróbowałeś już jakieś algorytmy lub zrobiłeś wyszukiwania w Google w celu uzyskania płynnej interpolacji kamery? –

+1

Próbowałem go na własną rękę i mam kilka przykładów pracy, ale nie podoba mi się wynik, byłem ciekawy, może być coś, co już jest wymyślone, ponieważ brzmi jak coś, czego każdy deweloper gry będzie potrzebował. Jeśli chodzi o wyszukiwanie w Google, nie jestem pewien co szukać, przynosi mnóstwo innych rzeczy. –

Odpowiedz

6

Spójrz na Aurelion Ribon's Java Universal Tween Engine. Wykonuje interpolację i ma kilka łagodnych równań, które według mnie dadzą ci to, czego szukasz. Posiada również inne zaawansowane funkcje, takie jak określanie waypointów i łączenie określonych działań w celu uzyskania innych interesujących efektów.

Twoja logika gry może sprawdzić, czy postać porusza się szybko, czy ma skokową zmianę pozycji. W odpowiedzi na to, zmień swoją aktualną pozycję kamery na silnik animacji i pozwól mu to przejąć - płynne powiększanie do aktualnej pozycji postaci.

+0

Tylko dla rekordu (zdaję sobie sprawę, że było to jakiś czas temu) nie, nie chciałbyś używać do tego silnika, ponieważ postać gry jest zawsze w ruchu i podatna na zmiany kierunkowe sterowane przez użytkownika. Napowietrzne uruchamianie i zabijanie animacji nie ma sensu. Po prostu użyj algorytmu lerp powyżej w wywołaniu upd (delta). To oznacza, że ​​UTE doskonale nadaje się do innych przejść, a nawet do przesuwania aparatu w inne rzeczy niż podążanie za główną postacią gry. – RichieHH

+0

Nie zgadzam się. Chociaż nie przeprowadziłem analizy czasowej, animacje są łączone, więc wpływ uruchamiania i zabijania powinien być minimalny. Przypisanie nowej animacji jest po prostu zbiorem przydziałów, a zabijanie animacji podobnie przywraca obiekt z powrotem do puli. Używałem tego podejścia w grze, aby wygładzić ruch kamery, zamiast blokować ją bezpośrednio na postaci, bez zauważalnego wpływu na wydajność. Zamiast rażących ruchów kamera leniwie podąża za graczem, który wygląda o wiele lepiej na oko. – MutantXenu

40

Spróbuj czegoś prostego, jak przepuszczenie jednej dziesiątej odległości. Działa zaskakująco dobrze.

float lerp = 0.1f; 
Vector3 position = this.getCamera().position; 
position.x += (Obj.x - position.x) * lerp * deltaTime; 
position.y += (Obj.y - position.y) * lerp * deltaTime; 
+16

Sugestia: należy również pomnożyć czas delta, aby ruch był niezależny od liczby klatek na sekundę. – Mortennobel