LibGDX Przenoszenie obróconej kamery
Doszedłem do sytuacji w mojej aplikacji, zbudowanej przy użyciu LibGDX, gdzie potrzebuję kamery, aby mogła się obracać, a także być przenoszona przez użytkownika, a także mieć możliwość powiększania. Moje sterowanie aparatem do poruszania i powiększania aparatu działa pięknie, jednak po obróceniu aparatu kamera jest następnie przesuwana w oparciu o ten obrót. Na przykład, jeśli kamera zostanie obrócona o 45 stopni w lewo, a użytkownik przeciągnie kamerę w prawo, aby przesunąć kamerę, przesunie się ona w kierunku prawego górnego rogu, ponieważ właśnie w tym miejscu wskazuje prawą stronę aparatu. Zamiast tego potrzebuję aparatu, aby zawsze poruszał się względem wejścia ekranu / użytkownika, niezależnie od jego obrotu.
Mam jedno rozwiązanie tego problemu, a mianowicie po prostu użyj „współrzędnych świata”, aby ustawić kamerę, zamiast opierać ją na „współrzędnych okna”, które próbuję teraz użyć. Stwarza to jednak bardzo nieprzyjemne wrażenia użytkownika, ponieważ sprawia, że kamera jest dość wzburzona i powoduje problemy z moim systemem powiększania. Zakładam, że mogę poprawić te problemy z dużą ilością szczypania, jednak ponieważ jest to o wiele bardziej płynne, gdy korzystam ze współrzędnych okna, naprawdę wolałbym pójść tą trasą.
Podejrzewam, że istnieje eleganckie rozwiązanie tego pozornie prostego problemu, w którym mógłbym wykonać proste obliczenia na macierzy lub coś w tym rodzaju, jednak moja wiedza w OpenGL wciąż jest dość słaba i nie mogę zrozumieć, co dokładnie musi się stać naprawić to. Wszelkie pomysły kogoś bardziej doświadczonego w OpenGL i wszystkich tych matrycach byłyby bardzo mile widziane!
=== EDYCJA ===
Obiekty używane do przechowywania tutaj wartości są w zasadzie moją własną wersją Vector2, która była wymagana w innej części aplikacji. Nie pamiętam dokładnie dokładnego uzasadnienia dla 0.7f, ale przypuszczalnie było to po prostu obniżenie czułości ruchu, a problem nadal występuje, jeśli go usunę.
camera.position.set(cameraStartPosition.getX() - ((zoomCurrentPosition.getX() - zoomStartPosition.getX()) * 0.7f), cameraStartPosition.getY() + ((zoomCurrentPosition.getY() - zoomStartPosition.getY()) * 0.7f), 0);
cameraStartPosition - Współrzędne X i Y kamery, gdy użytkownik zaczyna ją przesuwać.
zoomStartPosition - Współrzędne X i Y początkowego dotknięcia, które rozpoczyna zoom
zoomCurrentPosition - Współrzędne X i Y, w których znajduje się dotyk sterujący zoomem
Wartości xiy w tych wartościach są pobierane bezpośrednio z metod touchDown i touchDragged. Jeśli zamiast tego umieszczę kod, który ustawia te kody po poniższym kodzie, tworzy to problem, o którym wspomniałem w oryginalnym poście, gdzie porusza się tak, jak powinien, ale jest bardzo niepewny.
Vector3 vector = new Vector3(x, y, 0);
camera.unproject(vector);
x = (int) vector.x;
y = CanvasAnywhereMain.HEIGHT - (int) vector.y;