Bouger la caméra avec la souris (fps)

Signaler
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008
-
Messages postés
5
Date d'inscription
mardi 6 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2009
-
Bonjour, je souhaiterais que, lorsque que je bouge la souris, ma scène en OpenGL tourne de la même manière, comme dans un FPS.

J'ai donc le code suivant dans la fonction main :
<ol><li class="li1">
glutDisplayFunc(display);
</li><li class="li1">
glutKeyboardFunc(keyboard);
</li><li class="li1">
glutPassiveMotionFunc(souris_passif);
</li><li class="li1">
glutIdleFunc(core);
</li><li class="li1">
glutMainLoop();
</li></ol>

ma fonction souris_passif étant :
<dd>
void souris_passif(int x,int y){
</dd><dd>
float vitesse_souris=0.1f;
</dd><dd>
 
</dd><dd>
angle_cam.x+=float(y-Y_ORG)*vitesse_souris;
</dd><dd>
angle_cam.y+=float(x-X_ORG)*vitesse_souris;
</dd><dd>
 
</dd><dd>
// On met les angles dans l'intervalle [0,360]
</dd><dd>
if(angle_cam.x>=360.0)
</dd><dd>
angle_cam.x-=360.0;
</dd><dd>
 
</dd><dd>
if(angle_cam.y>=360.0)
</dd><dd>
angle_cam.y-=360.0;
</dd><dd>
 
</dd><dd>
if(angle_cam.x<0.0)
</dd><dd>
angle_cam.x+=360.0;
</dd><dd>
 
</dd><dd>
if(angle_cam.y<0.0)
</dd><dd>
angle_cam.y+=360.0;
</dd><dd>
 
</dd><dd>
 
</dd><dd>
// On repositionne le curseur de la souris
</dd><dd>
SetCursorPos(X_ORG,Y_ORG);
</dd><dd>
glutPostRedisplay(); //(J'ai essayé sans, ça ne change rien)
</dd><dd>
}
</dd>

Le problème est le suivant : quand je lance mon programme j'ai le droit à un écran sans image

 
Que faire pour résoudre le problème

 
Merci d'avance

 
NC

6 réponses

Messages postés
212
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
28 mai 2011
2
Tu es sur que le probleme vien de cette fonction? Il se peut que l'erreur est ailleur

<hr size="2" width="100%" />Trafic web gratuit!!!
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

oui : si je supprime passivemotionfunc (donc l'appel à la fonction), cela fonctionne.
Messages postés
212
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
28 mai 2011
2
t'as essayé d'enlever completement le corps de cette fonction, juste
pour etre sur que c'est pas ton code de rotation qui marche mal?

<hr size="2" width="100%" />Trafic web gratuit!!!
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Statut
Membre
Dernière intervention
11 août 2008

Tu utilises gluLookAt ? Que vois-tu exactement si tu retire passiveMotionFunc ? C'est peut-être un problème dans les transformations matricielles ?

neodelphi
Messages postés
154
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
28 septembre 2008

si je supprime le corps de la fonction, tout est normal.

et j'utilise ceci pour positionner la caméra (à vrai dire je n'ai jamais bien compris la structure de glulookat) :
glLoadIdentity();
  glRotatef(angle_cam.x,1.0,0.0,0.0);
  glRotatef(angle_cam.y,0.0,1.0,0.0);
  glRotatef(angle_cam.z,0.0,0.0,1.0);
  glTranslatef(pos_cam.x,pos_cam.y,pos_cam.z);
  glScalef(1.5,1.5,1.5);
  glPushMatrix();

Mais ce qui est bizarre, c'est que l'écran est vide quand la fonction a le corps. En effet, c'est comme s'il n'y avait jamais dans le programme de demande d'affichage.
Messages postés
5
Date d'inscription
mardi 6 novembre 2007
Statut
Membre
Dernière intervention
21 novembre 2009

Problème de déplacement avec la caméra:
void camera()
{
    Form1->UpX  = -sin(Form1->latitude)*sin(Form1->longitude);
    Form1->UpY = cos(Form1->latitude);
    Form1->UpZ = -sin(Form1->latitude)*cos(Form1->longitude);

    Form1->OeilX = Form1->Vise*cos(Form1->latitude)*sin(Form1->longitude)+Form1->X;
    Form1->OeilY = Form1->Vise*sin(Form1->latitude)+Form1->Y;
    Form1->OeilZ = Form1->Vise*cos(Form1->latitude)*cos(Form1->longitude)+Form1->Z;
    Form1->UpX  = -sin(Form1->latitude)*sin(Form1->longitude);
    Form1->UpY = cos(Form1->latitude);
    Form1->UpZ = -sin(Form1->latitude)*cos(Form1->longitude);
// Déplacement caméra
    glLoadIdentity();
    gluLookAt(Form1->X,Form1->Y,Form1->Z,
              Form1->OeilX,Form1->OeilY,Form1->OeilZ,
              Form1->UpX,Form1->UpY,Form1->UpZ);
}
 Pour un déplacement par exemple en avance:
void __fastcall TForm1::Avance()
{
    Form1->X+=(Form1->OeilX-Form1->X)/(2*Form1->Vise);
    Form1->Z+=(Form1->OeilZ-Form1->Z)/(2*Form1->Vise);
}