GL_QUAD 绘制三角形

Posted

技术标签:

【中文标题】GL_QUAD 绘制三角形【英文标题】:GL_QUAD draws triangle 【发布时间】:2017-12-25 01:28:22 【问题描述】:

我正在尝试用GL_LINES 填充由 4 行生成的四边形。但是,当我尝试填充四边形时,它只填充三角形。这是画线的代码:

def SurfaceContour(self, vertices, edges):
     glBegin(GL_LINES)
     for edge in edges:
         for vertex in edge:
             glColor3fv((1.0, 0.0, 0.0))
             glVertex3fv(vertices[vertex])
     glEnd()

这是绘制填充四边形的代码:

def Surfaces(self,  vertices):
     glBegin(GL_QUADS)
     for i in range(4):
        glColor4f(1, 1, 1, 0.3)
        glVertex3fv(vertices[i ,:])
     glEnd()

这是我传入的顶点矩阵:

[[   0.    -20.23    7.  ]
 [   0.    -20.23   -7.  ]
 [ 100.    -10.      5.  ]
 [ 100.    -10.     -5.  ]]

【问题讨论】:

【参考方案1】:

这个顶点的顺序

[[   0.    -20.23    7.  ]
 [   0.    -20.23   -7.  ]
 [ 100.    -10.      5.  ]
 [ 100.    -10.     -5.  ]]

是这样的:

如果要绘制由 4 个顶点定义的四边形,则必须绘制 GL_TRIANGLE_STRIP

def Surfaces(self,  vertices):
    glBegin(GL_TRIANGLE_STRIP)
    for i in range(4):
    glColor4f(1, 1, 1, 0.3)
    glVertex3fv(vertices[i ,:])
    glEnd()

或者您必须更改顶点的顺序,使其符合GL_QUAD 的要求:

[[   0.    -20.23    7.  ]
 [   0.    -20.23   -7.  ]
 [ 100.    -10.     -5.  ]
 [ 100.    -10.      5.  ]]

进一步查看Primitive

【讨论】:

非常感谢,完美运行。只是一个后续问题,在表面着色后,如果我旋转视图,表面的背面看起来不像着色。 Example View,你对此有什么想法吗?提前致谢。 @BjkOcean 也许这是一个Face Culling 问题。试试glDisable(GL_CULL_FACE) 或者不要打开面部剔除。【参考方案2】:

首先您使用的是旧的已弃用 api,glBegin/glEnd 和 GL_QUAD 都不应该在现代应用程序中使用。

其次,glVertex3fv 接收数组到一个元素,在你的代码中你传递了原始数组的glVertex3fv(vertices[i ,:]) 切片,实际上只使用了第一个元素,所以它等于verticies[i]。这会导致 GL_QUAD 的顶点顺序不正确。您必须更改原始类型或元素顺序。

【讨论】:

感谢您的回答,您能否提供一个小示例,说明我应该如何为现代 OpenGL 应用程序设置代码。 @BjkOcean 没那么容易,这里的重点是使用数据缓冲区,而不是多次调用glVertex。你最好谷歌一些针对现代opengl(版本3+)的教程。比如这样:learnopengl.com

以上是关于GL_QUAD 绘制三角形的主要内容,如果未能解决你的问题,请参考以下文章

CSS中使用border属性来绘制三角形

CSS中使用border属性来绘制三角形

OpenGL学习——绘制三角形

绘制三角形

绘制三角形

python怎么绘制三个叠加的等边三角形?