Gestion de la caméra et d´une lampe en OpenGL
Ce programme affiche deux scènes simultanées:
  • un objet en vue perspective configurable;
  • une vue en perspective de la pyramide de vision de la première scène.
En particulier il est possible de changer tous les paramètres d’éclairement proposés par OpenGL.
Programme : demoGLUT/demo5.cpp
Sources :demoGLUT/glut-demos-src.zip
Exécutables pour Windows :demoGLUT/glut-demos-win32exe.zip
#include "demo.h" /********************************************************************* * AUTOGENERATED CODE *********************************************************************/ #include "clear.hpp" #include "camera.hpp" #include "lightmodel.hpp" #include "lightposition.hpp" #include "lightcolor.hpp" #include "spotlight.hpp" #include "material.hpp" #include "object.hpp" #include "flush.hpp" /********************************************************************* * FUNCTIONS *********************************************************************/ void lightingDisplay(float,float); void mainDisplay(float,float); void externalDisplay(float,float); /********************************************************************* * GUI DESIGN *********************************************************************/ SCENE(SceneMain,mainDisplay,NULL); SCENE(SceneExternal,externalDisplay,NULL); SPLIT(SplitScene,0,0.5,&SceneMain,&SceneExternal); CONTROL(ControlLightmodel,lightmodelLines); CONTROL(ControlLightposition,lightpositionLines); CONTROL(ControlLightcolor,lightcolorLines); CONTROL(ControlSpotlight,spotlightLines); static tab TabsLighting_Items[4]={ {"Light model",&ControlLightmodel}, {"Light position",&ControlLightposition}, {"Light color",&ControlLightcolor}, {"Spotlight",&ControlSpotlight} }; TABS(TabsLighting,TabsLighting_Items); CONTROL(ControlClear,clearLines); CONTROL(ControlCamera,cameraLines); CONTROL(ControlMaterial,materialLines); CONTROL(ControlObject,objectLines); CONTROL(ControlFlush,flushLines); static tab TabsControl_Items[6]={ {"Clear",&ControlClear}, {"Camera",&ControlCamera}, {"Lighting",&TabsLighting}, {"Material",&ControlMaterial}, {"Object",&ControlObject}, {"Flush",&ControlFlush} }; TABS(TabsControl,TabsControl_Items); SPLIT(SplitRoot,1,0.55,&TabsControl,&SplitScene); /********************************************************************* * CALLBACKS *********************************************************************/ void lightingDisplay(float MouseX,float MouseY){ lightmodelDisplay(MouseX,MouseY); lightpositionDisplay(MouseX,MouseY); lightcolorDisplay(MouseX,MouseY); spotlightDisplay(MouseX,MouseY); } void mainDisplay(float MouseX,float MouseY){ clearDisplay(MouseX,MouseY); cameraDisplay(MouseX,MouseY); materialDisplay(MouseX,MouseY); lightingDisplay(MouseX,MouseY); objectDisplay(MouseX,MouseY); flushDisplay(MouseX,MouseY); } void externalDisplay(float MouseX,float MouseY){ float o=_camera_Floats[0],p=_camera_Floats[1]; float r=_camera_Floats[3],u=r*p*tan(o*PI/360),v=r*tan(o*PI/360),w=-_camera_Floats[4]+r; float rr=_camera_Floats[2],uu=rr*p*tan(o*PI/360),vv=rr*tan(o*PI/360),ww=-_camera_Floats[4]+rr; glClearColor(0.2,0.2,0.2,0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(80,1,0.1,50); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(10,0,0,0,0,0,0,1,0); glRotatef(MouseX,0,1,0); glRotatef(MouseY,1,0,0); glDisable(GL_LIGHTING); glColor3f(0.5,0.8,0.5); glBegin(GL_QUADS); glVertex3f(-u,-v,w); glVertex3f(-u,v,w); glVertex3f(u,v,w); glVertex3f(u,-v,w); glVertex3f(-uu,-vv,ww); glVertex3f(-uu,vv,ww); glVertex3f(uu,vv,ww); glVertex3f(uu,-vv,ww); glEnd(); glColor3f(0.5,0.5,1); glBegin(GL_LINES); glVertex3f(u,v,w); glVertex3f(0,0,-_camera_Floats[4]); glVertex3f(-u,-v,w); glVertex3f(0,0,-_camera_Floats[4]); glVertex3f(u,-v,w); glVertex3f(0,0,-_camera_Floats[4]); glVertex3f(-u,v,w); glVertex3f(0,0,-_camera_Floats[4]); glEnd(); lightingDisplay(MouseX,MouseY); materialDisplay(MouseX,MouseY); objectDisplay(SceneMain.Data.Scene->LastX-SceneMain.Data.Scene->X,SceneMain.Data.Scene->Y-SceneMain.Data.Scene->LastY); glFlush(); glutSwapBuffers(); } /********************************************************************* * MAIN PROGRAM *********************************************************************/ int main(int argc,char *argv[]){ int a=800,b=600,x,y; glutInit(&argc,argv); x=glutGet(GLUT_SCREEN_WIDTH); y=glutGet(GLUT_SCREEN_HEIGHT); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowPosition((x-a)/2,(y-b)/2); glutInitWindowSize(a,b); createWindow(&SplitRoot,"OpenGL demo"); glutMainLoop(); return 0; }

