Bien le bonjour,
J'essaie actuellement d'implémenter une classe Camera dont voici la definition:
et l'implémentation, le camera n'est soumis à aucune contrainte physique:
Code C++ : 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 class Camera { public: Camera(); void moveSurRight(float); //deplacement sur _rightVector void moveSurUp(float); //deplacement sur _upVector void moveSurForward(float); //deplacement sur _forwardVector void rotSurRight(float); //rotation autour de _rightVector void rotSurUp(float); //rotation autour de _upVector void rotSurForward(float); //rotation autour de _forwardVector void lookAt(); protected: void setupTargetPoint(); //calcul le point de focus Vector3<float> _forwardVector; Vector3<float> _rightVector; Vector3<float> _upVector; Vector3<float> _cameraPosition; Vector3<float> _targetPoint; //point de focus };
1- Quand on pousse un peut la camera (long déplacement,...), ça déconne; surtout sur la rotation autour de _rightVector, quand on approche de l'angle droit, les rotations sur cette axe sont bloqués et les autres mouvements sont complètements dérèglés.
Code C++ : 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 //on epargne le constructeur void Camera::moveSurRight(float speed) { _cameraPosition += _rightVector*speed; } void Camera::moveSurUp(float speed) { _cameraPosition += _upVector*speed; } void Camera::moveSurForward(float speed) { _cameraPosition += _forwardVector*speed; } void Camera::rotSurRight(float angle) { Matrix4 transfMatrix; transfMatrix.setRotation(_rightVector,angle); _upVector=transformVector3<float>(_upVector,transfMatrix); _forwardVector=transformVector3<float>(_forwardVector,transfMatrix); } void Camera::rotSurUp(float angle) { Matrix4 transfMatrix; transfMatrix.setRotation(_upVector,angle); _rightVector=transformVector3<float>(_rightVector,transfMatrix); _forwardVector=transformVector3<float>(_forwardVector,transfMatrix); } void Camera::rotSurForward(float angle) { Matrix4 transfMatrix; transfMatrix.setRotation(_forwardVector,angle); _rightVector=transformVector3<float>(_rightVector,transfMatrix); _upVector=transformVector3<float>(_upVector,transfMatrix); } void Camera::setupTargetPoint() { _targetPoint = _cameraPosition + _forwardVector; } void Camera::lookAt() { setupTargetPoint(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(_cameraPosition._x,_cameraPosition._y,_cameraPosition._z ,_targetPoint._x,_targetPoint._y,_targetPoint._z,0,1,0); }
Est-ce à cause des nombres flottants ou c'est moi qui n'a vraiment rien compris à la géométrie dans l'espace?
2- Est-ce une bonne façon d'implémenter une camera? Sinon, comment dois-je m'y prendre?
Bon, j'enfile mon casque, je met un plastron, quelques abdos, allez-y, ne retenez pas vos coups, je suis prêt.
Partager