正射相机的旋转

时间:2013-04-19 06:54:20

标签: android camera libgdx

我可以使用此代码旋转相机

camera.zoom = 3//in constructor
if(camera.zoom>1)
    {
    camera.zoom-=0.01f;
    camera.rotate(15);
    }

这是在渲染中完成的,现在缩放效果正常工作但是当缩放完成时,我的屏幕将保持以当前角度旋转。如下。 enter image description here

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

4 个答案:

答案 0 :(得分: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 :(得分:1)

在您的代码段中

**camera.zoom=3;**

并且在每次迭代中,您通过 0.01 缩放相机,直到 camera.zoom> 1  所以你有20次迭代用于缩放

然后在迭代后以 18 角度旋转它将以 360 度旋转。

答案 2 :(得分:0)

您是否尝试过每次迭代旋转1.8度的倍数?然后,一旦200次迭代过去,你的图像就应该完成了一些完整的旋转。

答案 3 :(得分: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(只需一整个旋转)