Pour information:
Le code original qui a été traduit par le programme convert:

  1. vider les différents tampons:
    glClearColor(#f0:0.2:1#,#f0:0.2:1#,#f0:0.2:1#,0); glClear(#eGL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT:GL_COLOR_BUFFER_BIT:GL_DEPTH_BUFFER_BIT#); if (#e1:0#) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);

  2. définir la caméra
    glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(#f1:70:179#,#f0.1:1:5#,#f1:1:3#,#f3:5:5#); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,-#f1:3:20#,0,0,0,0,1,0);

  3. définir le modèle d’éclairement
    int enable_lighting=#e1:0#; GLfloat light_model_ambient[]={#f0:0.2:1#,#f0:0.2:1#,#f0:0.2:1#}; glEnable(GL_LIGHT0); if (enable_lighting) glEnable(GL_LIGHTING); else glDisable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT,light_model_ambient); glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,#e0:1#); glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,#e0:1#);

  4. définir la position de la lampe
    GLfloat light_pos[]={#f-10:-2:10#,#f-10:2:10#,#f-10:-10:10#,#e1:0#}; glLightfv(GL_LIGHT0,GL_POSITION,light_pos);

  5. définir les couleurs de la lampe
    GLfloat light_ambient[]={#f0:0:1#,#f0:0:1#,#f0:0:1#,1}; GLfloat light_diffuse[]={#f0:1:1#,#f0:1:1#,#f0:1:1#,1}; GLfloat light_specular[]={#f0:1:1#,#f0:1:1#,#f0:1:1#,1}; glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);

  6. définir le spot de la lampe
    GLfloat spot_direction[]={#f-10:2:10#,#f-10:-2:10#,#f-10:10:10#}; glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spot_direction); glLighti(GL_LIGHT0,GL_SPOT_CUTOFF,#e180:0:1:2:3:4:5:7:10:15:20:25:30:40:50:60:70:80:90#); glLighti(GL_LIGHT0,GL_SPOT_EXPONENT,#i0:0:128#); glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,#f0:1:5#); glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,#f0:0:5#); glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,#f0:0:5#);

  7. définir la matière de l’objet
    int enable_color_material=#e0:1#; if (enable_color_material) glEnable(GL_COLOR_MATERIAL); else glDisable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK,#eGL_AMBIENT_AND_DIFFUSE:GL_EMISSION:GL_AMBIENT:GL_DIFFUSE:GL_SPECULAR#); GLfloat material_ambient[]={#f0:0.1:1#,#f0:0.12:1#,#f0:0.15:1#,1}; GLfloat material_diffuse[]={#f0:0.5:1#,#f0:0.56:1#,#f0:0.45:1#,1}; GLfloat material_specular[]={#f0:0.4:1#,#f0:0.3:1#,#f0:0.2:1#,1}; GLfloat material_emission[]={#f0:0:1#,#f0:0:1#,#f0:0:1#,1}; GLfloat material_shininess=#f0:10:100#; glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,material_ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,material_diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,material_specular); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,material_emission); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,&material_shininess); glColor3f(#f0:1:1#,#f0:0:1#,#f0:0:1#);

  8. définir la géométrie de l’objet
    glRotatef(MouseX,0,1,0); glRotatef(MouseY,1,0,0); glShadeModel(#eGL_FLAT:GL_SMOOTH#); switch(#e8:0:1:2:3:4:5:6:7#){ case 0: glutSolidCube(#f0.1:1:5#);break; case 1: glutSolidSphere(#f0.1:1:5#,#i1:30:200#,#i1:30:200#);break; case 2: glutSolidCone(#f0.1:1:5#,#f0.1:1:5#,#i1:30:200#,#i1:30:200#);break; case 3: glutSolidTorus(#f0.01:0.1:1#,#f0.1:1:5#,#i1:30:200#,#i1:30:200#);break; case 4: glutSolidDodecahedron();break; case 5: glutSolidOctahedron();break; case 6: glutSolidTetrahedron();break; case 7: glutSolidIcosahedron();break; case 8: glutSolidTeapot(#f0.1:1:5#); }

  9. vider la pile d’instruction
    if (#e1:0#) glFlush(); if (#e1:0#) glutSwapBuffers();
Dernière modification le 18/3/2010
Ce document a été traduit de LaTeX par HeVeA