2017-12-23 17 views
1

basic.py 일어나고 아니에요나는 두 번 객체 클래스를 사용하고 싶어하지만

나는 그래픽을 배울 수 pyOpenGl를 사용하고 여기에

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

cycle.py 난 원을 사용하고 싶었

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

2 개의 원을 그릴 때 두 번 대상을 지정하지만 하나만 그립니다. 나는 내 지식이 부족한 곳을 모른다. 또한 pyOpenGl을 배우려면 자습서를 제안 해주십시오. 좋은 것을 찾지 못했습니다.

답변

1

명령

glClear(GL_COLOR_BUFFER_BIT) 

는 frambuffer의 전체 색상 평면을 지 웁니다. 즉, 두 번째 원을 그리기 전에 frambuffer를 지우는 것입니다.

draw 방법에서 glClear(GL_COLOR_BUFFER_BIT)을 제거하고 그림 지시의 시작 부분에서 수행하십시오. 추가 glFlush은 드로잉 지침 후에 수행해야합니다.

glClear를 참조하십시오

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

아키텍처가 적절하지 않습니다. CircleDraw에서 파생해서는 안되지만 DrawCircle을 사용해야합니다.
즉, 초기화를 수행하고 메인 루프를 처리하는 class Draw을 만들어야 함을 의미합니다. 다른 class Circle 단일 원 무 분리 : 그것은 첫 번째 줄에 오류 준

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

를 'glClear (GL_COLOR_BUFFER_BIT) 사이클 = (100,200) 원형 cycle.draw() 주기 = 원 (220,300) cycle.draw() ' –

+0

@BishwaKarki 어떤 오류가 있었습니까? 코드는 변경되지 않았습니다. 지침의 순서 만 바뀌 었습니다. - 답변 변경 사항을 확인하십시오. – Rabbid76

+0

OpenGL.error.GLError : GLError ( \t ERR = 1282 = b'invalid 동작 ' \t 설명 \t baseOperation = glClear, \t cArguments = (GL_COLOR_BUFFER_BIT) ) 이것은 에러를 생성 –