http://www.lighthouse3d.com/opengl/displaylists/
Ennek a tutorialnak a forrását átírtam C++-ból, pythonba. Van benne egy kis "benchmark", ami azt mutatta, hogy ugyan olyan gyorsan fut a pythonos változat, mint a forgatott exe. Jó dolog ez a display list dolog, átemelem a főprogramba. A tárgy mozgatását imitálni fogom a kamera mozgatásával.
http://www.wxpython.org/docs/api/wx.PaintDC-class.html
NetBeans átvert, megjelölt egy változót, hogy felesleges és kiszedtem gondolkodás nélkül. Majd jöttek a bugok, persze nem kapcsoltam össze, mert közben elhanyagoltam az egész projectet. Ma kicsit átnéztem és megtaláltam a hibát. Visszaraktam azt a változót és egyből jó lett. Még annyi hiba van, hogy a resize event kb lenullázza a tárgyam állapotát.Például elforgatom 30 fokkal,húzok az ablakon a tárgy visszaugrik a 0 forgatáshoz. Valahogy konkzekvensebben kéne kezelnem az állapotait, lehetőleg globális változók nélkül.
Nem vacakolok feltöltéssel, itt a kód:
## ----------------------------------- ## Version: Hierarchical Display lists ## Antonio Ramires Fernandes ## www.lighthouse3d.com ## ----------------------------------- from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from math import * angle = 0.0 x, y, z = 0.0, 1.75, 5 lx, ly, lz = 0.0, 0.0, -1.0 ratio = 1.0 frame, time, timebase = 0, 0, 0 def changeSize(w, h): ## Prevent a divide by zero, when window is too short ## (you cant make a window of zero width). if(h == 0): h = 1 ratio = 1.0 * w / h ## Reset the coordinate system before modifying glMatrixMode(GL_PROJECTION) glLoadIdentity() ## Set the viewport to be the entire window glViewport(0, 0, w, h) ## Set the clipping volume gluPerspective(45,ratio,1,1000) glMatrixMode(GL_MODELVIEW) glLoadIdentity() global x, y, z, lx, ly, lz gluLookAt(x, y, z, x + lx, y + ly, z + lz, 0.0, 1.0 ,0.0) def createDL(): ##GLuint snowManDL,loopDL snowManDL = glGenLists(1) loopDL = glGenLists(1) glNewList(snowManDL,GL_COMPILE) drawSnowMan() glEndList() glNewList(loopDL, GL_COMPILE) for i in xrange(-3, 3): for j in xrange(-3, 3): glPushMatrix() glTranslatef(i*10.0, 0, j * 10.0) glCallList(snowManDL) glPopMatrix() glEndList() return loopDL def initScene(): glEnable(GL_DEPTH_TEST) global DLid DLid = createDL() def drawSnowMan(): glColor3f(1.0, 1.0, 1.0) ##Draw Body glTranslatef(0.0 ,0.75, 0.0) glutSolidSphere(0.75, 20, 20) ## Draw Head glTranslatef(0.0, 1.0, 0.0) glutSolidSphere(0.25, 20, 20) ## Draw Eyes glPushMatrix() glColor3f(0.0, 0.0, 0.0); glTranslatef(0.05, 0.10, 0.18); glutSolidSphere(0.05, 10, 10); glTranslatef(-0.1, 0.0, 0.0); glutSolidSphere(0.05, 10, 10); glPopMatrix(); ## Draw Nose glColor3f(1.0, 0.5, 0.5) glRotatef(0.0,1.0, 0.0, 0.0) glutSolidCone(0.08, 0.5, 10,2) def renderScene(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ## Draw ground glColor3f(0.9, 0.9, 0.9) glBegin(GL_QUADS) glVertex3f(-100.0, 0.0, -100.0) glVertex3f(-100.0, 0.0, 100.0) glVertex3f( 100.0, 0.0, 100.0) glVertex3f( 100.0, 0.0, -100.0) glEnd() ## Draw 36 SnowMen glCallList(DLid) global frame, timebase, time frame = frame + 1 time = glutGet(GLUT_ELAPSED_TIME) if (time-timebase > 1000): glutSetWindowTitle( str( frame * 1000.0 / (time - timebase) )) timebase = time frame = 0 glutSwapBuffers() def orientMe(ang): global x, y, z, lx, ly, lz lx = sin(ang) lz = -cos(ang) glLoadIdentity() gluLookAt(x, y, z, x + lx, y + ly, z + lz, 0.0, 1.0, 0.0) def moveMeFlat(i): global x, y, z, lx, ly, lz x = x + i*(lx)*0.1 z = z + i*(lz)*0.1 glLoadIdentity() gluLookAt(x, y, z, x + lx, y + ly, z + lz, 0.0, 1.0, 0.0) def inputKey(c, x, y): global angle if c == 'a': angle = angle - 0.01 orientMe(angle) if c == 's': angle = angle + 0.01 orientMe(angle) if c == 't': moveMeFlat(1) if c =='g': moveMeFlat(-1) def main(): glutInit() glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA) glutInitWindowPosition(100,100) glutInitWindowSize(300,300) glutCreateWindow("SnowMen") initScene() glutKeyboardFunc(inputKey) glutDisplayFunc(renderScene) glutIdleFunc(renderScene) glutReshapeFunc(changeSize) if __name__ == '__main__': main() glutMainLoop()