【问题标题】:how to revert glScalef()?如何恢复glScalef()?
【发布时间】:2026-02-09 00:50:01
【问题描述】:

我正在使用 glScalef() 来放大我的程序,现在当我使用代码将其恢复为原始大小时:

glScalef(1.0f/ZOOM, 1.0f/ZOOM, 1);

它在高变焦时效果不佳...(可能是因为丢失了小数点?)

如何在不进行上述任何计算的情况下将其完美恢复到原始大小?

【问题讨论】:

    标签: opengl zooming scaling


    【解决方案1】:

    在你的第一个 glScalef() 之前使用 glPushMatrix() 将当前模型矩阵推入堆栈,然后当你想取回原始比例时使用 glPopMatrix() ,这样就不会有任何舍入错误在那里没有进行任何计算。

    【讨论】:

      【解决方案2】:

      您可以简单地保存您的投影矩阵。 glPushMatrix(), glScalef(), ..., glPopMatrix()

      【讨论】:

        【解决方案3】:

        将之前的大小存储在某个地方,比如堆栈,然后使用它。

        (动画转换回之前的缩放、平移和旋转设置比缩放更有趣)

        【讨论】:

          【解决方案4】:

          你可以这样做:

          ZOOMSQRT = sqrt(ZOOM);
          glScalef(1.0f/ZOOMSQRT, 1.0f/ZOOMSQRT, 1);
          glScalef(1.0f/ZOOMSQRT, 1.0f/ZOOMSQRT, 1);
          

          或者在缩放前使用glPushMatrix/glPopMatrix恢复原矩阵:

          glPushMatrix();
          glScalef(ZOOM, ZOOM, 1);
          [do whatever you like here...]
          glPopMatrix(); // now it's at normal scale again
          [do other things here...]
          

          【讨论】:

          • 你不应该——这很重要 :) 但我想这不会再发生了 ;)