【问题标题】:Raw OpenGL equivillant of GLUPerspective?GLUPerspective的原始OpenGL等效?
【发布时间】:2010-06-17 02:37:58
【问题描述】:

如果没有 Glu,我怎么能像 GluPerspective 一样做呢?谢谢

例如:gluPerspective(45.0, (float)w / (float)h, 1.0, 200.0);

【问题讨论】:

    标签: c++ c opengl


    【解决方案1】:
    void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar )
    {
        GLdouble xmin, xmax, ymin, ymax;
    
        ymax = zNear * tan( fovy * M_PI / 360.0 );
        ymin = -ymax;
        xmin = ymin * aspect;
        xmax = ymax * aspect;
    
        glFrustum( xmin, xmax, ymin, ymax, zNear, zFar );
    }
    

    【讨论】:

      【解决方案2】:

      gluPerspective 文档中对此进行了相当清楚的解释。您只需构建适当的 4x4 变换矩阵并使用 glMultMatrix 将其乘以当前变换:

      void myGluPerspective(double fovy, double aspect, double zNear, double zFar)
      {
          double f = 1.0 / tan(fovy * M_PI / 360);  // convert degrees to radians and divide by 2
          double xform[16] =
          {
              f / aspect, 0, 0, 0,
              0,          f, 0, 0,
              0,          0, (zFar + zNear)/(zNear - zFar), -1,
              0,          0, 2*zFar*zNear/(zNear - zFar), 0
          };
          glMultMatrixd(xform);
      }
      

      请注意,OpenGL 以 column-major 顺序存储矩阵,因此上述数组元素的顺序与gluPerspective 文档中的内容相反。

      【讨论】:

      • 除非我遗漏了什么,否则将度数转换为弧度是 degToRad(deg) { return deg * M_PI/ 180.0; },所以第一行应该是 180 而不是 360。
      • @prewett:它不仅仅是将度数转换为弧度,还除以 2。gluPerspective 文档说明了等式 f = cotangent(fovy / 2);当您进行度数到弧度的转换时,fovy / 2 变为 fovy * M_PI / 360
      • 糟糕,我现在在您的评论中看到了这一点。我的 Mac 上的窗口太小,无法看到完整的评论,而且愚蠢的 Lion+ 滚动条在您实际滚动之前不会显示,所以我没有看到弧度部分的内容更多。对此感到抱歉。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多