【问题标题】:Rotation of Orthographic Camera正交相机的旋转
【发布时间】:2013-04-19 06:54:19
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android camera libgdx


    【解决方案1】:

    在你的代码sn-p

    **camera.zoom=3;**
    

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

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

    【讨论】:

      【解决方案2】:

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

      public float getCameraCurrentXYAngle(Camera cam)
      {
          return (float)Math.atan2(cam.up.x, cam.up.y)*MathUtils.radiansToDegrees;
      }
      

      然后我像这样调用旋转方法:

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

      此代码有效,但它会在一次调用中立即轮换。要以一定速度旋转它,您需要为每一帧计算适当的“rotationAngle”。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          二进制0.01是一个周期数,所以会被截断/四舍五入。

          将浮点数减去/添加几百次会增加舍入误差,从而给您带来可怕的错误结果。

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

          这就是为什么您的循环重复 201 次,为您提供 0.9900019 的缩放值和 361.7996 ~ 361.8 的旋转(当使用 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));
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-30
            • 2018-02-15
            • 1970-01-01
            相关资源
            最近更新 更多