Bonjour à tous,
Je suis en train d'essayer de créer un changement de point de vu dans un projet MFC, l'idée est qu'avec le mouvement en X et Y de la sourie (quand le clic gauche est actif) fasse tourner la camera via la fonction GluLookAt autour d'un point central et toujours orienté vers celui ci.
Ma fonction GlutLookAt est utilisée tel que suit :
Code :
- gluLookAt(pDoc->Eyex,pDoc->Eyey,pDoc->Eyez,pDoc->Eyex+pDoc->Directx,pDoc->Eyey+pDoc->Directy,pDoc->Eyez+pDoc->Directz,0,1,0);
|
La position de la caméra est donc donnée par Eyex, Eyey et Eyez.
Le point autour duquel je voudrai faire cette rotation est donné par les coordonnées center_x, center_y et center_z.
Ma fonction pour faire cela est telle que suis :
Code :
- void CMyView::OnMouseMove(UINT nFlags, CPoint point)
- {
- if(IsLButtonDown==TRUE)
- {
- // Get a pointer to the document object
- COpenGLViewClassDoc * pDoc = GetDocument();
- double angle_x, angle_z, r;
- r = sqrt((pDoc->Eyex - pDoc->center_x)*(pDoc->Eyex - pDoc->center_x) + (pDoc->Eyey - pDoc->center_y) * (pDoc->Eyey - pDoc->center_y) + (pDoc->Eyez - pDoc->center_z) * (pDoc->Eyez - pDoc->center_z));
- angle_x = atan( (pDoc->center_y - pDoc->Eyey)/(pDoc->center_x - pDoc->Eyex) );
- angle_z = atan( (pDoc->center_z - pDoc->Eyez)/(pDoc->center_y - pDoc->Eyey) );
- angle_x -= (point.x - CurrentPosition.x) / 20.0 ;
- angle_z -= (point.y - CurrentPosition.y) / 20.0 ;
- pDoc->Eyex = r * cos(angle_x);
- pDoc->Eyey = r * sin(angle_x);
- pDoc->Eyez = r * sin(angle_z);
- CurrentPosition = point ;
- InvalidateRect(FALSE);
- }
- else
- {
- CView::OnMouseMove(nFlags, point);
- }
- }
|
l'angle_x est l'angle entre le vecteur X et le vecteur [centre, eye] dans le plan X,Y
l'angle_z est l'angle entre le plan X,Y et le vecteur [centre, eye] dans le plan Z, [centre; projection de eye sur plan X,Y]
J'essaye pour l'instant d'avoir la bonne trajectoire pour les coordonnées X,Y,Z de GluLookAt, je n'ai pas encore codé la partie d'orientation.
Mes projections me semblent bonne mais au final le script fait un peu n'importe quoi à l'écran (c'est bien qu'un problème de mathématique, car ma fonction OnMouseMove fonctionne correctement quand je fait faire à ma caméra que des translations dans un plan).
Avez vous une idée d'où cela peux venir ? Où une autre manière de faire ?
Merci d'avance pour votre aide.