Android Live Wallpaper Parallax na silniku libgdx

0

Witam.
Chciałbym zrobić Live Wallpaper na Androida z efektem Parallaxu sterowanego Accelerometrem telefonu. Coś jak w tej aplikacji https://play.google.com/store/apps/details?id=com.pizzaentertainment.lwp
Od 3 dni staram sie to wykombinować ale jedyne czego sie dowiedziałem to że można coś takiego osiągnąć za pomocą silnika graficznego np. libgdx. Zacząłem sie go uczyć, ale wciąż nie moge wpaść na koncept jak to zrobić. Może ktoś ma jakieś doświadczenie z libgdx i mógłby mnie trochę naprowadzić.
Dodam że następnym krokiem będzie połączenie tej aplikacji z API i pobieranie z niego szablonów z warstwami, ale to już raczej ogarne.
Z góry dzięki za pomoc ;)

1

Z czym masz konkretnie problem? Ustawianie tapety czy sam rendering z uwzględnieniem paralaksy? Odnośnie tego drugiego, to możesz to osiągnąć chyba w każdym silniku 2D (a na pewno w OpenGL). Podstawowa zasada jest taka, że każda warstwa ma osobny współczynnik ruchu - tym mniejszy, im dalej znajduje się na osi Z (oś rosnąca "w głąb" ekranu). Np. warstwa pierwszoplanowa ma współczynnik 0.2, a warstwa tła współczynnik 0.1. Pozycję warstwy obliczasz mnożąc wektor przesunięcia przez współczynnik ruchu. W przypadku tapet kotwicą (punktem względem którego obliczasz pozycję warstwy) powinien być środek ekranu. Jeśli mój opis jest mało zrozumiały mogę to zrobić w formie schematu - stosunkowo ciężko to opisać słowami gdy nie wiem, jakie masz doświadczenie z grafiką 2D.

Wektor przesunięcia musisz obliczać wg danych z akcelerometru, tutaj niestety Ci nie pomogę gdyż nigdy go nie wykorzystywałem w aplikacjach. Sugerowałbym Ci najpierw napisać wersję, w której wektor przesunięcia obliczasz np. na podstawie dotyku - będzie Ci łatwiej debugować i sprawdzić poprawność samego renderingu warstw. :)

Edycja:
Sprawdziłem tą przykładową aplikację, choć nie mam czasu się jej dokładnie przyjrzeć - mam wrażenie, że warstwy są tam dodatkowo renderowane na trójwymiarowym plane'ie, który jest delikatnie obracany, chociaż może to tylko złudzenie w wyniku dobrej jakości tapet. W każdym razie efekt taki można również zasymulować oteksturowanym quadem w 2D z odpowiednio wyliczonymi współrzędnymi wierzchołków.

1

z tą biblioteką nie mam żadnego doświadczenia, ale jakbym miał zrobić coś takiego na pałę,

to bym położył kilka obrazków z przeźroczystością na FrameLayout który by miał szerokość np ekran *3, a później pobierając dane z akcelerometru każdą kolejną warstwe przesuwał (zwykłym animate) o jakąś wielkość * współczynnik głębokości( tym mniejszy im głębiej jest obrazek). W ten sposób otrzymasz łady efekt paralaksy. Co prawda nie robiłem tego dla wallpaper ale dla zwykłej activity gdzie wyglądało bardzo ładnie.

Tylko obrazki koniecznie muszą być sporo szersze niż ekran bo inaczej trafisz na urządzenie z inną proporcją i się wszystko rozsypie

0

Websplash, nie mam dużego doświadczenia z grafiką i silnikami graficznymi, i właśnie chodzi mi tutaj o renderowanie. Chciałbym to zrobić jakimś najprostszym sposobem, nie bawiąc sie dodatkowo w 3D. po prostu 2-5 obrazki ruszające sie pod wpływem akcelerometru. Jeśli to nie problem to prosiłbym o ten schemat jak to powinno wyglądać.
Może napisze jak ja to widze:
Najpierw podaje w argumencie metody "create" Liste ze ścieżkami do obrazków. Metoda tworzy obiekty warstw na podstawie tych obrazków i ustawia ich współrzędne na 0, 0 ,0. Renderowanie to będzie pętla wykonywająca sie tyle razy ile jest warstw i zmieniająca ich współrzędne na podstawie numeru warstwy i wartości z akcelerometru (znalazłem taki kod w sieci)

    this.smoothAccData.x = ((1.0F - 0.13F) * this.smoothAccData.x + Gdx.input.getAccelerometerX() * 0.13F);
    this.smoothAccData.y = ((1.0F - 0.13F) * this.smoothAccData.y + Gdx.input.getAccelerometerY() * 0.13F);
    this.smoothAccData.z = ((1.0F - 0.13F) * this.smoothAccData.z + Gdx.input.getAccelerometerZ() * 0.13F);
    this.smoothGyroData.x = ((1.0F - 0.13F) * this.smoothGyroData.x + Gdx.input.getAzimuth() * 0.13F);
    this.smoothGyroData.y = ((1.0F - 0.13F) * this.smoothGyroData.y + Gdx.input.getRoll() * 0.13F);
    this.smoothGyroData.z = ((1.0F - 0.13F) * this.smoothGyroData.z + Gdx.input.getPitch() * 0.13F); 

Wydaje się być proste, ale nie mam pojęcia jak to zrobić w silniku graficznym :/

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