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