Android 正交相机的旋转

Android 正交相机的旋转,android,camera,libgdx,Android,Camera,Libgdx,我可以用这个代码旋转相机 camera.zoom = 3//in constructor if(camera.zoom>1) { camera.zoom-=0.01f; camera.rotate(15); } 这是在渲染中完成的,现在缩放效果可以正常工作,但当缩放完成时,我的屏幕将保持以当前角度旋转。如下图所示。 我希望屏幕在0度缩放后停止。您是否尝试过在每次迭代中旋转1.8度的倍数?那么,在经过200次迭代后,您的图像应该已经完成了许多完整的旋转。我

我可以用这个代码旋转相机

camera.zoom = 3//in constructor
if(camera.zoom>1)
    {
    camera.zoom-=0.01f;
    camera.rotate(15);
    }
这是在渲染中完成的,现在缩放效果可以正常工作,但当缩放完成时,我的屏幕将保持以当前角度旋转。如下图所示。


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

您是否尝试过在每次迭代中旋转1.8度的倍数?那么,在经过200次迭代后,您的图像应该已经完成了许多完整的旋转。

我编写了这个方法来计算相机的当前角度:

public float getCameraCurrentXYAngle(Camera cam)
{
    return (float)Math.atan2(cam.up.x, cam.up.y)*MathUtils.radiansToDegrees;
}
然后我像这样调用rotate方法:

camera.rotate(rotationAngle - getCameraCurrentXYAngle(camera));

这段代码可以工作,但它会在一次调用中立即旋转。要以一定的速度旋转它,你需要为每一帧计算适当的“旋转角度”。

注意,计算机不能正确地表示大多数实数

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

对浮点数进行数百次的子分级/相加将增加舍入误差,从而得出错误的结果

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

这就是为什么循环会重复201次,使缩放值为0.9900019,旋转值为361.7996~361.8(在alex的回答中使用1.8)

您可以使用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));

这段代码将在代码片段中创建一个1秒长的动画,从3缩放到1,并从0旋转到360(只需一整圈)

**camera.zoom=3;**
在每次迭代中,您将相机缩放0.01直到camera.zoom>1 因此,您总共有20次缩放迭代

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