2013-04-16 60 views
0

我一直在寻找如何在我的OpenGL场景中绘制指标轴。该项目嵌套在Qt OpenGL小部件中,但我认为问题与Qt无关。OpenGL绘图轴角

我在这里和几年前的论坛上发现,建议存储视口和数据,为Bottom角落加载新视图,应用我的旋转和绘制,然后恢复矩阵。这对我来说似乎是最有利的,但我猜测我仍然缺少一些关于OpenGL知识的重要信息。

现在我只是把它借鉴-x可X一条红线,所以我预计在底部的红色正方形屏幕左边:

void GLWidget::drawAxis() 
{ 
    float tempPro[16]; 
    float tempMod[16]; 
    glGetFloatv(GL_PROJECTION_MATRIX, &tempPro[0]); 
    glGetFloatv(GL_MODELVIEW_MATRIX, &tempMod[0]); 

    glViewport(0, 0, 50, 50); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45.0f, 1.0f, 0.1f, 20.0f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glPushMatrix(); 
    glBegin(GL_LINES); 
     glColor3f(1.0f, 0.0f, 0.0f); 
     glEnable(GL_LINE_SMOOTH); 
     glLineWidth(1.5); 
     glVertex3f(-1000, 0, 0); 
     glVertex3f(1000, 0, 0); 
    glEnd(); 
    glPopMatrix(); 

    glViewport(0, 0, 960, 600); 
    glMatrixMode(GL_PROJECTION); 
    glLoadMatrixf(tempPro); 
    gluPerspective(45.0f, (960.0/600.0), 0.1f, 400.0f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixf(tempMod); 
} 

相反,我什么也没得到,只是一个大空的场景,我不确定如何继续。我paintGL基本上是:

void GLWidget::paintGL() 
{  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    Camera.Render(); 

    glTranslatef(0.0, 0.0, 0.0); 

    glBegin(GL_QUADS); 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glVertex3f(50.0f, 0.0f, 50.0f); 
     glVertex3f(50.0f, 0.0f, -50.0f); 
     glVertex3f(-50.0f, 0.0f, -50.0f); 
     glVertex3f(-50.0f, 0.0f, 50.0f); 
    glEnd(); 

    drawAxis(); 

}

不调用draw轴功能仍然给我我的飞机,有了它,我得到一个大空白的场景。我在如何执行drawAxis时错过了一些东西?我应该为这个功能设置另一个摄像头吗?

+0

尝试增加以'GL_DEPTH_TEST'到'glDisable'通话绘制行之前。 – didierc

+0

从函数中删除视口部分我在常规场景中出现红线,所以我不确定会有帮助。 虽然仍尝试过,但无济于事。 – Poken1151

+0

当你说节时,你是指从'glViewport'到'glBegin'? – didierc

回答

0
  • 您可以使用glPushMatrix()和glPopMatrix()来保存和恢复Projection和ModelView矩阵的状态。
  • 您没有将ModelView矩阵设置为任何有用的东西。

尝试是这样的:

void GLWidget::drawAxis() 
{ 
    glViewport(0, 0, 50, 50); 

    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    gluPerspective(45.0f, 1.0f, 0.1f, 20.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    //This really has to come from your camera.... 
    gluLookAt(10.0f,10.0f,10.0f, 0.0f,0.0f,0.0f, 0.0f,0.1f,0.0f); 

    glColor3f(1.0f, 0.0f, 0.0f); 
    glEnable(GL_LINE_SMOOTH); 
    glLineWidth(1.5); 
    glBegin(GL_LINES); 
     glVertex3f(-1000, 0, 0); 
     glVertex3f(1000, 0, 0); 
    glEnd(); 

    //Restore View 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glViewport(0, 0, 960, 600); 
} 
+0

我认为推/流行被认为是depricated或今天只是不好使用(所以说在这里的另一篇文章)。但是我尝试了一下你的建议,导致了相同的空白屏幕。 我想也许是因为我在Qt中,所以我加载了运行在glutMianLoop上的原始C++/freeglut,对于我的原始代码和您的建议仍然是同样的问题。我不确定我错过了什么。 – Poken1151

+0

是用OpenGL 3.1折旧的,但glMatrixMode(),glColor3f(),glTranslatef(),glBegin()和glEnd()也是如此。所以如果你仍然在使用固定功能管道,你可能会使用Push/Pop :-)。我会将drawAxis方法缩减为线条绘制的开始/结束。你应该看到你的飞机和一条线。如果可行,只需添加视口。您应该在左下角看到飞机和线路。然后你必须再次处理你的投影和modelView矩阵...... –

+0

哇,我真的需要学习现代OpenGL。我用它提供的一些指导和堆栈中另一个问题的二维覆盖(我一直在寻找3D)。所以我有角落轴显示,但现在它混乱了我的射线选择,因为我弹出矩阵。我会继续努力,感谢您的帮助。 – Poken1151