LibGDX移动一个旋转的摄像头(LibGDX Moving a Rotated Camera)

2019-07-18 14:57发布

我已经使用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值被直接从着陆和touchDragged方法而采取。 如果我不是地方,设置那些下面的代码之后的代码,它创建了我在原来的职位,它移动的方式应该,但非常不连贯提到的问题。

    Vector3 vector = new Vector3(x, y, 0);
    camera.unproject(vector);
    x = (int) vector.x;
    y = CanvasAnywhereMain.HEIGHT - (int) vector.y;

Answer 1:

我是用类似的问题,今天打交道时,我被编程的轨道相机。 我会尽力来形容你,我是如何处理这个问题。

我希望我的轨道相机能够围绕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”轴。 要做到这一点,我们需要知道两个向量的叉积。 请参阅跨产品的维基和上libgdx类引用(CRS)

下面的代码片段将返回新的Vector3,这将指向相对于当前摄像机的右轴。 请注意,也没有()调用存在,因为我们要正常化是载体。

长话短说:

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

CRS从创建两个矢量(在我们的情况下camera.direction和camera.up)叉积向量。

我不明白为什么的Vector3正确的成员变量不便于暴露或向右为什么矢量计算方法是不存在的,但是这无论如何都会做的伎俩

随着一些代码编辑您可以将您的播放器,摄像头或任何在你周围的世界所需要的轴。 你只需要了解基本的向量运算,所以我建议你去他们槽

最后需要注意的:

因为中心绕Y旋转改变你的本地X轴,这将需要重新计算(权向量)必须绕X轴第一。



文章来源: LibGDX Moving a Rotated Camera