正交相机的旋转

4
我能用这段代码旋转摄像头。
camera.zoom = 3//in constructor
if(camera.zoom>1)
    {
    camera.zoom-=0.01f;
    camera.rotate(15);
    }

这是在渲染中完成的,现在缩放效果可以正常工作,但当缩放完成后,我的屏幕会停留在当前角度旋转的位置。如下所示。 enter image description here

我希望在缩放后,我的屏幕停留在0度。

4个回答

1
我编写了这个方法来计算相机的当前角度:
public float getCameraCurrentXYAngle(Camera cam)
{
    return (float)Math.atan2(cam.up.x, cam.up.y)*MathUtils.radiansToDegrees;
}

然后我这样调用旋转方法:
camera.rotate(rotationAngle - getCameraCurrentXYAngle(camera));

这段代码可以运行,但它会在一次调用中立即旋转。如果要按速度旋转它,需要为每帧计算适当的“rotationAngle”。

1
在你的代码片段中。
**camera.zoom=3;**

在每次迭代中,您需要将相机缩放0.01,直到camera.zoom > 1,所以您总共有20次缩放迭代。

然后,在迭代之后,旋转18度角,它将在360度内旋转。


0

注意,计算机无法正确表示大多数实数!

在二进制中,0.01是一个周期性数字,因此它将被截断/四舍五入。

对浮点数进行几百次加减会累积舍入误差,从而给出极其错误的结果。

(例如,在200次减法之后,您的camera.zoom值将为〜1.0000019-而不是1.0!)

这就是为什么您的循环重复了201次,从而给出了一个缩放值为0.9900019和一个旋转值为361.7996〜361.8(当使用1.8时,如Alex的答案所示)。

您可以使用libGDX插值函数:

time += Gdx.graphics.getDeltaTime(); //the rounding error is futile here,
//because it'll increase the animation time by max. 1 frame
camera.zoom = Interpolation.linear.apply(3, 1, Math.min(time, 1));
camera.rotate = Interpolation.linear.apply(0, 360, Math.min(time, 1));

这段代码将创建一个持续一秒钟的动画,从3缩放到1,并从0旋转到360(即一整圈)。

0

你尝试过每次迭代旋转1.8度的倍数吗?这样,当200次迭代完成后,你的图像应该已经完成了多次完整的旋转。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接