Bonjour,
Je suis sur OpenSceneGraph, et je bosse en ce moment sur un petit systeme permettant de maintenir la camera fixe (statique) par rapport à un element de la scene, qui lui est mobile (rotation et translation).
Ma cible bouge donc en 3D.
Mon approche est de récuperer les données de mouvement/rotation de ma cible pour ensuite les appliquer à ma camera.
En translation tout se passe tres bien.
En rotation les choses se compliquent : dans l'état actuel, et sans comprendre pourquoi, mon code ne permet à ma camera d'etre vraiment fixe que si ma cible ne pivote que selon un axe "pur" (donc (1,0,0) ou (0,1,0) ou (0,0,1) ).
Si l'axe de rotation de la cible se décompose selon 2 ou 3 composantes, ma camera montre un réel décalage entre le mouvement de la cible et son mouvement.
Note importante : la rotation de la camera doit obligatoirement se décomposer en 2 phases : rotation et translation. En effet la rotation permet d'avoir la meme orientation, et la translation permet de se repositionner au meme point que la frame d'avant.
Imaginez que la camera est à une certaine distance de la cible... quand la cible tourne, la camera va tourner selon le meme angle, mais va aussi devoir se translater pour revenir aux meme coordonées relatives du point de vue de la cible.
Si vous n'arrivez pas à suivre n'hesitez pas je ferai plus clair...
Bon, voilà le bout de code qui calcule la rotation :
Voilou.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
28
29
30
31
32
33 //ROTATION osg::Quat qq ; //Target node have to be a PAT or a MT. Else no rotation will be applied if((pat || mt) && _setRefRot) { if(pat) qq = pat->getAttitude(); else qq = mt->getMatrix().getRotate(); osg::Quat _q_ = qq * _QuatActual.inverse(); // = rotation from qq to QuatActual _q_.inverse(); osg::Matrix matrot = osg::Matrix::identity(); osg::Matrix mattrans = osg::Matrix::identity(); osg::Matrix mattransi = osg::Matrix::identity(); mattrans.makeTranslate(mat.getTrans() - getEyePoint()); //DISPVECT("CamToNode",(mattrans.getTrans())); mattransi.invert(mattrans); matrot.makeRotate(_q_); osg::Matrix Rot = mattransi * matrot * mattrans; _eye -= Rot.getTrans(); //add vector of translation to keep camera motionless relative to the node _rotation *= _q_; //apply rotation to camera _QuatActual = qq; }
Si vous avez des idées.... je prend !
Merci
(Merci à Loka pour sa restauration )
Partager