2013-01-24 70 views
4

我已经到了我的应用程序中使用LibGDX构建的情景,我需要相机能够旋转,并且也可以由用户移动,以及能够被缩放。我的相机控制移动和缩放相机的工作非常漂亮,但是,当相机旋转时,相机将根据该旋转进行移动。例如,如果相机向左旋转45度,并且用户向右拖动以移动相机,则相机将向右上方移动,因为这是相机右侧正指向的位置。相反,我需要相机始终相对于屏幕/用户输入移动,而不管其旋转。LibGDX移动一个旋转的相机

我对这个问题有一个解决方案,那就是简单地使用“世界坐标”来定位相机,而不是基于我现在尝试使用的“窗口坐标”。这会产生令人不愉快的用户体验,因为它会使相机变得相当不连贯,并导致我的缩放系统出现问题。我认为我可以用很多调整来修补这些问题,但是,因为使用窗口坐标已经非常平滑,所以我更愿意去那条路线。

我怀疑有一个优雅的解决方案,看似简单的问题,我可以做一个矩阵或沿着这些线的简单计算,但我在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 - 初始触摸启动变焦

zoomCurrentPosition的X和Y坐标 - 将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; 
+0

您可以添加一段代码,显示您现在如何移动/旋转摄像头吗? –

+0

我的输入代码在这一点上相当大,所以现在我只提出移动相机本身的线,以及我用来将x和y转换为“世界空间”的块,主要用于应用程序中的其他触摸事件。我很高兴根据需要发布更多内容,我只是不想发布大量不必要的代码。此外,就目前而言,我只是使用camera.rotate(value)旋转相机。由于这些问题,我还没有建立适当的控制系统。 – Synthetik

回答

2

今天我在处理类似的问题,当时我正在编程轨道摄像机。我会试着描述你如何处理这个问题。

我希望我的轨道相机能够在同一时间围绕X轴和Y轴旋转,但它不起作用。我只能分别绕着这个轴旋转。

把戏对我来说是:

Vector3 target = Vector3.zero 
Vector3 right = new Vector().set(camera.direction).crs(camera.up).nor(); 

// This angles usualy comes from touchDragged event in your input processor 
// class implementing the InputProcessor, where you do your calculations 
deltaAngleX = 1.1f; 
deltaAngleY = 1.9f; 

// Rotate around X axis 
camera.rotateAround(target, right, deltaAngleX); 

// Rotate around Y 
camera.updateRotation(Vector3.Y, deltaAngleY); 

当你围绕Y轴旋转的一切是好的,因为Y轴不取决于你的X轴旋转而改变。你总是想绕世界Y轴旋转,而不是任何本地的旋转。

但是当你围绕X旋转时,你不能使用Vector3.X,因为这个轴不会相对于你的相机位置和方向。所以我们需要计算相机的“本地Y”轴。要做到这一点,我们需要知道两个向量的交叉积是什么。请参阅Cross product on wikicrs() on libgdx class reference

以下代码片段将返回新的Vector3,它将指向相对于当前相机的右侧轴。注意nor()调用是存在的,因为我们想规范化该向量。

长话短说:

Vector3 right = new Vector().set(direction).crs(up).nor(); 

Crs的创建从两个向量(在我们的例子camera.direction和camera.up)跨产品载体。

我不明白为什么的Vector3正确的成员变量不便于暴露或向右为什么矢量计算方法是不存在的,但是这也有问题呢

少数代码编辑作业您可以将您的播放器,相机或世界上围绕您需要的轴线的任何东西。你只需要了解基本的向量运算,所以我建议你去低谷他们

最后一个音符:

必须绕X轴首先是因为中心绕Y旋转的变化,这将需要你的本地X轴重新计算(正确的矢量)。

+0

我无法在'Camera'类中找到'updateRotation'函数。它是什么? – Nolesh