OCaml et la 3D : CamlGL & LablGL


Bonsoir,

Comme demandé récemment par l'un des membres, il est tout à fait possible de faire de la 3D avec OpenGL en OCaml. Il y a principalement 2 bindings.

Exemple d'utilisation de GlCaml

Exemple d'utilisation de GlCaml


Inutile de commencer à donner un cours sur OpenGL, la plupart d'entre vous connaissant déjà, qui plus est il y a tout le nécessaire pour OpenGL en C & C++. Ces deux bibliothèques OCaml ne sont que des bindings, c'est à dire qu'elles appellent les fonctions C classiques en interfaçant par le biais de fonctions OCaml.

Juste pour vous donner une idée, voici un extrait du code correspondant au screenshot ci-dessus. Il s'agissait ici de montrer que ça existe, à quoi ça ressemble et où trouver le nécessaire pour s'y mettre.

let draw_gl_scene () =
    glClear  (gl_color_buffer_bit lor gl_depth_buffer_bit) ;		 (* Clear The Screen And The Depth Buffer *)
    glLoadIdentity  () ;				 (* Reset The View*)
 
    glTranslatef 0.0 0.0 !z ;                   (* move z units out from the screen. *)
 
    glRotatef !xrot 1.0 0.0 0.0 ;		 (* Rotate On The X Axis *)
    glRotatef !yrot 0.0 1.0 0.0 ;		 (* Rotate On The Y Axis *)
 
    glBindTexture gl_texture_2d  texture.(!filter) ;    (* choose the texture to use. *)
 
    glBegin gl_quads ;		                 (* begin drawing a cube *)
 
     (* Front Face  note that the texture's corners have to match the quad's corners  *)
    glNormal3f  0.0  0.0  1.0 ;                               (* front face points out of the screen on z. *)
    glTexCoord2f 0.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)   1.0 ;	 (* Bottom Left Of The Texture and Quad *)
    glTexCoord2f 1.0  0.0 ; glVertex3f  1.0  (-.1.0)   1.0 ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f  1.0   1.0   1.0 ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f (-.1.0)   1.0   1.0 ;	 (* Top Left Of The Texture and Quad *)
 
     (* Back Face *)
    glNormal3f  0.0  0.0 (-.1.0) ;                               (* back face points into the screen on z. *)
    glTexCoord2f 1.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)  (-.1.0) ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f (-.1.0)   1.0  (-.1.0) ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f  1.0   1.0  (-.1.0) ;	 (* Top Left Of The Texture and Quad *)
    glTexCoord2f 0.0  0.0 ; glVertex3f  1.0  (-.1.0)  (-.1.0) ;	 (* Bottom Left Of The Texture and Quad *)
 
     (* Top Face *)
    glNormal3f  0.0  1.0  0.0 ;                               (* top face points up on y. *)
    glTexCoord2f 0.0  1.0 ; glVertex3f (-.1.0)   1.0  (-.1.0) ;	 (* Top Left Of The Texture and Quad *)
    glTexCoord2f 0.0  0.0 ; glVertex3f (-.1.0)   1.0   1.0 ;	 (* Bottom Left Of The Texture and Quad *)
    glTexCoord2f 1.0  0.0 ; glVertex3f  1.0   1.0   1.0 ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f  1.0   1.0  (-.1.0) ;	 (* Top Right Of The Texture and Quad *)
 
     (* Bottom Face   *)     
    glNormal3f  0.0  (-.1.0)  0.0 ;                              (* bottom face points down on y.  *)
    glTexCoord2f 1.0  1.0 ; glVertex3f (-.1.0)  (-.1.0)  (-.1.0) ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f  1.0  (-.1.0)  (-.1.0) ;	 (* Top Left Of The Texture and Quad *)
    glTexCoord2f 0.0  0.0 ; glVertex3f  1.0  (-.1.0)   1.0 ;	 (* Bottom Left Of The Texture and Quad *)
    glTexCoord2f 1.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)   1.0 ;	 (* Bottom Right Of The Texture and Quad *)
 
     (* Right face *)
    glNormal3f  1.0  0.0  0.0 ;                               (* right face points right on x. *)
    glTexCoord2f 1.0  0.0 ; glVertex3f  1.0  (-.1.0)  (-.1.0) ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f  1.0   1.0  (-.1.0) ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f  1.0   1.0   1.0 ;	 (* Top Left Of The Texture and Quad *)
    glTexCoord2f 0.0  0.0 ; glVertex3f  1.0  (-.1.0)   1.0 ;	 (* Bottom Left Of The Texture and Quad *)
 
     (* Left Face *)
    glNormal3f (-.1.0)  0.0  0.0 ;                               (* left face points left on x. *)
    glTexCoord2f 0.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)  (-.1.0) ;	 (* Bottom Left Of The Texture and Quad *)
    glTexCoord2f 1.0  0.0 ; glVertex3f (-.1.0)  (-.1.0)   1.0 ;	 (* Bottom Right Of The Texture and Quad *)
    glTexCoord2f 1.0  1.0 ; glVertex3f (-.1.0)   1.0   1.0 ;	 (* Top Right Of The Texture and Quad *)
    glTexCoord2f 0.0  1.0 ; glVertex3f (-.1.0)   1.0  (-.1.0) ;	 (* Top Left Of The Texture and Quad *)
 
    glEnd  ();                                     (* done with the polygon. *)
 
    xrot := !xrot +. !xspeed;		                 (* X Axis Rotation	 *)
    yrot := !yrot +. !yspeed		                 (* Y Axis Rotation *)

PS : aucun des deux ne semble être encore maintenu, toutefois GlCaml prend en charge les versions d'OpenGL jusqu'à 2.1 + extensions ARB et spécifiques aux vendeurs. GlCaml embarque un binding minimal de la SDL, moins complet que OCamlSDL que j'ai présenté dans un post précédent.

, , , , ,

  1. #1 by nicolas66 - juillet 2nd, 2009 at 11:14

    Un autre lien sympa avec quelques exemples d'utilisation d'Ocaml+OpenGL :

    http://www.ffconsultancy.com/ocaml/index.html

    Hope this helps ;)

  2. #2 by blue prawn - décembre 2nd, 2009 at 00:37

    Il existe un troisième binding beaucoup plus abouti que les 2 cités :
    http://www.linux-nantes.fr.eu.org/~fmonnier/OCaml/GL/

    Celui-ci est encore activement maintenu, et c'est probablement le seul à supporter les VBO.

    Les fonctions VBO sont présentes dans glcaml, mais comme il est généré automatiquement il ne fait pas la différence dans le C entre un paramètre qui est passé en pointeur (pour donner plusieurs éléments) et un pointeur utilisé pour renvoyer un résultat. C'est ainsi le cas par exemple avec la fonction glGenBuffers qui renvoie un id de buffer VBO, et qui dans glcaml ne pourra pas fonctionner, randant par la même impossible l'utilisation des VBO.

(will not be published)

  1. No trackbacks yet.