Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL在角点绘制轴_C++_Qt_Opengl - Fatal编程技术网

C++ OpenGL在角点绘制轴

C++ OpenGL在角点绘制轴,c++,qt,opengl,C++,Qt,Opengl,我一直在研究如何在OpenGL场景中绘制指示器轴。该项目嵌套在Qt OpenGL小部件中,但我认为问题与Qt无关 我在这里和几年前的论坛上发现,建议存储视口和数据,为bottom角加载新的视口和数据,应用我的旋转和绘制,然后恢复矩阵。这对我来说似乎是最有益的,但我猜我的OpenGL知识中仍然缺少一些关键信息 现在我只是让它在-x到x之间画一条红线,所以我希望屏幕左下角有一个红方块: void GLWidget::drawAxis() { float tempPro[16]; fl

我一直在研究如何在OpenGL场景中绘制指示器轴。该项目嵌套在Qt OpenGL小部件中,但我认为问题与Qt无关

我在这里和几年前的论坛上发现,建议存储视口和数据,为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);
}
相反,我什么也没有得到,只是一个巨大的空场景,我不知道如何继续。我的绘画基本上是:

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 axis函数仍然会给我平面,有了它,我得到一个大的空白场景。我在实现drawAxis的过程中是否遗漏了什么?我应该为该功能或类似功能设置另一个摄像头吗?

  • 可以使用glPushMatrix()和glPopMatrix()保存和恢复投影矩阵和模型视图矩阵的状态
  • 您没有设置任何有用的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);
}
  • 可以使用glPushMatrix()和glPopMatrix()保存和恢复投影矩阵和模型视图矩阵的状态
  • 您没有设置任何有用的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);
}

在绘制线条之前,尝试使用
GL\u DEPTH\u TEST
添加对
glDisable
的调用。如果从函数中删除视口部分,我会在常规场景中看到一条红线,因此我不确定这是否有帮助。但仍然尝试了,但没有效果。当你说“部分”时,你的意思是从
glViewport
glBegin
?在绘制线条之前,尝试使用
GL\u DEPTH\u TEST
添加对
glDisable
的调用。如果从函数中删除视口部分,我的常规场景会出现一条红线,因此我不确定这是否有帮助。但仍然尝试过,但没有效果。当你说section时,你的意思是从
glViewport
glBegin
?我认为推送/弹出被认为是无润滑的,或者只是今天不好用(这里的另一篇帖子是这么说的)。但是我尝试了一下你的建议,结果还是一样的。我想可能是因为我在Qt中,所以我加载了在glutmian循环上运行的原始C++/freeglut,对于我的原始代码和您的建议,仍然是相同的问题。我不确定我缺少了什么。OpenGL 3.1会使它贬值,但glMatrixMode()、glColor3f()、glTranslatef()、glBegin()和glEnd()也会贬值。因此,如果您仍在使用固定函数管道,那么最好使用Push/Pop:-)。我会将drawAxis方法简化为仅绘制线条的开始/结束。你应该看到你的飞机和一条线。如果这样做有效,只需重新添加视口即可。您应该在左下角看到平面和线。然后你必须再次处理投影和modelView矩阵…哇,我真的需要学习现代OpenGL。我使用了你们提供的w位指导和堆栈上其他问题的二维叠加(我一直在寻找3D)。所以我有角轴显示,但现在它混乱了我的光线选择,因为我弹出矩阵。我会继续努力的,谢谢你的帮助。我认为推送/弹出被认为是无润滑的,或者只是不适合今天使用(这里的另一篇帖子如是说)。但是我尝试了一下你的建议,结果还是一样的。我想可能是因为我在Qt中,所以我加载了在glutmian循环上运行的原始C++/freeglut,对于我的原始代码和您的建议,仍然是相同的问题。我不确定我缺少了什么。OpenGL 3.1会使它贬值,但glMatrixMode()、glColor3f()、glTranslatef()、glBegin()和glEnd()也会贬值。因此,如果您仍在使用固定函数管道,那么最好使用Push/Pop:-)。我会将drawAxis方法简化为仅绘制线条的开始/结束。你应该看到你的飞机和一条线。如果这样做有效,只需重新添加视口即可。您应该在左下角看到平面和线。然后你必须再次处理投影和modelView矩阵…哇,我真的需要学习现代OpenGL。我使用了你们提供的w位指导和堆栈上其他问题的二维叠加(我一直在寻找3D)。所以我有角轴显示,但现在它混乱了我的光线选择,因为我弹出矩阵。我会继续努力的,谢谢你的帮助。