我在使用 LibGDX 构建的应用程序中遇到了一种情况,我需要相机能够旋转,用户也可以移动,并且能够缩放。我的用于移动和缩放相机的相机控件可以很好地工作,但是,当相机旋转时,相机会根据该旋转移动。例如,如果相机向左旋转 45 度,并且用户向右拖动以移动相机,它将向右上角移动,因为这是相机右侧现在指向的位置。相反,我需要相机始终相对于屏幕/用户输入移动,无论其旋转如何。
对于这个问题,我确实有一个解决方案,那就是简单地使用“世界坐标”来定位相机,而不是基于我现在尝试使用的“窗口坐标”。但是,这会造成非常不愉快的用户体验,因为它使相机相当不稳定,并导致我的缩放系统出现问题。我想我可以通过大量调整来解决这些问题,但是,因为它已经使用窗口坐标更加平滑,所以我真的更喜欢走那条路。
我怀疑这个看似简单的问题有一个优雅的解决方案,我可以对矩阵或类似的东西进行简单的计算,但是我对 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;