Gestion de la caméra et d´une lampe en OpenGL
Ce programme affiche deux scènes simultanées:
Fichier : demoGLUT/demo5.cpp #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:
Ce document a été traduit de LaTeX par HeVeA |