QT与OpenGL之坐标轴缩放

sxaudq0 2012-12-14

在我们使用OpenGL画点的时候,默认的中心是在屏幕的中心,左右,上下,前后都是-1到1的区间,如果我们需要绘制大于这个区间的点怎么办呢?

方法一:

我们可以将所有的需要绘制的点转化到-1到1的区间。

方法二:

缩放OpenGL的坐标轴,使得重新建立的坐标轴符合我们新的标准。

下面我们就用方法二来实现如何重建坐标轴:

重新建立坐标轴,我们需要利用正交视角,可以使用glortho函数实现。

void GLWidget::resizeGL(int width, int height)
{
    GLfloat nRange = 100.0f;
    if(0 == height)
        height = 1;//防止一条边为0
    glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了


    //glOrtho(left, right, bottom, top, near, far);
    if (width <= height)
        glOrtho(-nRange, nRange, -nRange*height/width, nRange*height/width, -nRange, nRange);
    else
        glOrtho(-nRange*width/height, nRange*width/height, -nRange, nRange, -nRange, nRange);

    glMatrixMode(GL_PROJECTION);//选择投影矩阵
    glLoadIdentity();//重置选择好的投影矩阵
  // gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵
  //  glMatirxMode(GL_MODELVIEW);//以下2句和上面出现的解释一样
  // glLoadIdentity();

}

glOrtho函数总共六个参数,在上面代码注释了,分别代表了左,右,下,上,前,后,这是按照三维的标准设定的。

在利用画线函数来实现坐标轴:

glColor3f( 1.0f, 0.0f, 0.0f );//指定线的颜色,蓝色

          glBegin( GL_LINES );
          {
              // x-axis

              glVertex3f( -100.0f, 0.0f, 0.0f);
              glVertex3f( 100.0f, 0.0f, 0.0f);

              // x-axis arrow

              glVertex3f( 100.0f, 0.0f, 0.0f);
              glVertex3f( 93.0f, 3.0f, 0.0f);
              glVertex3f( 100.0f, 0.0f, 0.0f);
              glVertex3f( 93.0f,-3.0f, 0.0f);

              // y-axis

              glVertex3f( 0.0f, -100.0f, 0.0f);
              glVertex3f( 0.0f, 100.0f, 0.0f);

              // y-axis arrow
              glVertex3f( 0.0f, 100.0f, 0.0f);
              glVertex3f( 3.0f, 93.0f, 0.0f);
              glVertex3f( 0.0f, 100.0f, 0.0f);
              glVertex3f( -3.0f, 93.0f, 0.0f);
          }
          glEnd();

此时的效果就是:

QT与OpenGL之坐标轴缩放

此时,我们再来画一个在(50,20, 0)的点:

QT与OpenGL之坐标轴缩放

相关推荐