显示垂直于屏幕的四边形

Posted

技术标签:

【中文标题】显示垂直于屏幕的四边形【英文标题】:Display a quad perpendicular to the screen 【发布时间】:2015-03-18 12:27:24 【问题描述】:

当绘制一个四边形时,当旋转到一个垂直于屏幕的位置时它就会消失。理想情况下,我希望看到的是 (b) 但我什么也得不到

我的代码有问题吗? (警告旧的 openGL 代码如下)

void draw_rect(double vector[4][3], int rgb[3], double transp)

    GLint is_depth, is_blend, blend_src, blend_dst; 

    glGetIntegerv(GL_DEPTH_WRITEMASK, &is_depth); 
    glGetIntegerv(GL_BLEND, &is_blend); 
    glGetIntegerv(GL_BLEND_SRC, &blend_src); 
    glGetIntegerv(GL_BLEND_DST, &blend_dst); 

    glEnable(GL_BLEND); 
    glDepthMask(0); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    // code to set the color ... 

    glBegin(GL_POLYGON); 
    glVertex3v(&vector[0][0]); 
    glVertex3v(&vector[1][0]); 
    glVertex3v(&vector[2][0]); 
    glVertex3v(&vector[3][0]); 
    glEnd(); 

    if (!is_blend) glDisable(GL_BLEND); 
    glDepthMask(is_depth); 
    glBlendFunc(blend_src, blend_dst); 

【问题讨论】:

我会说这种行为是正确的。由于你在一层中有一个四边形,它没有深度,所以如果你垂直看它,它的大小为 0。按预期工作。你可以把它做成一个很浅的立方体。 @SinisterMJ 够公平的;我从标题中删除了“正确地”这个词,所以也许我们可以专注于你刚刚给出的提示 如果填充的图元(例如四边形)垂直于图像平面,则它没有光栅化表面区域。您是否考虑过使用GL_LINES 来绘制这些垂直四边形?线和点基元总是有保证的宽度。 【参考方案1】:

四边形(假设它由共面定义,如本例所示)根据定义是无限薄的。垂直于相机时不可见是正确的行为。

“正确”的解决方案是制作一个盒子而不是一个四边形。

有关使用多维数据集的示例,请参阅 Drawing cube 3D using Opengl。您需要调整顶点位置以使立方体沿一维(可能是 Z)更小,但它会给您带来您正在寻找的效果。

另外,停止使用固定函数 stuffglVertex 等)。它已被弃用多年。着色器并不难,通过您最喜欢的搜索引擎很容易找到示例。

【讨论】:

立即模式(glVertex 等)与着色器正交。您可以在即时模式下使用着色器,也可以将固定功能管道与数组,甚至缓冲区对象一起使用。【参考方案2】:

当四边形垂直于屏幕时,尝试使其成为一条具有一定宽度的线

【讨论】:

以上是关于显示垂直于屏幕的四边形的主要内容,如果未能解决你的问题,请参考以下文章

css 实现DIV水平垂直居中于屏幕

如何将屏幕垂直分成三部分?

屏幕时序水平2200,垂直1125

Flutter 如何使用 ListView 水平和 GridView 垂直滚动屏幕

如何使屏幕仅垂直。 (UITabBarController/Swift)

如何确定一个点是否在多边形内仅由水平线和垂直线组成?