我在使用 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;