Bouger la caméra avec la souris (fps)

nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008 - 20 avril 2007 à 22:01
Grizou0 Messages postés 5 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 21 novembre 2009 - 19 mars 2008 à 11:47
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

goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 2
20 avril 2007 à 22:16
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!!!
0
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
20 avril 2007 à 22:55
oui : si je supprime passivemotionfunc (donc l'appel à la fonction), cela fonctionne.
0
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 2
21 avril 2007 à 10:47
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!!!
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
21 avril 2007 à 12:03
Tu utilises gluLookAt ? Que vois-tu exactement si tu retire passiveMotionFunc ? C'est peut-être un problème dans les transformations matricielles ?

neodelphi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nisaloncaje Messages postés 154 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 28 septembre 2008
21 avril 2007 à 15:45
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.
0
Grizou0 Messages postés 5 Date d'inscription mardi 6 novembre 2007 Statut Membre Dernière intervention 21 novembre 2009
19 mars 2008 à 11:47
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);
}
0
Rejoignez-nous