我在使用LibGDX构建的应用程序中遇到了一个问题,需要相机能够旋转,并且可以被用户移动,同时也能够进行缩放。我的相机控制器可以很好地控制相机的移动和缩放,但是当相机被旋转后,相机的移动会基于该旋转位置。例如,如果相机向左旋转45度,并且用户向右拖动以移动相机,则相机将朝向右上方移动,因为相机的右侧现在指向右上方。相反,我需要相机始终相对于屏幕/用户输入移动,而不考虑其旋转。
我有一种解决方法,那就是使用“世界坐标”来定位相机,而不是基于我现在正在尝试使用的“窗口坐标”。然而,这会导致非常不愉快的用户体验,因为它使相机变得相当卡顿,并且会对我的缩放系统造成问题。我认为我可以通过大量调整来修补这些问题,但因为使用窗口坐标已经更加平滑,所以我真的更喜欢这种方式。
我怀疑有一个优雅的解决方案来解决这个看似简单的问题,我可以在矩阵或类似的东西上进行简单的计算,但是我的OpenGL知识还相当缺乏,我似乎无法弄清楚需要发生什么来解决它。如果有更熟练于OpenGL和所有这些矩阵的人有任何想法,将不胜感激!
===编辑===
这里使用的对象基本上只是我的Vector2版本,这是在应用程序的另一部分中所需的。我无法完全记住其中0.7f的确切原因,但可能只是为了降低移动灵敏度,如果我删除它,问题仍然存在。
我有一种解决方法,那就是使用“世界坐标”来定位相机,而不是基于我现在正在尝试使用的“窗口坐标”。然而,这会导致非常不愉快的用户体验,因为它使相机变得相当卡顿,并且会对我的缩放系统造成问题。我认为我可以通过大量调整来修补这些问题,但因为使用窗口坐标已经更加平滑,所以我真的更喜欢这种方式。
我怀疑有一个优雅的解决方案来解决这个看似简单的问题,我可以在矩阵或类似的东西上进行简单的计算,但是我的OpenGL知识还相当缺乏,我似乎无法弄清楚需要发生什么来解决它。如果有更熟练于OpenGL和所有这些矩阵的人有任何想法,将不胜感激!
===编辑===
这里使用的对象基本上只是我的Vector2版本,这是在应用程序的另一部分中所需的。我无法完全记住其中0.7f的确切原因,但可能只是为了降低移动灵敏度,如果我删除它,问题仍然存在。
camera.position.set(cameraStartPosition.getX() - ((zoomCurrentPosition.getX() - zoomStartPosition.getX()) * 0.7f), cameraStartPosition.getY() + ((zoomCurrentPosition.getY() - zoomStartPosition.getY()) * 0.7f), 0);
cameraStartPosition - 用户开始移动相机时的X和Y坐标。
zoomStartPosition - 开始缩放的初始触摸点的X和Y坐标。
zoomCurrentPosition - 控制缩放的当前触摸点的X和Y坐标。
这些值中的x和y直接从touchDown和touchDragged方法中获取。如果我将设置这些值的代码放在以下代码之后,它会创建原帖中提到的问题,即它会以应有的方式移动,但是非常卡顿。
Vector3 vector = new Vector3(x, y, 0);
camera.unproject(vector);
x = (int) vector.x;
y = CanvasAnywhereMain.HEIGHT - (int) vector.y;