billwatterson
Messages postés3Date d'inscriptionjeudi 17 avril 2003StatutMembreDernière intervention24 janvier 2005
-
23 janv. 2005 à 16:19
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 2007
-
25 janv. 2005 à 22:35
Bonjour,
* Je réalise actuellement un labyrinthe en 3D sous Glut dans lequel on doit se déplacer.
J'ai eu beau regarder les différentes sources sur ce sujet, je n'ai toujours pas compris le principe des déplacements.
* Les déplacements sont : soit j'avance/recule soit je tourne soit les deux.
* Pour cela j'utilise la fonction gluLookAt en sachant que la hauteur (axe Z) ne varie pas
(z = 0.5).
d'où : gluLookAt(posCamX,posCamY,0.5,ptVueX,ptVueY,0.5,0,0,1.0);
* pour avancer :
pas=0.05;
posCamX = posCamX + pas*(ptVueX-posCamX);
posCamY = posCamY + pas*(ptVueY-posCamY);
ptVueX = ptVueX + pas*(ptVueX-posCamX);ptVueY ptVueY + pas*(ptVueY-posCamY); > équivaut à une translation de la position et du point de vue en gardant la même distance entre les 2 points
* pour reculer : idem avec - au lieu du +
* pour tourner :
angle=PI/50;
ptVueX = posCamX + (ptVueX-posCamX)*cos(angle) - (ptVueY-posCamY)*sin(angle);ptVueY posCamY + (ptVueX-posCamX)*sin(angle) + (ptVueY-posCamY)*cos(angle);> équivaut à une rotation de centre posCam
En avançant/reculant, ça marche mais au bout d'un moment, c'est comme si le pas de déplacement diminuait...(peu importe sa valeur)
Et pour la rotation, ça marche un peu comme ça veut...
Je sais que tout ça c'est des maths mais les maths et moi ça fait 4...
Si vous avez ne serait-ce qu'une ombre d'explication n'hésitez pas!!
Le principe est simple (du moment que tu te fais un petit dessin et que
tu connais le cercle trigonométrique ;)) : ça se résume en ces quelques
lignes :
gluLookAt(pos_x, 2.0, pos_z,
pos_x + cos(angle), 1.50, pos_z + sin(angle),
0.0, 1.0, 0.0);
switch(key)
{
case GLUT_KEY_UP:
pos_x += cos(angle)*0.1;
pos_z += sin(angle)*0.1;
break;
case GLUT_KEY_DOWN:
pos_x -= cos(angle)*0.1;
pos_z -= sin(angle)*0.1;
break;
case GLUT_KEY_LEFT:
angle -= 0.2;
break;
case GLUT_KEY_RIGHT:
angle += 0.2;
break;
}
Déjà une première précision, j'utilise l'axe Y comme pointant vers le
haut, donc tout se fait selon le plan (x, z). le point (pos_x, pos_z)
correspond à la position de la caméra, la variable angle à l'angle de
rotation de la caméra.
Lors d'un appui sur la touche fléche avant/arrière, on translate le
point (pos_x, pos_z) selon un vecteur égal à 0.1*(cos(angle),
sin(angle)), autrement dit selon un vecteur avec une norme petite et
qui est colinéaire au vecteur qui va de la position de la caméra au
point visé par la caméra.
Celui-ci se trouve logiquement en (pos_x + cos(angle), pos_z + sin(angle)) (fais un dessin si tu ne vois pas pourquoi).
J'espère avoir été clair ;)
---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Funto66
Messages postés1267Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention28 février 20074 25 janv. 2005 à 22:35
Pour avancer et tourner en même temps, avec le clavier, ben il faudrait
que tu puisses répondre à tous les évènements qd ils se produisent...
Bref je ne sais pas si c'est possible avec GLUT :(
Pour ce qui est de la souris, faut que tu fasses le déplacement en
fonction d'une différence entre un point d'origine O où se trouve la
souris et sa position actuelle...
Bref, essaie un peu par toi-même ;)
---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/