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;

questionAnswers(1)

yourAnswerToTheQuestion