如何在同一屏幕上绘制 2d 对象和 3d 对象

Posted

技术标签:

【中文标题】如何在同一屏幕上绘制 2d 对象和 3d 对象【英文标题】:How to draw 2d object and 3d object on the same screen 【发布时间】:2014-06-14 16:07:48 【问题描述】:

我正在尝试绘制一个按钮,以便稍后我可以单击它。但是我遇到了一些问题,即当我在 Draw2d 函数中取消注释所选部分时,屏幕变黑并且我的 3d 对象消失了。任何想法为什么以及如何解决这个问题?我想添加注释部分,按钮显示在不同的区域(左侧,顶部屏幕),如果我像这里一样注释它,那么它显示在我的 3d 对象的中心并且它没有边框。只有标签。

void Draw2D()

   glPushMatrix();
   glDisable(GL_DEPTH_TEST);
   //glMatrixMode(GL_PROJECTION);
   //glLoadIdentity();
   glOrtho(0, winw, winh, 0, -1, 1);
   //glMatrixMode(GL_MODELVIEW);
   //   glLoadIdentity();
   ButtonDraw(&MyButton);
   glPopMatrix();
   glEnable(GL_DEPTH_TEST);

这是我的源代码: Source.cpp

我也想问有没有人知道如何创建一个输入字段?一个简单的方法,因为我还在学习。

【问题讨论】:

【参考方案1】:

目前尚不清楚您的绘制循环的外观,以及您在其中设置矩阵、绘制 3d 内容和绘制 2d 内容的位置。但是从目前显示的代码中,我仍然可以解释为什么它可能会产生影响:每个矩阵类型(模型视图、投影、纹理)都有一个矩阵堆栈。

您的代码所做的是将当前选定的矩阵推入堆栈(可能是GL_MODELVIEW)。然后,您对其应用正交矩阵。由于这里的矩阵不太可能是恒等的,因此正交不会有您期望的结果,并且图像是错误的。此外,旧的投影矩阵仍然没有改变,这将进一步影响变换。然后,您恢复原始矩阵并继续进行渲染。

如果取消注释代码,则先切换,然后切换,将正交矩阵设置为投影并为模型视图设置标识 - 但只有模型视图矩阵要恢复,投影矩阵仍然具有正交集。

你真正需要做的是:

glMatrixMode(GL_PROJECTION);
glPushMatrix(); // save current projection matrix 
glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix(); // save current modelview matrix
glLoadIdentity();
// ... draw
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // restore PUSHed projection matrix
glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // restore PUSHed modelview matrix

这假设在调用 this 时,glMatrixMode(GL_MODELVIEW) 已设置,并将其恢复为 this。这也可以优化为

// assume `GL_MODELVIEW` is the current matrix mode
glPushMatrix(); // save current modelview matrix
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix(); // save current projection matrix
glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
// ... draw
glPopMatrix(); // restore PUSHed projection matrix
glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // restore PUSHed modelview matrix
// now `GL_MODELVIEW` is selected again

调用开销略小,但不如初始变体清晰。

【讨论】:

以上是关于如何在同一屏幕上绘制 2d 对象和 3d 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 3D 对象(如球体)上绘制文本

如何在 Qt 中创建 3D 对象模型的 2D 切片?

opengl绘制三角形

如何在处理 P3D 模式下绘制 2D 字体?

如何在处理P3D模式下绘制2D字体?

我们可以像在处理中那样在 PyQt5 中绘制 3D/2D 对象吗?