2017-12-25 4 views
1

Ich versuche Quad zu füllen, das von 4 Linien mit GL_LINES generiert wird. Wenn ich versuche, das Quad zu füllen, füllt es sich nur mit einem Dreieck. Dies ist der Code, der die Linien zieht:GL_QUAD zeichnet Dreieck

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() 

dies der Code ist, dass die Quad zieht füllt:

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

Dies ist der Scheitel Matrix, die ich in passieren:

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

Antwort

5

Die Reihenfolge dieser Ecken

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

ist wie folgt:

enter image description here

Wenn Sie das Quad zeichnen möchten, die von den vier Eckpunkten definiert ist, dann haben Sie entweder eine GL_TRIANGLE_STRIP zu ziehen:

enter image description here

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

Oder Sie müssen die Reihenfolge der Scheitelpunkte ändern, die es anpasst s die requiremts für eine GL_QUAD:

enter image description here

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

Sehen Sie weitere Primitive

+0

Vielen Dank, das funktioniert einwandfrei. Nur eine Nachfolgefrage, nachdem die Oberfläche gefärbt ist, wenn ich die Ansicht rotiere, sieht die Rückseite der Oberfläche nicht wie gefärbt aus. [Beispielansicht] (https://ibb.co/i60L76), haben Sie eine Idee? Danke im Voraus. – BjkOcean

+0

@BjkOcean Vielleicht ist es ein [Face Culling] (https://www.khronos.org/opengl/wiki/Face_Culling) Problem. Probieren Sie 'glDisable (GL_CULL_FACE)' aus oder schalten Sie das Face Culling nicht ein. – Rabbid76

0

Zuerst alten deprecated api Sie verwenden, weder glBegin/glEnd und GL_QUAD sollte nicht in modernen Anwendungen verwendet werden.

Zweitens empfängt glVertex3fv Array zu einem Element, in Ihrem Code übergeben Sie glVertex3fv(vertices[i ,:]) Scheibe des ursprünglichen Arrays, in der Tat nur das erste Element verwendet wird, so ist es gleich verticies[i]. Dies führte zu falscher Reihenfolge der Vertices für GL_QUAD. Sie müssen den primitiven Typ oder die Reihenfolge der Elemente ändern.

+0

Vielen Dank für Ihre Antwort, können Sie bitte ein kleines Beispiel dafür geben, wie ich den Code für eine moderne OpenGL-Anwendung einstellen soll. – BjkOcean

+0

@BjkOcean Es ist nicht so einfach, Hauptpunkt hier ist die Verwendung von Datenpuffern anstelle vieler Aufrufe 'glVertex'. Es ist besser für Sie, ein Tutorial zu googeln, das auf OpenGL (Version 3+) abzielt. So zum Beispiel: https://learnopengl.com/ – Jeka