Bonjour,
Pour m'entrainer j'aimerais programmer un système solaire en openGL avec C++. Le système solaire marche très bien. Ce qui me pose problème c'est de pouvoir faire tourner la caméra autour du système solaire, un peu comme Homeworld (le jeu) ou le principe de rotation de warcraft III (pas de déplacement de caméra, mais bien de rotation). Je précise que la rotation présentée dans les lignes de code qui suivent sont des rotations basées sur la position d'origine de la caméra (je me contente de changer l'angle et de recalculer en fonction de la position de départ).
Pour ce faire, j'utilise deux méthodes :
- Le clavier ("q et d" pour la rotation horizontal et "z et s" pour la rotation verticale).
- La souris (les deux rotations effectuées en même temps)
La rotation devant se faire autour d'un point fixe, je me contente d'un
gluLookAt(cam.x , cam.y , cam.z , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0);
Dans les deux cas, la rotation horizontale fonctionne parfaitement :
Clavier :
1 2 3 4 5 6 7 8 9 10
| case 'd':
anglex -= vitesse_rotation;
cam.x = cos(anglex)*cam.base_x+cam.base_z*(-sin(anglex));
cam.z = sin(anglex)*cam.base_x+cam.base_z*cos(anglex);
break;
case 'q':
anglex += vitesse_rotation;
cam.x = cos(anglex)*cam.base_x+cam.base_z*(-sin(anglex));
cam.z = sin(anglex)*cam.base_x+cam.base_z*cos(anglex);
break; |
Souris :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| if(cam.rotate_status)
{
// traitement du mouvement de la souris en mode rotation
if(x > cam.mouse_x)
{
anglex -= vitesse_rotation_souris;
moove = true;
}
else if(x < cam.mouse_x)
{
anglex += vitesse_rotation_souris;
moove = true;
}
if(moove)
{
if(anglex > 0.0001 || anglex < -0.0001)
{
cam.mouse_x = x;
cam.x = cos(anglex)*cam.base_x+cam.base_z*(-sin(anglex));
cam.z = sin(anglex)*cam.base_x+cam.base_z*cos(anglex);
}
else
{
cam.x = cam.base_x;
}
} |
Le problème arrive quand on veut faire une rotation verticale. Avec le clavier un problème survient dès lors que la coordonnée Z de la caméra devient négative o_O. Une sorte de symétrie à alors lieu selon le plan ZY (ce qui est à gauche passe à droite) et vice versa.
Avec la souris c'est encore plus calamiteux puisque de façon très récurrente la caméra se déplace aléatoirement d'un bout à l'autre de la scène... Pourtant le même calcul est effectué :
Clavier :
1 2 3 4 5 6 7 8 9 10
| case 'z':
angley -= vitesse_rotation;
cam.y = cos(angley)*cam.base_y+cam.base_z*(-sin(angley));
cam.z = sin(angley)*cam.base_y+cam.base_z*cos(angley);
break;
case 's':
angley += vitesse_rotation;
cam.y = cos(angley)*cam.base_y+cam.base_z*(-sin(angley));
cam.z = sin(angley)*cam.base_y+cam.base_z*cos(angley);
break; |
Souris :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| if(y > cam.mouse_y)
{
angley -= vitesse_rotation_souris;
moove = true;
}
else if(y < cam.mouse_y)
{
angley += vitesse_rotation_souris;
moove = true;
}
if(moove)
{
cam.mouse_y = y;
cam.y=cos(angley)*cam.base_y+cam.base_z*(-sin(angley));
cam.z=sin(angley)*cam.base_y+cam.base_z*cos(angley);
} |
Je commence un peu à m'arracher les cheveux...
Partager