2017-12-23 2 views
1

basic.pyIch wollte zweimal eine Klasse-Objekt verwenden, aber es passiert nicht

from OpenGL.GL import* 
from OpenGL.GLU import* 
from OpenGL.GLUT import* 
import sys 

class Draw: 
    # def draw_func(self): 
    #  pass 

    def draw(self): 
     glutInit(sys.argv) 
     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) 
     glutInitWindowSize(1000,1000) 
     glutInitWindowPosition(50,50) 
     glutCreateWindow(b'Cycle') 
     glutDisplayFunc(self.draw_func) 
     glClearColor(0,0,0,1) 
     gluOrtho2D(-500,500,-500,100) 
     glutMainLoop() 

cycle.py

class Circle(Draw): 
    def __init__(self,xv,yv): 
     self.xv=xv 
     self.yv= yv 

    def draw_circle(self): 
     glClear(GL_COLOR_BUFFER_BIT) 
     glColor3f(1, 0, 0) 
     glPointSize(3) 
    for t in arange(self.xv, self.yv, 0.001): 
     x = 50 * sin(t) 
     y = 50 * cos(t) 
     glBegin(GL_POINTS) 
     glVertex2f(x, y) 
     glEnd() 
     glFlush() 

    def draw_func(self): 
     self.draw_circle() 

cycle = Circle(100,200) 
cycle.draw() 
cycle = Circle(220,300) 
cycle.draw() 

Here I PyOpenGL bin mit Grafiken zu lernen, und ich wollte den Kreis verwenden Objekt zweimal, um 2 Kreise zu zeichnen, aber es zeichnet nur einen. Ich weiß nicht, wo mir mein Wissen fehlt. Bitte schlagen Sie mir auch irgendwelche Tutorials vor, um pyOpenGl zu lernen. Ich habe den guten nicht gefunden.

Antwort

1

Die Anweisung

glClear(GL_COLOR_BUFFER_BIT) 

löscht die komplette Farbebene des frambuffer. Das bedeutet, dass Sie den Frambuffer löschen, bevor Sie den zweiten Kreis zeichnen.

Entfernen Sie glClear(GL_COLOR_BUFFER_BIT) von der draw Methode und tun Sie es zu Beginn der Zeichnung Anweisungen. Weiter glFlush sollte nach den Zeichenanweisungen erfolgen.

Siehe glClear:

glClear sets the bitplane area of the window to values previously selected by glClearColor .

Ihre Architektur nicht richtig ist. Sie sollten Circle nicht von Draw ableiten, aber Draw sollte Circle verwenden.
Das bedeutet, dass Sie ein class Draw erstellen müssen, das die Initialisierungen durchführt und die Hauptschleife verarbeitet. Das andere getrennte class Circle zieht einen einzigen Kreis:

class Circle: 
    def __init__(self,xv,yv): 
     self.xv=xv 
     self.yv= yv 

    def draw(self): 
     glColor3f(1, 0, 0) 
     glPointSize(3) 
     for t in arange(self.xv, self.yv, 0.001): 
     x = 50 * sin(t) 
     y = 50 * cos(t) 
     glBegin(GL_POINTS) 
     glVertex2f(x, y) 
     glEnd() 

class Draw: 
    def __init__(self,cx,cy): 
     self.cx = cx 
     self.cy = cy 

    def draw(self): 
     glutInit(sys.argv) 
     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) 
     glutInitWindowSize(self.cx,self.cy) 
     glutInitWindowPosition(50,50) 
     glutCreateWindow(b'Cycle') 
     glutDisplayFunc(self.draw_loop) 
     glClearColor(0,0,0,1) 
     gluOrtho2D(-self.cx/2,self.cx/2,-self.cy/2,self.cy/2) 
     glutMainLoop() 

    def draw_loop(self): 
     glClear(GL_COLOR_BUFFER_BIT) 

     cycle = Circle(100,200) 
     cycle.draw() 
     cycle = Circle(220,300) 
     cycle.draw() 

     glFlush() 
     glutPostRedisplay()   

wnd = Draw(1000,1000) 
wnd.draw() 
+0

es Fehler in der ersten Zeile hat ‚glClear (GL_COLOR_BUFFER_BIT) Zyklus = Kreis (100,200) cycle.draw() Zyklus = Kreis (220,300) cycle.draw() ' –

+0

@BishwaKarki Welchen Fehler haben Sie bekommen? Der Code hat sich nicht geändert. Nur die Reihenfolge der Anweisungen hat sich geändert. - Siehe die Änderungen der Antwort. – Rabbid76

+0

OpenGL.error.GLError: GLError ( \t err = 1282 \t description = b'invalid Betrieb‘, \t baseOperation = glClear, \t cArguments = (GL_COLOR_BUFFER_BIT,) ) Dies ist der Fehler –

Verwandte Themen