Exemple PyOpenGL

Animation 3D crée avec PyOpenGL

   On peut créer des animations 3D avec VPython mais aussi avec PyOpenGL:

Cela permet de se familiariser avec OpenGL qui est compatible avec Android, tout en restant sur une interface en Python.

En fait, la 3D pour Android, c'est plutôt OpenGLES, la version allégée de OpenGL ...

OpenGL est  plus puissant que VPython...

Voilà un exemple, c'est un programme PYTHON qui génère une animation qui varie à l'infini... Il s'agit ici bien évidemment d'un extrait :

Et le code:

# -*- coding: cp1252 -*

import pygame

from pygame.locals import *

from OpenGL.GL import *

from OpenGL.GLU import 

import random

def cube(trans_abs,trans_ordo,trans_cote):

    x=trans_abs

    y=trans_ordo

    z=trans_cote   

    # liste des sommets

    sommets=((1+x,-1+y,-1+z),(1+x,1+y,-1+z),(-1+x,1+y,-1+z),(-1+x,-1+y,-1+z),

         (1+x,-1+y,1+z),(1+x,1+y,1+z),(-1+x,-1+y,1+z),(-1+x,1+y,1+z))

    # liste des segments

    segments=((0,1),(0,3),(0,4),(2,1),

    (2,3),(2,7),(6,3),(6,4),

    (6,7),(5,1),(5,4),(5,7))

    # liste des faces

    faces=((0,1,2,3),(3,2,7,6),(6,7,5,4),(4,5,1,0),(1,5,7,2),(4,0,3,6))

    # liste des couleurs

    couleurs=((1,0,0),(0,1,0),(0,0,1),(0,1,0),(1,1,1),(0,1,1),

    (1,0,0),(0,1,0),(0,0,1),(1,0,0),(1,1,1),(0,1,1))


    # dessine des carrés

    glBegin(GL_QUADS)

    for face in faces:

        x=0

        for som in face:

            x=x+1

            glColor3fv(couleurs[x])          

            glVertex3fv(sommets[som])

    glEnd()

    # dessine des segments

    glBegin(GL_LINES)

    for segment in segments:

        for som in segment:

            glVertex3fv(sommets[som])

    glEnd()

  

def main():

    pygame.init()

    display = (1000,600)

    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

    gluPerspective(60, (display[0]/display[1]), 0.1 , 220.0

    glTranslatef(0 , 0 , -200 

    glRotate(0,0,0,0)


    depasse = 0

    bouge_x=0

    bouge_y=0


    while depasse==0:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                quit()                    

        m = glGetDoublev(GL_MODELVIEW_MATRIX)

        #print(m)

        cote_cam = m[3][2]


        print(cote_cam)


        if cote_cam<-1:

            #depasse= 1

            glTranslatef(0 , 0,-200)

        

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)


        glTranslatef(bouge_x , bouge_y , 2 )

        

        cube(10,-10,-50)

        cube(-10,15,50)

        cube(-20,45,10)

       

        pygame.display.flip()

        pygame.time.wait(30)

        

main()

pygame.quit()