代码之家  ›  专栏  ›  技术社区  ›  giorgioW

限制OpenGL动画中的Fovy

  •  0
  • giorgioW  · 技术社区  · 7 年前

    我只是想知道如何限制我的放大/缩小动画,使其永远不会超过Fovy(我想是180度),这样场景就不会转过来或做奇怪的事情。 动画代码如下:

    void funSpecial(int key, int x, int y){
        switch(key){
        case GLUT_KEY_UP: zoom+=0.5f; break;
        case GLUT_KEY_DOWN: zoom-=0.5f; break;
        default: zoom=1.0f; break;
        }
    
        glutPostRedisplay();
    }
    

    它控制全局变量的值 GLfloat zoom = 1.0f ,然后乘以 fovy ,在场景定义中声明,值为60。所以它可以放大到场景。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Michael Kenzel    7 年前

    好吧,你只需要把值限制在你想限制的范围内。基本上有两种方法可以做到这一点。您可以确保该值不会以超出该范围的方式更新:

        …
        case GLUT_KEY_UP: zoom = std::min(zoom + 0.5f, max_zoom); break;
        case GLUT_KEY_DOWN: zoom = std::max(zoom - 0.5f, min_zoom); break;
        …
    

    或者你只是让 zoom 转到它可能转到的任何值,并在实际使用该值的点将当前值钳制到所需的范围:

        float getZoom() { return std::min(std::max(zoom, min_zoom), max_zoom); }
    

    每种方法都有其优点和缺点。例如:第一种方法要求您始终保持状态的一致性,这可能会成为一个比这里简单的示例更复杂的问题。第二种方法可能会给您提供下溢/溢出的ISSE。如果更新值的频率要比使用它的频率高很多,那么只需将其夹在末尾就可以避免每次更新值时限制范围的开销。相反,如果在每次使用时使用的值比更新后的值更频繁,那么在每次使用时对其进行钳制可能会成为一个很大的开销。